|
@@ -0,0 +1,138 @@
|
|
|
+From c0df0b6fca4fa6bca114bba4df74f1b4e53124c0 Mon Sep 17 00:00:00 2001
|
|
|
+From: =?UTF-8?q?Mikkel=20Fahn=C3=B8e=20J=C3=B8rgensen?= <mikkel@dvide.com>
|
|
|
+Date: Sat, 9 Jun 2018 11:10:24 +0200
|
|
|
+Subject: [PATCH] Remove strncpy gcc-8 warning, add
|
|
|
+ flatbuffers_type_hash_from_string
|
|
|
+
|
|
|
+[baruch: drop CHANGELOG hunk]
|
|
|
+Signed-off-by: Baruch Siach <baruch@tkos.co.il>
|
|
|
+---
|
|
|
+Upstream status: commit c0df0b6fca4
|
|
|
+
|
|
|
+ include/flatcc/flatcc_identifier.h | 21 +++++++++++++++++++
|
|
|
+ .../reflection/flatbuffers_common_reader.h | 4 +---
|
|
|
+ src/compiler/codegen_c_reader.c | 4 +---
|
|
|
+ src/runtime/json_printer.c | 7 +++++--
|
|
|
+ src/runtime/verifier.c | 5 ++---
|
|
|
+ 6 files changed, 32 insertions(+), 11 deletions(-)
|
|
|
+
|
|
|
+diff --git a/include/flatcc/flatcc_identifier.h b/include/flatcc/flatcc_identifier.h
|
|
|
+index cd918cb42b48..31af3074f4db 100644
|
|
|
+--- a/include/flatcc/flatcc_identifier.h
|
|
|
++++ b/include/flatcc/flatcc_identifier.h
|
|
|
+@@ -77,6 +77,27 @@ static inline flatbuffers_thash_t flatbuffers_type_hash_from_identifier(const fl
|
|
|
+ (uint32_t)p[0] + (((uint32_t)p[1]) << 8) + (((uint32_t)p[2]) << 16) + (((uint32_t)p[3]) << 24) : 0;
|
|
|
+ }
|
|
|
+
|
|
|
++/*
|
|
|
++ * Convert a null terminated string identifier like "MONS" or "X" into a
|
|
|
++ * native type hash identifier, usually for comparison. This will not
|
|
|
++ * work with type hash strings because they can contain null bytes.
|
|
|
++ */
|
|
|
++static inline flatbuffers_thash_t flatbuffers_type_hash_from_string(const char *identifier)
|
|
|
++{
|
|
|
++ flatbuffers_thash_t h = 0;
|
|
|
++ const uint8_t *p = (const uint8_t *)identifier;
|
|
|
++
|
|
|
++ if (!p[0]) return h;
|
|
|
++ h += p[0];
|
|
|
++ if (!p[1]) return h;
|
|
|
++ h += p[1] << 8;
|
|
|
++ if (!p[2]) return h;
|
|
|
++ h += p[2] << 16;
|
|
|
++ /* No need to test for termination here. */
|
|
|
++ h += p[3] << 24;
|
|
|
++ return h;
|
|
|
++}
|
|
|
++
|
|
|
+ /*
|
|
|
+ * Computes the little endian wire format of the type hash. It can be
|
|
|
+ * used as a file identifer argument to various flatcc buffer calls.
|
|
|
+diff --git a/include/flatcc/reflection/flatbuffers_common_reader.h b/include/flatcc/reflection/flatbuffers_common_reader.h
|
|
|
+index dee44ad653f1..9604052685f6 100644
|
|
|
+--- a/include/flatcc/reflection/flatbuffers_common_reader.h
|
|
|
++++ b/include/flatcc/reflection/flatbuffers_common_reader.h
|
|
|
+@@ -464,9 +464,7 @@ static inline T N ## _ ## NK (N ## _struct_t t__tmp) { return t__tmp ? &(t__tmp-
|
|
|
+ /* 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));
|
|
|
+- /* Identifier strings are always considered little endian. */
|
|
|
+- id2 = __flatbuffers_thash_cast_from_le(id2);
|
|
|
++ id2 = flatbuffers_type_hash_from_string(fid);
|
|
|
+ id = __flatbuffers_thash_read_from_pe(((flatbuffers_uoffset_t *)buffer) + 1);
|
|
|
+ return id2 == 0 || id == id2; }
|
|
|
+ static inline int flatbuffers_has_type_hash(const void *buffer, flatbuffers_thash_t thash)
|
|
|
+diff --git a/src/compiler/codegen_c_reader.c b/src/compiler/codegen_c_reader.c
|
|
|
+index e3df74754344..559731050a15 100644
|
|
|
+--- a/src/compiler/codegen_c_reader.c
|
|
|
++++ b/src/compiler/codegen_c_reader.c
|
|
|
+@@ -748,9 +748,7 @@ static void gen_helpers(fb_output_t *out)
|
|
|
+ "/* If fid is null, the function returns true without testing as buffer is not expected to have any id. */\n"
|
|
|
+ "static inline int %shas_identifier(const void *buffer, const char *fid)\n"
|
|
|
+ "{ %sthash_t id, id2 = 0; if (fid == 0) { return 1; };\n"
|
|
|
+- " strncpy((char *)&id2, fid, sizeof(id2));\n"
|
|
|
+- " /* Identifier strings are always considered little endian. */\n"
|
|
|
+- " id2 = __%sthash_cast_from_le(id2);\n"
|
|
|
++ " id2 = %stype_hash_from_string(fid);\n"
|
|
|
+ " id = __%sthash_read_from_pe(((%suoffset_t *)buffer) + 1);\n"
|
|
|
+ " return id2 == 0 || id == id2; }\n"
|
|
|
+ "static inline int %shas_type_hash(const void *buffer, %sthash_t thash)\n"
|
|
|
+diff --git a/src/runtime/json_printer.c b/src/runtime/json_printer.c
|
|
|
+index 8fe248331f43..bc86d21f8f9d 100644
|
|
|
+--- a/src/runtime/json_printer.c
|
|
|
++++ b/src/runtime/json_printer.c
|
|
|
+@@ -20,6 +20,7 @@
|
|
|
+
|
|
|
+ #include "flatcc/flatcc_flatbuffers.h"
|
|
|
+ #include "flatcc/flatcc_json_printer.h"
|
|
|
++#include "flatcc/flatcc_identifier.h"
|
|
|
+
|
|
|
+ #include "flatcc/portable/pprintint.h"
|
|
|
+ #include "flatcc/portable/pprintfp.h"
|
|
|
+@@ -1008,6 +1009,9 @@ void flatcc_json_printer_struct_field(flatcc_json_printer_t *ctx,
|
|
|
+ /*
|
|
|
+ * Make sure the buffer identifier is valid before assuming the rest of
|
|
|
+ * the buffer is sane.
|
|
|
++ * NOTE: this won't work with type hashes because these can contain
|
|
|
++ * nulls in the fid string. In this case use null as fid to disable
|
|
|
++ * check.
|
|
|
+ */
|
|
|
+ static int accept_header(flatcc_json_printer_t * ctx,
|
|
|
+ const void *buf, size_t bufsiz, const char *fid)
|
|
|
+@@ -1020,8 +1024,7 @@ static int accept_header(flatcc_json_printer_t * ctx,
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ if (fid != 0) {
|
|
|
+- strncpy((char *)&id2, fid, FLATBUFFERS_IDENTIFIER_SIZE);
|
|
|
+- id2 = __flatbuffers_thash_cast_from_le(id2);
|
|
|
++ id2 = flatbuffers_type_hash_from_string(fid);
|
|
|
+ id = __flatbuffers_thash_read_from_pe((uint8_t *)buf + offset_size);
|
|
|
+ if (!(id2 == 0 || id == id2)) {
|
|
|
+ RAISE_ERROR(bad_input);
|
|
|
+diff --git a/src/runtime/verifier.c b/src/runtime/verifier.c
|
|
|
+index 68dbc1b6fb0b..3b7c68cca4d7 100644
|
|
|
+--- a/src/runtime/verifier.c
|
|
|
++++ b/src/runtime/verifier.c
|
|
|
+@@ -10,6 +10,7 @@
|
|
|
+ #include "flatcc/flatcc_rtconfig.h"
|
|
|
+ #include "flatcc/flatcc_flatbuffers.h"
|
|
|
+ #include "flatcc/flatcc_verifier.h"
|
|
|
++#include "flatcc/flatcc_identifier.h"
|
|
|
+
|
|
|
+ /* Customization for testing. */
|
|
|
+ #if FLATCC_DEBUG_VERIFY
|
|
|
+@@ -110,9 +111,7 @@ 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));
|
|
|
+- return __flatbuffers_thash_cast_from_le(id);
|
|
|
++ return flatbuffers_type_hash_from_string(identifier);
|
|
|
+ }
|
|
|
+
|
|
|
+ static inline thash_t read_thash(const void *p, uoffset_t base)
|
|
|
+--
|
|
|
+2.17.1
|
|
|
+
|