@@ -313,42 +313,47 @@ int asn1_ber_decoder(const struct asn1_decoder *decoder,
313
313
314
314
/* Decide how to handle the operation */
315
315
switch (op ) {
316
- case ASN1_OP_MATCH_ANY_ACT :
317
- case ASN1_OP_MATCH_ANY_ACT_OR_SKIP :
318
- case ASN1_OP_COND_MATCH_ANY_ACT :
319
- case ASN1_OP_COND_MATCH_ANY_ACT_OR_SKIP :
320
- ret = actions [machine [pc + 1 ]](context , hdr , tag , data + dp , len );
321
- if (ret < 0 )
322
- return ret ;
323
- goto skip_data ;
324
-
325
- case ASN1_OP_MATCH_ACT :
326
- case ASN1_OP_MATCH_ACT_OR_SKIP :
327
- case ASN1_OP_COND_MATCH_ACT_OR_SKIP :
328
- ret = actions [machine [pc + 2 ]](context , hdr , tag , data + dp , len );
329
- if (ret < 0 )
330
- return ret ;
331
- goto skip_data ;
332
-
333
316
case ASN1_OP_MATCH :
334
317
case ASN1_OP_MATCH_OR_SKIP :
318
+ case ASN1_OP_MATCH_ACT :
319
+ case ASN1_OP_MATCH_ACT_OR_SKIP :
335
320
case ASN1_OP_MATCH_ANY :
336
321
case ASN1_OP_MATCH_ANY_OR_SKIP :
322
+ case ASN1_OP_MATCH_ANY_ACT :
323
+ case ASN1_OP_MATCH_ANY_ACT_OR_SKIP :
337
324
case ASN1_OP_COND_MATCH_OR_SKIP :
325
+ case ASN1_OP_COND_MATCH_ACT_OR_SKIP :
338
326
case ASN1_OP_COND_MATCH_ANY :
339
327
case ASN1_OP_COND_MATCH_ANY_OR_SKIP :
340
- skip_data :
328
+ case ASN1_OP_COND_MATCH_ANY_ACT :
329
+ case ASN1_OP_COND_MATCH_ANY_ACT_OR_SKIP :
330
+
341
331
if (!(flags & FLAG_CONS )) {
342
332
if (flags & FLAG_INDEFINITE_LENGTH ) {
333
+ size_t tmp = dp ;
334
+
343
335
ret = asn1_find_indefinite_length (
344
- data , datalen , & dp , & len , & errmsg );
336
+ data , datalen , & tmp , & len , & errmsg );
345
337
if (ret < 0 )
346
338
goto error ;
347
- } else {
348
- dp += len ;
349
339
}
350
340
pr_debug ("- LEAF: %zu\n" , len );
351
341
}
342
+
343
+ if (op & ASN1_OP_MATCH__ACT ) {
344
+ unsigned char act ;
345
+
346
+ if (op & ASN1_OP_MATCH__ANY )
347
+ act = machine [pc + 1 ];
348
+ else
349
+ act = machine [pc + 2 ];
350
+ ret = actions [act ](context , hdr , tag , data + dp , len );
351
+ if (ret < 0 )
352
+ return ret ;
353
+ }
354
+
355
+ if (!(flags & FLAG_CONS ))
356
+ dp += len ;
352
357
pc += asn1_op_lengths [op ];
353
358
goto next_op ;
354
359
@@ -434,6 +439,8 @@ int asn1_ber_decoder(const struct asn1_decoder *decoder,
434
439
else
435
440
act = machine [pc + 1 ];
436
441
ret = actions [act ](context , hdr , 0 , data + tdp , len );
442
+ if (ret < 0 )
443
+ return ret ;
437
444
}
438
445
pc += asn1_op_lengths [op ];
439
446
goto next_op ;
0 commit comments