summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--pb_decode.c9
-rw-r--r--tests/decode_unittests.c12
2 files changed, 15 insertions, 6 deletions
diff --git a/pb_decode.c b/pb_decode.c
index 0e55cbfb..6c6b1d9e 100644
--- a/pb_decode.c
+++ b/pb_decode.c
@@ -337,17 +337,14 @@ bool checkreturn pb_decode(pb_istream_t *stream, const pb_field_t fields[], void
pb_field_iterator_t iter;
int i;
- if (fields[0].tag == 0)
- {
- /* No fields -> nothing to do */
- return pb_read(stream, NULL, stream->bytes_left);
- }
-
pb_field_init(&iter, fields, dest_struct);
/* Initialize size/has fields and apply default values */
do
{
+ if (iter.current->tag == 0)
+ continue;
+
if (PB_HTYPE(iter.current->type) == PB_HTYPE_OPTIONAL)
{
*(bool*)iter.pSize = false;
diff --git a/tests/decode_unittests.c b/tests/decode_unittests.c
index 85dd8d58..6f2b77e5 100644
--- a/tests/decode_unittests.c
+++ b/tests/decode_unittests.c
@@ -282,6 +282,18 @@ int main()
TEST((s = S("\x08\x55"), !pb_decode(&s, CallbackArray_fields, &dest)))
}
+ {
+ pb_istream_t s;
+ IntegerArray dest;
+
+ COMMENT("Testing pb_decode message termination")
+ TEST((s = S(""), pb_decode(&s, IntegerArray_fields, &dest)))
+ TEST((s = S("\x00"), pb_decode(&s, IntegerArray_fields, &dest)))
+ TEST((s = S("\x08\x01"), pb_decode(&s, IntegerArray_fields, &dest)))
+ TEST((s = S("\x08\x01\x00"), pb_decode(&s, IntegerArray_fields, &dest)))
+ TEST((s = S("\x08"), !pb_decode(&s, IntegerArray_fields, &dest)))
+ }
+
if (status != 0)
fprintf(stdout, "\n\nSome tests FAILED!\n");