Handle unterminated strings when encoding.

If the null terminator is not present, string will be limited to the
data size of the field.

If you are still using the pb_enc_string (deprecated since 0.1.3) from
callbacks, now would be an excellent time to stop. The pb_field_t for
the callback will not contain proper data_size. Use pb_encode_string()
instead.

Update issue 68
Status: FixedInGit
This commit is contained in:
Petteri Aimonen
2013-04-14 09:46:39 +03:00
parent 9939910833
commit d2063ff0b6
3 changed files with 19 additions and 5 deletions

View File

@@ -461,8 +461,16 @@ bool checkreturn pb_enc_bytes(pb_ostream_t *stream, const pb_field_t *field, con
bool checkreturn pb_enc_string(pb_ostream_t *stream, const pb_field_t *field, const void *src)
{
UNUSED(field);
return pb_encode_string(stream, (const uint8_t*)src, strlen((const char*)src));
/* strnlen() is not always available, so just use a for-loop */
size_t size = 0;
const char *p = (const char*)src;
while (size < field->data_size && *p != '\0')
{
size++;
p++;
}
return pb_encode_string(stream, (const uint8_t*)src, size);
}
bool checkreturn pb_enc_submessage(pb_ostream_t *stream, const pb_field_t *field, const void *src)

View File

@@ -180,12 +180,14 @@ int main()
{
uint8_t buffer[30];
pb_ostream_t s;
char value[] = "xyzzy";
char value[30] = "xyzzy";
COMMENT("Test pb_enc_string")
TEST(WRITES(pb_enc_string(&s, NULL, &value), "\x05xyzzy"))
TEST(WRITES(pb_enc_string(&s, &StringMessage_fields[0], &value), "\x05xyzzy"))
value[0] = '\0';
TEST(WRITES(pb_enc_string(&s, NULL, &value), "\x00"))
TEST(WRITES(pb_enc_string(&s, &StringMessage_fields[0], &value), "\x00"))
memset(value, 'x', 30);
TEST(WRITES(pb_enc_string(&s, &StringMessage_fields[0], &value), "\x0Axxxxxxxxxx"))
}
{

View File

@@ -8,6 +8,10 @@ message FloatArray {
repeated float data = 1 [(nanopb).max_count = 10];
}
message StringMessage {
required string data = 1 [(nanopb).max_size = 10];
}
message CallbackArray {
// We cheat a bit and use this message for testing other types, too.
// Nanopb does not care about the actual defined data type for callback