Fix multiple oneofs in same message (issue #229)
authorPetteri Aimonen <jpa@git.mail.kapsi.fi>
Sat, 31 Dec 2016 08:33:48 +0000 (10:33 +0200)
committerPetteri Aimonen <jpa@git.mail.kapsi.fi>
Sat, 31 Dec 2016 08:42:22 +0000 (10:42 +0200)
commit48f5dd83530a46dd2423277f4488fd4ce9c93b72
tree366642f135defe7d57fe9b88a705d5fe3cce24f4
parent90a19bf0368035147a74b9b8edd65d672a03cd00
Fix multiple oneofs in same message (issue #229)

Previously the field iterator logic didn't know whether two
oneof fields were part of the same union, or separate. This
caused wrong pointers to be calculated if multiple oneofs were
inside a single message.

This commit fixes this by using dataoffset of PB_SIZE_MAX to
indicate union fields after the first field.

Theoretically PB_SIZE_MAX is also a valid value for data offset,
which could cause errors. Adding a compile-time assert for this
is somewhat difficult. However I consider it extremely unlikely
that there is any platform that could trigger this situation, as
it would require 255 bytes of extra data/padding between two protobuf
oneof fields. On 64-bit architectures the worst case is 16 bytes,
and even esoteric platforms only align to 64 bytes or so. Manual
modification of the generated .pb.h file could trigger this, but
even then it would require pretty bad luck to happen.
generator/nanopb_generator.py
pb.h
pb_common.c