diff options
-rw-r--r-- | include/linux/asn1_ber_bytecode.h | 17 | ||||
-rw-r--r-- | lib/asn1_decoder.c | 8 | ||||
-rw-r--r-- | scripts/asn1_compiler.c | 3 |
3 files changed, 21 insertions, 7 deletions
diff --git a/include/linux/asn1_ber_bytecode.h b/include/linux/asn1_ber_bytecode.h index 27f35780aecf..ab3a6c002f7b 100644 --- a/include/linux/asn1_ber_bytecode.h +++ b/include/linux/asn1_ber_bytecode.h | |||
@@ -45,24 +45,27 @@ enum asn1_opcode { | |||
45 | ASN1_OP_MATCH_JUMP = 0x04, | 45 | ASN1_OP_MATCH_JUMP = 0x04, |
46 | ASN1_OP_MATCH_JUMP_OR_SKIP = 0x05, | 46 | ASN1_OP_MATCH_JUMP_OR_SKIP = 0x05, |
47 | ASN1_OP_MATCH_ANY = 0x08, | 47 | ASN1_OP_MATCH_ANY = 0x08, |
48 | ASN1_OP_MATCH_ANY_OR_SKIP = 0x09, | ||
48 | ASN1_OP_MATCH_ANY_ACT = 0x0a, | 49 | ASN1_OP_MATCH_ANY_ACT = 0x0a, |
50 | ASN1_OP_MATCH_ANY_ACT_OR_SKIP = 0x0b, | ||
49 | /* Everything before here matches unconditionally */ | 51 | /* Everything before here matches unconditionally */ |
50 | 52 | ||
51 | ASN1_OP_COND_MATCH_OR_SKIP = 0x11, | 53 | ASN1_OP_COND_MATCH_OR_SKIP = 0x11, |
52 | ASN1_OP_COND_MATCH_ACT_OR_SKIP = 0x13, | 54 | ASN1_OP_COND_MATCH_ACT_OR_SKIP = 0x13, |
53 | ASN1_OP_COND_MATCH_JUMP_OR_SKIP = 0x15, | 55 | ASN1_OP_COND_MATCH_JUMP_OR_SKIP = 0x15, |
54 | ASN1_OP_COND_MATCH_ANY = 0x18, | 56 | ASN1_OP_COND_MATCH_ANY = 0x18, |
57 | ASN1_OP_COND_MATCH_ANY_OR_SKIP = 0x19, | ||
55 | ASN1_OP_COND_MATCH_ANY_ACT = 0x1a, | 58 | ASN1_OP_COND_MATCH_ANY_ACT = 0x1a, |
59 | ASN1_OP_COND_MATCH_ANY_ACT_OR_SKIP = 0x1b, | ||
56 | 60 | ||
57 | /* Everything before here will want a tag from the data */ | 61 | /* Everything before here will want a tag from the data */ |
58 | #define ASN1_OP__MATCHES_TAG ASN1_OP_COND_MATCH_ANY_ACT | 62 | #define ASN1_OP__MATCHES_TAG ASN1_OP_COND_MATCH_ANY_ACT_OR_SKIP |
59 | 63 | ||
60 | /* These are here to help fill up space */ | 64 | /* These are here to help fill up space */ |
61 | ASN1_OP_COND_FAIL = 0x1b, | 65 | ASN1_OP_COND_FAIL = 0x1c, |
62 | ASN1_OP_COMPLETE = 0x1c, | 66 | ASN1_OP_COMPLETE = 0x1d, |
63 | ASN1_OP_ACT = 0x1d, | 67 | ASN1_OP_ACT = 0x1e, |
64 | ASN1_OP_MAYBE_ACT = 0x1e, | 68 | ASN1_OP_MAYBE_ACT = 0x1f, |
65 | ASN1_OP_RETURN = 0x1f, | ||
66 | 69 | ||
67 | /* The following eight have bit 0 -> SET, 1 -> OF, 2 -> ACT */ | 70 | /* The following eight have bit 0 -> SET, 1 -> OF, 2 -> ACT */ |
68 | ASN1_OP_END_SEQ = 0x20, | 71 | ASN1_OP_END_SEQ = 0x20, |
@@ -77,6 +80,8 @@ enum asn1_opcode { | |||
77 | #define ASN1_OP_END__OF 0x02 | 80 | #define ASN1_OP_END__OF 0x02 |
78 | #define ASN1_OP_END__ACT 0x04 | 81 | #define ASN1_OP_END__ACT 0x04 |
79 | 82 | ||
83 | ASN1_OP_RETURN = 0x28, | ||
84 | |||
80 | ASN1_OP__NR | 85 | ASN1_OP__NR |
81 | }; | 86 | }; |
82 | 87 | ||
diff --git a/lib/asn1_decoder.c b/lib/asn1_decoder.c index 3f74dd3e2910..2b3f46c049d4 100644 --- a/lib/asn1_decoder.c +++ b/lib/asn1_decoder.c | |||
@@ -24,12 +24,16 @@ static const unsigned char asn1_op_lengths[ASN1_OP__NR] = { | |||
24 | [ASN1_OP_MATCH_JUMP] = 1 + 1 + 1, | 24 | [ASN1_OP_MATCH_JUMP] = 1 + 1 + 1, |
25 | [ASN1_OP_MATCH_JUMP_OR_SKIP] = 1 + 1 + 1, | 25 | [ASN1_OP_MATCH_JUMP_OR_SKIP] = 1 + 1 + 1, |
26 | [ASN1_OP_MATCH_ANY] = 1, | 26 | [ASN1_OP_MATCH_ANY] = 1, |
27 | [ASN1_OP_MATCH_ANY_OR_SKIP] = 1, | ||
27 | [ASN1_OP_MATCH_ANY_ACT] = 1 + 1, | 28 | [ASN1_OP_MATCH_ANY_ACT] = 1 + 1, |
29 | [ASN1_OP_MATCH_ANY_ACT_OR_SKIP] = 1 + 1, | ||
28 | [ASN1_OP_COND_MATCH_OR_SKIP] = 1 + 1, | 30 | [ASN1_OP_COND_MATCH_OR_SKIP] = 1 + 1, |
29 | [ASN1_OP_COND_MATCH_ACT_OR_SKIP] = 1 + 1 + 1, | 31 | [ASN1_OP_COND_MATCH_ACT_OR_SKIP] = 1 + 1 + 1, |
30 | [ASN1_OP_COND_MATCH_JUMP_OR_SKIP] = 1 + 1 + 1, | 32 | [ASN1_OP_COND_MATCH_JUMP_OR_SKIP] = 1 + 1 + 1, |
31 | [ASN1_OP_COND_MATCH_ANY] = 1, | 33 | [ASN1_OP_COND_MATCH_ANY] = 1, |
34 | [ASN1_OP_COND_MATCH_ANY_OR_SKIP] = 1, | ||
32 | [ASN1_OP_COND_MATCH_ANY_ACT] = 1 + 1, | 35 | [ASN1_OP_COND_MATCH_ANY_ACT] = 1 + 1, |
36 | [ASN1_OP_COND_MATCH_ANY_ACT_OR_SKIP] = 1 + 1, | ||
33 | [ASN1_OP_COND_FAIL] = 1, | 37 | [ASN1_OP_COND_FAIL] = 1, |
34 | [ASN1_OP_COMPLETE] = 1, | 38 | [ASN1_OP_COMPLETE] = 1, |
35 | [ASN1_OP_ACT] = 1 + 1, | 39 | [ASN1_OP_ACT] = 1 + 1, |
@@ -304,7 +308,9 @@ next_op: | |||
304 | /* Decide how to handle the operation */ | 308 | /* Decide how to handle the operation */ |
305 | switch (op) { | 309 | switch (op) { |
306 | case ASN1_OP_MATCH_ANY_ACT: | 310 | case ASN1_OP_MATCH_ANY_ACT: |
311 | case ASN1_OP_MATCH_ANY_ACT_OR_SKIP: | ||
307 | case ASN1_OP_COND_MATCH_ANY_ACT: | 312 | case ASN1_OP_COND_MATCH_ANY_ACT: |
313 | case ASN1_OP_COND_MATCH_ANY_ACT_OR_SKIP: | ||
308 | ret = actions[machine[pc + 1]](context, hdr, tag, data + dp, len); | 314 | ret = actions[machine[pc + 1]](context, hdr, tag, data + dp, len); |
309 | if (ret < 0) | 315 | if (ret < 0) |
310 | return ret; | 316 | return ret; |
@@ -321,8 +327,10 @@ next_op: | |||
321 | case ASN1_OP_MATCH: | 327 | case ASN1_OP_MATCH: |
322 | case ASN1_OP_MATCH_OR_SKIP: | 328 | case ASN1_OP_MATCH_OR_SKIP: |
323 | case ASN1_OP_MATCH_ANY: | 329 | case ASN1_OP_MATCH_ANY: |
330 | case ASN1_OP_MATCH_ANY_OR_SKIP: | ||
324 | case ASN1_OP_COND_MATCH_OR_SKIP: | 331 | case ASN1_OP_COND_MATCH_OR_SKIP: |
325 | case ASN1_OP_COND_MATCH_ANY: | 332 | case ASN1_OP_COND_MATCH_ANY: |
333 | case ASN1_OP_COND_MATCH_ANY_OR_SKIP: | ||
326 | skip_data: | 334 | skip_data: |
327 | if (!(flags & FLAG_CONS)) { | 335 | if (!(flags & FLAG_CONS)) { |
328 | if (flags & FLAG_INDEFINITE_LENGTH) { | 336 | if (flags & FLAG_INDEFINITE_LENGTH) { |
diff --git a/scripts/asn1_compiler.c b/scripts/asn1_compiler.c index 0515bced929a..1c75e22b6385 100644 --- a/scripts/asn1_compiler.c +++ b/scripts/asn1_compiler.c | |||
@@ -1401,7 +1401,8 @@ static void render_element(FILE *out, struct element *e, struct element *tag) | |||
1401 | act = e->action ? "_ACT" : ""; | 1401 | act = e->action ? "_ACT" : ""; |
1402 | switch (e->compound) { | 1402 | switch (e->compound) { |
1403 | case ANY: | 1403 | case ANY: |
1404 | render_opcode(out, "ASN1_OP_%sMATCH_ANY%s,", cond, act); | 1404 | render_opcode(out, "ASN1_OP_%sMATCH_ANY%s%s,", |
1405 | cond, act, skippable ? "_OR_SKIP" : ""); | ||
1405 | if (e->name) | 1406 | if (e->name) |
1406 | render_more(out, "\t\t// %*.*s", | 1407 | render_more(out, "\t\t// %*.*s", |
1407 | (int)e->name->size, (int)e->name->size, | 1408 | (int)e->name->size, (int)e->name->size, |