[Buildroot] [PATCH 1/1] flatcc: fix gcc8 compilation
Joel Carlson
joelsoncarl at gmail.com
Fri Jun 8 19:21:05 UTC 2018
gcc8 issues errors for uses of strncpy where the NULL terminator may not
be copied. This patches flatcc to fix those instances.
Signed-off-by: Joel Carlson <JoelsonCarl at gmail.com>
---
Upstream is aware of the issue (see [1]), so this patch may get dropped when a
new version of flatcc is released and we bump to it.
[1] https://github.com/dvidelabs/flatcc/pull/86
---
package/flatcc/0001-gcc8-strncpy-errors.patch | 71 +++++++++++++++++++++++++++
1 file changed, 71 insertions(+)
create mode 100644 package/flatcc/0001-gcc8-strncpy-errors.patch
diff --git a/package/flatcc/0001-gcc8-strncpy-errors.patch b/package/flatcc/0001-gcc8-strncpy-errors.patch
new file mode 100644
index 0000000..bf7d35b
--- /dev/null
+++ b/package/flatcc/0001-gcc8-strncpy-errors.patch
@@ -0,0 +1,71 @@
+Fix compilation with gcc8
+
+gcc8 issues errors for uses of strncpy where the NULL terminator may not be
+copied.
+
+Upstream is aware of the issue, and it is possible this patch may be removed
+when the version is bumped in the future.
+
+Signed-off-by: Joel Carlson <JoelsonCarl at gmail.com>
+
+diff --git a/include/flatcc/reflection/flatbuffers_common_reader.h b/include/flatcc/reflection/flatbuffers_common_reader.h
+index faa7a9f..b86ffbc 100644
+--- a/include/flatcc/reflection/flatbuffers_common_reader.h
++++ b/include/flatcc/reflection/flatbuffers_common_reader.h
+@@ -433,7 +433,12 @@ static inline T N ## _ ## NK(N ## _struct_t t) { return t ? &(t->NK) : 0; }
+ /* If fid is null, the function returns true without testing as buffer is not expected to have any id. */
+ static inline int flatbuffers_has_identifier(const void *buffer, const char *fid)
+ { flatbuffers_thash_t id, id2 = 0; if (fid == 0) { return 1; };
+- strncpy((char *)&id2, fid, sizeof(id2));
++ const char *s;
++ unsigned int i;
++ for (s = fid, i = 0; i < sizeof(id2); ++i) {
++ ((char *)&id2)[i] = *s;
++ s += *s != 0;
++ }
+ /* Identifier strings are always considered little endian. */
+ id2 = __flatbuffers_thash_cast_from_le(id2);
+ id = __flatbuffers_thash_read_from_pe(((flatbuffers_uoffset_t *)buffer) + 1);
+diff --git a/src/runtime/json_printer.c b/src/runtime/json_printer.c
+index 8fe2483..5baceb2 100644
+--- a/src/runtime/json_printer.c
++++ b/src/runtime/json_printer.c
+@@ -1013,6 +1013,8 @@ static int accept_header(flatcc_json_printer_t * ctx,
+ const void *buf, size_t bufsiz, const char *fid)
+ {
+ flatbuffers_thash_t id, id2 = 0;
++ const char *s;
++ unsigned int i;
+
+ if (buf == 0 || bufsiz < offset_size + FLATBUFFERS_IDENTIFIER_SIZE) {
+ RAISE_ERROR(bad_input);
+@@ -1020,7 +1022,10 @@ static int accept_header(flatcc_json_printer_t * ctx,
+ return 0;
+ }
+ if (fid != 0) {
+- strncpy((char *)&id2, fid, FLATBUFFERS_IDENTIFIER_SIZE);
++ for (s = fid, i = 0; i < sizeof(id2); ++i) {
++ ((char *)&id2)[i] = *s;
++ s += *s != 0;
++ }
+ id2 = __flatbuffers_thash_cast_from_le(id2);
+ id = __flatbuffers_thash_read_from_pe((uint8_t *)buf + offset_size);
+ if (!(id2 == 0 || id == id2)) {
+diff --git a/src/runtime/verifier.c b/src/runtime/verifier.c
+index 68dbc1b..0733ff0 100644
+--- a/src/runtime/verifier.c
++++ b/src/runtime/verifier.c
+@@ -111,7 +111,12 @@ static inline uoffset_t read_uoffset(const void *p, uoffset_t base)
+ static inline thash_t read_thash_identifier(const char *identifier)
+ {
+ flatbuffers_thash_t id = 0;
+- strncpy((char *)&id, identifier, sizeof(id));
++ const char *s;
++ unsigned int i;
++ for (s = identifier, i = 0; i < sizeof(id); ++i) {
++ ((char *)&id)[i] = *s;
++ s += *s != 0;
++ }
+ return __flatbuffers_thash_cast_from_le(id);
+ }
+
--
2.7.4
More information about the buildroot
mailing list