summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPetteri Aimonen <jpa@git.mail.kapsi.fi>2013-04-14 09:26:42 +0300
committerPetteri Aimonen <jpa@git.mail.kapsi.fi>2013-04-14 09:26:42 +0300
commit9939910833a9289b5913eff29f951195e7bc61c6 (patch)
tree3455554408cbfec6503f92935732201571c7311f
parent6a022985845a0a50b32b7c1fb22f9aee1f675825 (diff)
Fix bug with empty strings in repeated string callbacks.
Fix suggested by Henrik Carlgren. Added also unit test for the bug. Update issue 73 Status: FixedInGit
-rw-r--r--pb_decode.c4
-rw-r--r--tests/callbacks.proto1
-rw-r--r--tests/test_decode_callbacks.c2
-rw-r--r--tests/test_encode_callbacks.c18
4 files changed, 23 insertions, 2 deletions
diff --git a/pb_decode.c b/pb_decode.c
index 7eda89a4..d0e18ccb 100644
--- a/pb_decode.c
+++ b/pb_decode.c
@@ -430,11 +430,11 @@ static bool checkreturn decode_callback_field(pb_istream_t *stream, pb_wire_type
if (!pb_make_string_substream(stream, &substream))
return false;
- while (substream.bytes_left)
+ do
{
if (!pCallback->funcs.decode(&substream, iter->pos, arg))
PB_RETURN_ERROR(stream, "callback failed");
- }
+ } while (substream.bytes_left);
pb_close_string_substream(stream, &substream);
return true;
diff --git a/tests/callbacks.proto b/tests/callbacks.proto
index 8beeaabf..ccd1edd8 100644
--- a/tests/callbacks.proto
+++ b/tests/callbacks.proto
@@ -11,5 +11,6 @@ message TestMessage {
repeated fixed32 fixed32value = 3;
repeated fixed64 fixed64value = 4;
optional SubMessage submsg = 5;
+ repeated string repeatedstring = 6;
}
diff --git a/tests/test_decode_callbacks.c b/tests/test_decode_callbacks.c
index 7ce4ec0b..b5056923 100644
--- a/tests/test_decode_callbacks.c
+++ b/tests/test_decode_callbacks.c
@@ -83,6 +83,8 @@ int main()
testmessage.fixed32value.arg = "fixed32value: %ld\n";
testmessage.fixed64value.funcs.decode = &print_fixed64;
testmessage.fixed64value.arg = "fixed64value: %lld\n";
+ testmessage.repeatedstring.funcs.decode = &print_string;
+ testmessage.repeatedstring.arg = "repeatedstring: \"%s\"\n";
if (!pb_decode(&stream, TestMessage_fields, &testmessage))
return 1;
diff --git a/tests/test_encode_callbacks.c b/tests/test_encode_callbacks.c
index afab48e8..3bb6a45e 100644
--- a/tests/test_encode_callbacks.c
+++ b/tests/test_encode_callbacks.c
@@ -41,6 +41,22 @@ bool encode_fixed64(pb_ostream_t *stream, const pb_field_t *field, void * const
return pb_encode_fixed64(stream, &value);
}
+bool encode_repeatedstring(pb_ostream_t *stream, const pb_field_t *field, void * const *arg)
+{
+ char *str[4] = {"Hello world!", "", "Test", "Test2"};
+ int i;
+
+ for (i = 0; i < 4; i++)
+ {
+ if (!pb_encode_tag_for_field(stream, field))
+ return false;
+
+ if (!pb_encode_string(stream, (uint8_t*)str[i], strlen(str[i])))
+ return false;
+ }
+ return true;
+}
+
int main()
{
uint8_t buffer[1024];
@@ -57,6 +73,8 @@ int main()
testmessage.submsg.int32value.funcs.encode = &encode_int32;
testmessage.submsg.fixed32value.funcs.encode = &encode_fixed32;
testmessage.submsg.fixed64value.funcs.encode = &encode_fixed64;
+
+ testmessage.repeatedstring.funcs.encode = &encode_repeatedstring;
if (!pb_encode(&stream, TestMessage_fields, &testmessage))
return 1;