Make field decoders return false for unsupported pointer fields.
git-svn-id: https://svn.kapsi.fi/jpa/nanopb-dev@1082 e3a754e5-d11d-0410-8d38-ebb782a927b9
This commit is contained in:
committed by
Petteri Aimonen
parent
c66c6b43c4
commit
f7c8dd81d4
18
pb_decode.c
18
pb_decode.c
@@ -590,9 +590,9 @@ bool checkreturn pb_dec_bytes(pb_istream_t *stream, const pb_field_t *field, voi
|
|||||||
if (x->size > field->data_size)
|
if (x->size > field->data_size)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
#ifdef MALLOC_HEADER
|
|
||||||
if (PB_POINTER(field->type))
|
if (PB_POINTER(field->type))
|
||||||
{
|
{
|
||||||
|
#ifdef MALLOC_HEADER
|
||||||
pb_bytes_t *x2 = (pb_bytes_t*)dest;
|
pb_bytes_t *x2 = (pb_bytes_t*)dest;
|
||||||
|
|
||||||
if (x2->alloced < x2->size)
|
if (x2->alloced < x2->size)
|
||||||
@@ -605,8 +605,10 @@ bool checkreturn pb_dec_bytes(pb_istream_t *stream, const pb_field_t *field, voi
|
|||||||
}
|
}
|
||||||
|
|
||||||
return pb_read(stream, x2->bytes, x2->size);
|
return pb_read(stream, x2->bytes, x2->size);
|
||||||
}
|
#else
|
||||||
|
return false;
|
||||||
#endif
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
return pb_read(stream, x->bytes, x->size);
|
return pb_read(stream, x->bytes, x->size);
|
||||||
}
|
}
|
||||||
@@ -621,17 +623,19 @@ bool checkreturn pb_dec_string(pb_istream_t *stream, const pb_field_t *field, vo
|
|||||||
if (size > field->data_size - 1)
|
if (size > field->data_size - 1)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
#ifdef MALLOC_HEADER
|
|
||||||
if (PB_POINTER(field->type))
|
if (PB_POINTER(field->type))
|
||||||
{
|
{
|
||||||
|
#ifdef MALLOC_HEADER
|
||||||
uint8_t *string = (uint8_t*)realloc(*(uint8_t**)dest, size + 1);
|
uint8_t *string = (uint8_t*)realloc(*(uint8_t**)dest, size + 1);
|
||||||
if (!string)
|
if (!string)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
*(uint8_t**)dest = string;
|
*(uint8_t**)dest = string;
|
||||||
dest = string;
|
dest = string;
|
||||||
}
|
#else
|
||||||
|
return false;
|
||||||
#endif
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
status = pb_read(stream, (uint8_t*)dest, size);
|
status = pb_read(stream, (uint8_t*)dest, size);
|
||||||
*((uint8_t*)dest + size) = 0;
|
*((uint8_t*)dest + size) = 0;
|
||||||
@@ -652,9 +656,9 @@ bool checkreturn pb_dec_submessage(pb_istream_t *stream, const pb_field_t *field
|
|||||||
|
|
||||||
msg = (const pb_message_t*)field->ptr;
|
msg = (const pb_message_t*)field->ptr;
|
||||||
|
|
||||||
#ifdef MALLOC_HEADER
|
|
||||||
if (PB_POINTER(field->type))
|
if (PB_POINTER(field->type))
|
||||||
{
|
{
|
||||||
|
#ifdef MALLOC_HEADER
|
||||||
if (*(void**)dest == NULL)
|
if (*(void**)dest == NULL)
|
||||||
{
|
{
|
||||||
void *object = malloc(msg->size);
|
void *object = malloc(msg->size);
|
||||||
@@ -665,8 +669,10 @@ bool checkreturn pb_dec_submessage(pb_istream_t *stream, const pb_field_t *field
|
|||||||
} else {
|
} else {
|
||||||
dest = *(void**)dest;
|
dest = *(void**)dest;
|
||||||
}
|
}
|
||||||
}
|
#else
|
||||||
|
return false;
|
||||||
#endif
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
status = pb_decode(&substream, msg, dest);
|
status = pb_decode(&substream, msg, dest);
|
||||||
stream->state = substream.state;
|
stream->state = substream.state;
|
||||||
|
|||||||
@@ -279,7 +279,6 @@ int main()
|
|||||||
TEST((s = S("\x08"), !pb_decode(&s, IntegerArray_msg, &dest)))
|
TEST((s = S("\x08"), !pb_decode(&s, IntegerArray_msg, &dest)))
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef MALLOC_HEADER
|
|
||||||
{
|
{
|
||||||
pb_istream_t s;
|
pb_istream_t s;
|
||||||
PointerContainer dest;
|
PointerContainer dest;
|
||||||
@@ -287,6 +286,7 @@ int main()
|
|||||||
COMMENT("Testing pb_decode with pointer fields")
|
COMMENT("Testing pb_decode with pointer fields")
|
||||||
|
|
||||||
memset(&dest, 0, sizeof(dest));
|
memset(&dest, 0, sizeof(dest));
|
||||||
|
#ifdef MALLOC_HEADER
|
||||||
TEST((s = S("\x0A\x01\x61\x12\x01\x62\x2A\x01\x65\x32\x01\x66\x3A\x00"
|
TEST((s = S("\x0A\x01\x61\x12\x01\x62\x2A\x01\x65\x32\x01\x66\x3A\x00"
|
||||||
"\x42\x01\x63\x4A\x01\x64"),
|
"\x42\x01\x63\x4A\x01\x64"),
|
||||||
pb_decode(&s, PointerContainer_msg, &dest)))
|
pb_decode(&s, PointerContainer_msg, &dest)))
|
||||||
@@ -300,8 +300,12 @@ int main()
|
|||||||
TEST(0 == strcmp(dest.otext, "c"))
|
TEST(0 == strcmp(dest.otext, "c"))
|
||||||
TEST(dest.oblob.size == 1 && dest.oblob.bytes[0] == 'd')
|
TEST(dest.oblob.size == 1 && dest.oblob.bytes[0] == 'd')
|
||||||
TEST(pb_clean(PointerContainer_msg, &dest));
|
TEST(pb_clean(PointerContainer_msg, &dest));
|
||||||
}
|
#else
|
||||||
|
TEST((s = S("\x0A\x01\x61\x12\x01\x62\x2A\x01\x65\x32\x01\x66\x3A\x00"
|
||||||
|
"\x42\x01\x63\x4A\x01\x64"),
|
||||||
|
!pb_decode(&s, PointerContainer_msg, &dest)))
|
||||||
#endif
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
if (status != 0)
|
if (status != 0)
|
||||||
fprintf(stdout, "\n\nSome tests FAILED!\n");
|
fprintf(stdout, "\n\nSome tests FAILED!\n");
|
||||||
|
|||||||
Reference in New Issue
Block a user