From aed43c8bccade5c73c9ebc8e3aa258e41a345495 Mon Sep 17 00:00:00 2001 From: Lev Walkin <vlm@lionet.info> Date: Tue, 4 Sep 2012 14:56:27 -0700 Subject: [PATCH] fix parsing for OID and RELATIVE-OID --- asn1c/tests/data-70/data-70-55.in | 5 +++++ asn1c/tests/data-70/data-70-56.in | 5 +++++ asn1c/tests/data-70/data-70-57-D.in | 5 +++++ asn1c/tests/data-70/data-70-58-D.in | 5 +++++ asn1c/tests/data-70/data-70-59-D.in | 5 +++++ asn1c/tests/data-70/data-70-60-D.in | 5 +++++ asn1c/tests/data-70/data-70-61-D.in | 5 +++++ asn1c/tests/data-70/data-70-62-D.in | 9 +++++++++ skeletons/OBJECT_IDENTIFIER.c | 23 ++++++++++++----------- skeletons/RELATIVE-OID.c | 10 ++++------ 10 files changed, 60 insertions(+), 17 deletions(-) create mode 100644 asn1c/tests/data-70/data-70-55.in create mode 100644 asn1c/tests/data-70/data-70-56.in create mode 100644 asn1c/tests/data-70/data-70-57-D.in create mode 100644 asn1c/tests/data-70/data-70-58-D.in create mode 100644 asn1c/tests/data-70/data-70-59-D.in create mode 100644 asn1c/tests/data-70/data-70-60-D.in create mode 100644 asn1c/tests/data-70/data-70-61-D.in create mode 100644 asn1c/tests/data-70/data-70-62-D.in 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 00000000..7be4ca5b --- /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 00000000..7a7ba071 --- /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 00000000..74da9b90 --- /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 00000000..252345d2 --- /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 00000000..2d989d24 --- /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 00000000..11be5d73 --- /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 00000000..5c47c9fc --- /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 00000000..cb790d28 --- /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 c1f58843..2939f25a 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 983fc094..4275c0ab 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)); -- GitLab