diff --git a/asn1c/tests/data-70/data-70-55.in b/asn1c/tests/data-70/data-70-55.in new file mode 100644 index 0000000000000000000000000000000000000000..7be4ca5b9902732370715d8a8ab4142a65039a70 --- /dev/null +++ b/asn1c/tests/data-70/data-70-55.in @@ -0,0 +1,5 @@ +<PDU> + <set> + <roid>123.456.789.101112</roid> + </set> +</PDU> diff --git a/asn1c/tests/data-70/data-70-56.in b/asn1c/tests/data-70/data-70-56.in new file mode 100644 index 0000000000000000000000000000000000000000..7a7ba071f6ff915e3be9826c40d36780f55488a5 --- /dev/null +++ b/asn1c/tests/data-70/data-70-56.in @@ -0,0 +1,5 @@ +<PDU> + <set> + <roid> 123.456.789.101112 </roid> + </set> +</PDU> diff --git a/asn1c/tests/data-70/data-70-57-D.in b/asn1c/tests/data-70/data-70-57-D.in new file mode 100644 index 0000000000000000000000000000000000000000..74da9b90a8bf2ae167c380361dea6e80c848749c --- /dev/null +++ b/asn1c/tests/data-70/data-70-57-D.in @@ -0,0 +1,5 @@ +<PDU> + <set> + <roid> <!--/--> 123.456.789.101112</roid> + </set> +</PDU> diff --git a/asn1c/tests/data-70/data-70-58-D.in b/asn1c/tests/data-70/data-70-58-D.in new file mode 100644 index 0000000000000000000000000000000000000000..252345d21a3963567c342b6e9e22b0c2220f143d --- /dev/null +++ b/asn1c/tests/data-70/data-70-58-D.in @@ -0,0 +1,5 @@ +<PDU> + <set> + <roid>123.456.789.101112<!--/--></roid> + </set> +</PDU> diff --git a/asn1c/tests/data-70/data-70-59-D.in b/asn1c/tests/data-70/data-70-59-D.in new file mode 100644 index 0000000000000000000000000000000000000000..2d989d24ec4cdf90478fc07e6ca4e29ef1176e32 --- /dev/null +++ b/asn1c/tests/data-70/data-70-59-D.in @@ -0,0 +1,5 @@ +<PDU> + <set> + <roid>123.456.789.101112<!--/--> </roid> + </set> +</PDU> diff --git a/asn1c/tests/data-70/data-70-60-D.in b/asn1c/tests/data-70/data-70-60-D.in new file mode 100644 index 0000000000000000000000000000000000000000..11be5d7393589c3f48d086416fe0ceb8f4d172e9 --- /dev/null +++ b/asn1c/tests/data-70/data-70-60-D.in @@ -0,0 +1,5 @@ +<PDU> + <set> + <roid>123.456.789.101112 <!--/--></roid> + </set> +</PDU> diff --git a/asn1c/tests/data-70/data-70-61-D.in b/asn1c/tests/data-70/data-70-61-D.in new file mode 100644 index 0000000000000000000000000000000000000000..5c47c9fcfe9efe8330a95341912b18a43d97356b --- /dev/null +++ b/asn1c/tests/data-70/data-70-61-D.in @@ -0,0 +1,5 @@ +<PDU> + <set> + <roid>123.456.789.101112 <!--/--> </roid> + </set> +</PDU> diff --git a/asn1c/tests/data-70/data-70-62-D.in b/asn1c/tests/data-70/data-70-62-D.in new file mode 100644 index 0000000000000000000000000000000000000000..cb790d28c720a4eee2c070862432a4e6f7ee055f --- /dev/null +++ b/asn1c/tests/data-70/data-70-62-D.in @@ -0,0 +1,9 @@ +<PDU> + <set> + <roid> + <!-- This is a special comment --> + 123.456.789.101112 + <!-- This is a special comment too --> + </roid> + </set> +</PDU> diff --git a/skeletons/OBJECT_IDENTIFIER.c b/skeletons/OBJECT_IDENTIFIER.c index c1f58843b56311e440e93a322729d9560b28cbf3..2939f25aafc6c8fa3cb0873f2619ded4ca516570 100644 --- a/skeletons/OBJECT_IDENTIFIER.c +++ b/skeletons/OBJECT_IDENTIFIER.c @@ -282,15 +282,13 @@ OBJECT_IDENTIFIER__xer_body_decode(asn_TYPE_descriptor_t *td, void *sptr, const arcs_count = OBJECT_IDENTIFIER_parse_arcs( (const char *)chunk_buf, chunk_size, arcs, sizeof(s_arcs)/sizeof(s_arcs[0]), &endptr); - if(arcs_count <= 0) { + if(arcs_count < 0) { /* Expecting more than zero arcs */ return XPBD_BROKEN_ENCODING; + } else if(arcs_count == 0) { + return XPBD_NOT_BODY_IGNORE; } - if(endptr < chunk_end) { - /* We have a tail of unrecognized data. Check its safety. */ - if(!xer_is_whitespace(endptr, chunk_end - endptr)) - return XPBD_BROKEN_ENCODING; - } + assert(endptr == chunk_end); if((size_t)arcs_count > sizeof(s_arcs)/sizeof(s_arcs[0])) { arcs = (long *)MALLOC(arcs_count * sizeof(long)); @@ -745,16 +743,19 @@ OBJECT_IDENTIFIER_parse_arcs(const char *oid_text, ssize_t oid_txt_length, /* Finalize last arc */ switch(state) { case ST_LEADSPACE: - case ST_WAITDIGITS: - errno = EINVAL; - return -1; + return 0; /* No OID found in input data */ case ST_DIGITS: _OID_CAPTURE_ARC(value_start, oid_text); - /* Fall through */ + return arcs_count; + case ST_WAITDIGITS: + errno = EINVAL; /* Broken OID */ + return -1; case ST_TAILSPACE: - default: return arcs_count; } + + errno = EINVAL; /* Broken OID */ + return -1; } diff --git a/skeletons/RELATIVE-OID.c b/skeletons/RELATIVE-OID.c index 983fc094d4fdcc6404df566ec22fb1e1934f35c4..4275c0ab0ded491e54db868d91fdec7ed0625d78 100644 --- a/skeletons/RELATIVE-OID.c +++ b/skeletons/RELATIVE-OID.c @@ -106,14 +106,12 @@ RELATIVE_OID__xer_body_decode(asn_TYPE_descriptor_t *td, void *sptr, const void (const char *)chunk_buf, chunk_size, arcs, sizeof(s_arcs)/sizeof(s_arcs[0]), &endptr); if(arcs_count < 0) { - /* Expecting at least zero arcs */ + /* Expecting at least one arc arcs */ return XPBD_BROKEN_ENCODING; + } else if(arcs_count == 0) { + return XPBD_NOT_BODY_IGNORE; } - if(endptr < chunk_end) { - /* We have a tail of unrecognized data. Check its safety. */ - if(!xer_is_whitespace(endptr, chunk_end - endptr)) - return XPBD_BROKEN_ENCODING; - } + assert(endptr == chunk_end); if((size_t)arcs_count > sizeof(s_arcs)/sizeof(s_arcs[0])) { arcs = (long *)MALLOC(arcs_count * sizeof(long));