From 3bd0172a9ad0e1a357af95a6bc8264373404a462 Mon Sep 17 00:00:00 2001 From: Takatoshi Kondo Date: Fri, 3 Jul 2020 09:18:00 +0900 Subject: [PATCH 1/2] Unified NULL buf handling for all *buffer. *buffer means sbuffer, zbuffer, fbuffer, and vrefbuffer. The logic is as follows: if buf is NULL if len is 0 do nothing return 0 (success) else assertion fail else set contants to *buffer --- include/msgpack/fbuffer.h | 4 ++++ include/msgpack/sbuffer.h | 9 +++++---- include/msgpack/vrefbuffer.h | 4 ++++ include/msgpack/zbuffer.h | 4 ++++ 4 files changed, 17 insertions(+), 4 deletions(-) diff --git a/include/msgpack/fbuffer.h b/include/msgpack/fbuffer.h index d478008c..5c847dd9 100644 --- a/include/msgpack/fbuffer.h +++ b/include/msgpack/fbuffer.h @@ -11,6 +11,7 @@ #define MSGPACK_FBUFFER_H #include +#include #ifdef __cplusplus extern "C" { @@ -25,6 +26,9 @@ extern "C" { static inline int msgpack_fbuffer_write(void* data, const char* buf, size_t len) { + assert(buf || len == 0); + if(!buf) return 0; + return (1 == fwrite(buf, len, 1, (FILE *)data)) ? 0 : -1; } diff --git a/include/msgpack/sbuffer.h b/include/msgpack/sbuffer.h index 8aa93cac..572d8f27 100644 --- a/include/msgpack/sbuffer.h +++ b/include/msgpack/sbuffer.h @@ -60,7 +60,9 @@ static inline void msgpack_sbuffer_free(msgpack_sbuffer* sbuf) static inline int msgpack_sbuffer_write(void* data, const char* buf, size_t len) { msgpack_sbuffer* sbuf = (msgpack_sbuffer*)data; + assert(buf || len == 0); + if(!buf) return 0; if(sbuf->alloc - sbuf->size < len) { void* tmp; @@ -83,10 +85,9 @@ static inline int msgpack_sbuffer_write(void* data, const char* buf, size_t len) sbuf->alloc = nsize; } - if(buf) { - memcpy(sbuf->data + sbuf->size, buf, len); - sbuf->size += len; - } + memcpy(sbuf->data + sbuf->size, buf, len); + sbuf->size += len; + return 0; } diff --git a/include/msgpack/vrefbuffer.h b/include/msgpack/vrefbuffer.h index ab51aefa..cdd88637 100644 --- a/include/msgpack/vrefbuffer.h +++ b/include/msgpack/vrefbuffer.h @@ -12,6 +12,7 @@ #include "zone.h" #include +#include #if defined(unix) || defined(__unix) || defined(__linux__) || defined(__APPLE__) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__QNX__) || defined(__QNXTO__) || defined(__HAIKU__) #include @@ -114,6 +115,9 @@ static inline void msgpack_vrefbuffer_free(msgpack_vrefbuffer* vbuf) static inline int msgpack_vrefbuffer_write(void* data, const char* buf, size_t len) { msgpack_vrefbuffer* vbuf = (msgpack_vrefbuffer*)data; + assert(buf || len == 0); + + if(!buf) return 0; if(len < vbuf->ref_size) { return msgpack_vrefbuffer_append_copy(vbuf, buf, len); diff --git a/include/msgpack/zbuffer.h b/include/msgpack/zbuffer.h index 524906fa..c38d627e 100644 --- a/include/msgpack/zbuffer.h +++ b/include/msgpack/zbuffer.h @@ -13,6 +13,7 @@ #include "sysdep.h" #include #include +#include #include #ifdef __cplusplus @@ -121,6 +122,9 @@ static inline int msgpack_zbuffer_write(void* data, const char* buf, size_t len) { msgpack_zbuffer* zbuf = (msgpack_zbuffer*)data; + assert(buf || len == 0); + if(!buf) return 0; + zbuf->stream.next_in = (Bytef*)buf; zbuf->stream.avail_in = (uInt)len; From 208ec6503484eb41230701722551518452ec544b Mon Sep 17 00:00:00 2001 From: Takatoshi Kondo Date: Fri, 3 Jul 2020 09:24:39 +0900 Subject: [PATCH 2/2] Set -fsanitize=undefined on CI. Propagate CXXFLAGS correctly. Set CFLAGS in the same way. --- .github/workflows/gha.yml | 4 ++-- ci/build_cmake.sh | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/gha.yml b/.github/workflows/gha.yml index 1d26cac8..a63e84ae 100644 --- a/.github/workflows/gha.yml +++ b/.github/workflows/gha.yml @@ -61,7 +61,7 @@ jobs: cd .. # build and test - CMAKE_CXX_COMPILER="${CXX}" CMAKE_C_COMPILER="${CC}" GTEST_ROOT="${BASE}/usr" CFLAGS="-Werror -g" CXXFLAGS="-Werror -g" ${ACTION} + CMAKE_CXX_COMPILER="${CXX}" CMAKE_C_COMPILER="${CC}" GTEST_ROOT="${BASE}/usr" CFLAGS="-Werror -g -fsanitize=undefined" CXXFLAGS="-Werror -g -fsanitize=undefined" ${ACTION} linux: runs-on: ubuntu-18.04 @@ -172,7 +172,7 @@ jobs: fi # build and test - CMAKE_CXX_COMPILER="${CXX}" CMAKE_C_COMPILER="${CC}" GTEST_ROOT="${BASE}/usr" CFLAGS="-Werror -g" CXXFLAGS="-Werror -g" MSGPACK_SAN="${SAN}" ${ACTION} + CMAKE_CXX_COMPILER="${CXX}" CMAKE_C_COMPILER="${CC}" GTEST_ROOT="${BASE}/usr" CFLAGS="-Werror -g -fsanitize=undefined" CXXFLAGS="-Werror -g -fsanitize=undefined" MSGPACK_SAN="${SAN}" ${ACTION} windows: runs-on: windows-2019 diff --git a/ci/build_cmake.sh b/ci/build_cmake.sh index 483446a4..83ee2f12 100755 --- a/ci/build_cmake.sh +++ b/ci/build_cmake.sh @@ -25,7 +25,7 @@ else export ARCH_FLAG="-m64" fi -cmake -DMSGPACK_32BIT=${BIT32} -DBUILD_SHARED_LIBS=${SHARED} -DMSGPACK_CHAR_SIGN=${CHAR_SIGN} -DCMAKE_CXX_FLAGS=${ARCH_FLAG} .. +cmake -DMSGPACK_32BIT=${BIT32} -DBUILD_SHARED_LIBS=${SHARED} -DMSGPACK_CHAR_SIGN=${CHAR_SIGN} -DCMAKE_CXX_FLAGS="${ARCH_FLAG} ${CXXFLAGS}" -DCMAKE_C_FLAGS="${CFLAGS}" .. ret=$? if [ $ret -ne 0 ]