diff options
author | Lev Walkin <vlm@lionet.info> | 2013-03-16 07:01:42 -0700 |
---|---|---|
committer | Lev Walkin <vlm@lionet.info> | 2013-03-16 07:01:42 -0700 |
commit | f7982283aea2a07ebf3774b05daa773c4c322731 (patch) | |
tree | 8b6e5117d85f7eda688d75143de6e35456882a1e | |
parent | cad560ae7962310a4073e9e8537dc82c7ad3ed79 (diff) |
fix: There must be no content in self-terminating <NULL/> tag.
-rw-r--r-- | skeletons/BOOLEAN.c | 5 | ||||
-rw-r--r-- | skeletons/NULL.c | 9 | ||||
-rw-r--r-- | skeletons/asn_codecs_prim.c | 9 | ||||
-rw-r--r-- | skeletons/xer_decoder.c | 11 | ||||
-rw-r--r-- | skeletons/xer_decoder.h | 7 |
5 files changed, 23 insertions, 18 deletions
diff --git a/skeletons/BOOLEAN.c b/skeletons/BOOLEAN.c index d0907fbf..1b74ea1c 100644 --- a/skeletons/BOOLEAN.c +++ b/skeletons/BOOLEAN.c @@ -161,10 +161,7 @@ BOOLEAN__xer_body_decode(asn_TYPE_descriptor_t *td, void *sptr, const void *chun } return XPBD_BODY_CONSUMED; } else { - if(xer_is_whitespace(chunk_buf, chunk_size)) - return XPBD_NOT_BODY_IGNORE; - else - return XPBD_BROKEN_ENCODING; + return XPBD_BROKEN_ENCODING; } } diff --git a/skeletons/NULL.c b/skeletons/NULL.c index 6d3316f1..b5c4b7e1 100644 --- a/skeletons/NULL.c +++ b/skeletons/NULL.c @@ -74,10 +74,13 @@ NULL__xer_body_decode(asn_TYPE_descriptor_t *td, void *sptr, const void *chunk_b (void)td; (void)sptr; - if(xer_is_whitespace(chunk_buf, chunk_size)) - return XPBD_BODY_CONSUMED; - else + /* + * There must be no content in self-terminating <NULL/> tag. + */ + if(chunk_size) return XPBD_BROKEN_ENCODING; + else + return XPBD_BODY_CONSUMED; } asn_dec_rval_t diff --git a/skeletons/asn_codecs_prim.c b/skeletons/asn_codecs_prim.c index a609f819..8c7a4e0b 100644 --- a/skeletons/asn_codecs_prim.c +++ b/skeletons/asn_codecs_prim.c @@ -186,9 +186,10 @@ static ssize_t xer_decode__primitive_body(void *key, const void *chunk_buf, size_t chunk_size, int have_more) { struct xdp_arg_s *arg = (struct xdp_arg_s *)key; enum xer_pbd_rval bret; + size_t lead_wsp_size; if(arg->decoded_something) { - if(xer_is_whitespace(chunk_buf, chunk_size)) { + if(xer_whitespace_span(chunk_buf, chunk_size) == chunk_size) { /* * Example: * "<INTEGER>123<!--/--> </INTEGER>" @@ -215,6 +216,10 @@ xer_decode__primitive_body(void *key, const void *chunk_buf, size_t chunk_size, return -1; } + lead_wsp_size = xer_whitespace_span(chunk_buf, chunk_size); + chunk_buf += lead_wsp_size; + chunk_size -= lead_wsp_size; + bret = arg->prim_body_decoder(arg->type_descriptor, arg->struct_key, chunk_buf, chunk_size); switch(bret) { @@ -227,7 +232,7 @@ xer_decode__primitive_body(void *key, const void *chunk_buf, size_t chunk_size, arg->decoded_something = 1; /* Fall through */ case XPBD_NOT_BODY_IGNORE: /* Safe to proceed further */ - return chunk_size; + return lead_wsp_size + chunk_size; } return -1; diff --git a/skeletons/xer_decoder.c b/skeletons/xer_decoder.c index 03cb3975..cb4b5f87 100644 --- a/skeletons/xer_decoder.c +++ b/skeletons/xer_decoder.c @@ -316,8 +316,8 @@ xer_decode_general(asn_codec_ctx_t *opt_codec_ctx, } -int -xer_is_whitespace(const void *chunk_buf, size_t chunk_size) { +size_t +xer_whitespace_span(const void *chunk_buf, size_t chunk_size) { const char *p = (const char *)chunk_buf; const char *pend = p + chunk_size; @@ -330,12 +330,13 @@ xer_is_whitespace(const void *chunk_buf, size_t chunk_size) { * SPACE (32) */ case 0x09: case 0x0a: case 0x0d: case 0x20: - break; + continue; default: - return 0; + break; } + break; } - return 1; /* All whitespace */ + return (p - (const char *)chunk_buf); } /* diff --git a/skeletons/xer_decoder.h b/skeletons/xer_decoder.h index cf0d846f..6988648e 100644 --- a/skeletons/xer_decoder.h +++ b/skeletons/xer_decoder.h @@ -87,12 +87,11 @@ xer_check_tag_e xer_check_tag(const void *buf_ptr, int size, const char *need_tag); /* - * Check whether this buffer consists of entirely XER whitespace characters. + * Get the number of bytes consisting entirely of XER whitespace characters. * RETURN VALUES: - * 1: Whitespace or empty string - * 0: Non-whitespace + * >=0: Number of whitespace characters in the string. */ -int xer_is_whitespace(const void *chunk_buf, size_t chunk_size); +size_t xer_whitespace_span(const void *chunk_buf, size_t chunk_size); /* * Skip the series of anticipated extensions. |