This is an automated email from the ASF dual-hosted git repository. asf-gitbox-commits pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/qpid-proton.git
commit c1c48bcb3c559644969ba48c4cec130894224165 Author: Andrew Stitcher <[email protected]> AuthorDate: Fri Aug 28 00:40:37 2026 -0400 PROTON-2966: Improve the error reporting from pn_decoder_decode --- c/src/core/decoder.c | 38 ++++++++++++++++++++------------------ c/src/core/decoder.h | 1 - 2 files changed, 20 insertions(+), 19 deletions(-) diff --git a/c/src/core/decoder.c b/c/src/core/decoder.c index 64d471fe8..5d03212f2 100644 --- a/c/src/core/decoder.c +++ b/c/src/core/decoder.c @@ -27,23 +27,15 @@ #include <string.h> -static inline pn_error_t *pni_decoder_error(pn_decoder_t *decoder) -{ - if (!decoder->error) decoder->error = pn_error(); - return decoder->error; -} - void pn_decoder_initialize(pn_decoder_t *decoder) { decoder->input = NULL; decoder->size = 0; decoder->position = NULL; - decoder->error = NULL; } void pn_decoder_finalize(pn_decoder_t *decoder) { - pn_error_free(decoder->error); } static inline uint8_t pn_decoder_readf8(pn_decoder_t *decoder) @@ -315,7 +307,7 @@ static int pni_decoder_decode_value(pn_decoder_t *decoder, pn_data_t *data, uint size = pn_decoder_readf32(decoder); break; default: - return PN_ARG_ERR; + return pn_error_format(pn_data_error(data), PN_ARG_ERR, "unrecognized variable-width typecode: %u", code); } if (pn_decoder_remaining(decoder) < size) return PN_UNDERFLOW; @@ -335,7 +327,7 @@ static int pni_decoder_decode_value(pn_decoder_t *decoder, pn_data_t *data, uint err = pn_data_put_symbol(data, bytes); break; default: - return PN_ARG_ERR; + return pn_error_format(pn_data_error(data), PN_ARG_ERR, "unrecognized variable-width typecode: %u", code); } } @@ -362,7 +354,11 @@ static int pni_decoder_decode_value(pn_decoder_t *decoder, pn_data_t *data, uint if (pn_decoder_remaining(decoder) < min_expected_size+1) return PN_UNDERFLOW; size = pn_decoder_readf8(decoder); // size must be at least big enough for count or count+constructor - if (size < min_expected_size) return PN_ARG_ERR; + if (size < min_expected_size) { + return pn_error_format(pn_data_error(data), PN_ARG_ERR, + "%s size %zu too small to hold its own header", + pn_type_name(pn_code2type(code)), size); + } if (pn_decoder_remaining(decoder) < size) return PN_UNDERFLOW; count = pn_decoder_readf8(decoder); break; @@ -375,12 +371,16 @@ static int pni_decoder_decode_value(pn_decoder_t *decoder, pn_data_t *data, uint if (pn_decoder_remaining(decoder) < min_expected_size+4) return PN_UNDERFLOW; size = pn_decoder_readf32(decoder); // size must be at least big enough for count or count+constructor - if (size < min_expected_size) return PN_ARG_ERR; + if (size < min_expected_size) { + return pn_error_format(pn_data_error(data), PN_ARG_ERR, + "%s size %zu too small to hold its own header", + pn_type_name(pn_code2type(code)), size); + } if (pn_decoder_remaining(decoder) < size) return PN_UNDERFLOW; count = pn_decoder_readf32(decoder); break; default: - return PN_ARG_ERR; + return pn_error_format(pn_data_error(data), PN_ARG_ERR, "internal error"); } switch (code) @@ -398,7 +398,9 @@ static int pni_decoder_decode_value(pn_decoder_t *decoder, pn_data_t *data, uint int e = pni_decoder_decode_type(decoder, data, &acode); if (e) return e; pn_type_t type = pn_code2type(acode); - if ((int)type < 0) return (int)type; + if ((int)type < 0) { + return pn_error_format(pn_data_error(data), (int) type, "unrecognized array element typecode: %u", acode); + } for (size_t i = 0; i < count; i++) { e = pni_decoder_decode_value(decoder, data, acode); @@ -420,7 +422,7 @@ static int pni_decoder_decode_value(pn_decoder_t *decoder, pn_data_t *data, uint if (err) return err; break; default: - return PN_ARG_ERR; + return pn_error_format(pn_data_error(data), PN_ARG_ERR, "internal error"); } pn_data_enter(data); for (size_t i = 0; i < count; i++) @@ -433,7 +435,7 @@ static int pni_decoder_decode_value(pn_decoder_t *decoder, pn_data_t *data, uint return 0; } default: - return pn_error_format(pni_decoder_error(decoder), PN_ARG_ERR, "unrecognized typecode: %u", code); + return pn_error_format(pn_data_error(data), PN_ARG_ERR, "unrecognized typecode: %u", code); } return err; @@ -497,7 +499,7 @@ int pni_decoder_single_described(pn_decoder_t *decoder, pn_data_t *data) uint8_t code = *decoder->position++;; if (!pni_allowed_descriptor_code(code)) { - return PN_ARG_ERR; + return pn_error_format(pn_data_error(data), PN_ARG_ERR, "invalid descriptor value typecode: %u", code); } int err = pni_decoder_decode_value(decoder, data, code); @@ -530,7 +532,7 @@ ssize_t pn_decoder_decode(pn_decoder_t *decoder, const char *src, size_t size, p int err = pni_decoder_single(decoder, dst); - if (err == PN_UNDERFLOW) + if (err == PN_UNDERFLOW) return pn_error_format(pn_data_error(dst), PN_UNDERFLOW, "not enough data to decode"); if (err) return err; diff --git a/c/src/core/decoder.h b/c/src/core/decoder.h index 70bc4c8a8..bd870959d 100644 --- a/c/src/core/decoder.h +++ b/c/src/core/decoder.h @@ -26,7 +26,6 @@ typedef struct pn_decoder_t { const char *input; size_t size; const char *position; - pn_error_t *error; } pn_decoder_t; void pn_decoder_initialize(pn_decoder_t *decoder); --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
