From b0860a5f37ca4d2a183b9d5928de18f047ca8cc1 Mon Sep 17 00:00:00 2001 From: Takatoshi Kondo Date: Thu, 2 Jul 2020 13:34:00 +0900 Subject: [PATCH] Fixed ptr size operation. --- include/msgpack/v2/create_object_visitor.hpp | 39 +++++++++++++++----- 1 file changed, 29 insertions(+), 10 deletions(-) diff --git a/include/msgpack/v2/create_object_visitor.hpp b/include/msgpack/v2/create_object_visitor.hpp index c2ac9cf2..17cb56de 100644 --- a/include/msgpack/v2/create_object_visitor.hpp +++ b/include/msgpack/v2/create_object_visitor.hpp @@ -114,16 +114,21 @@ public: obj->type = msgpack::type::STR; if (m_func && m_func(obj->type, size, m_user_data)) { obj->via.str.ptr = v; + obj->via.str.size = size; set_referenced(true); } else { - char* tmp = static_cast(zone().allocate_align(size, MSGPACK_ZONE_ALIGNOF(char))); if (v) { + char* tmp = static_cast(zone().allocate_align(size, MSGPACK_ZONE_ALIGNOF(char))); std::memcpy(tmp, v, size); obj->via.str.ptr = tmp; + obj->via.str.size = size; + } + else { + obj->via.str.ptr = MSGPACK_NULLPTR; + obj->via.str.size = 0; } } - obj->via.str.size = size; return true; } bool visit_bin(const char* v, uint32_t size) { @@ -132,14 +137,21 @@ public: obj->type = msgpack::type::BIN; if (m_func && m_func(obj->type, size, m_user_data)) { obj->via.bin.ptr = v; + obj->via.bin.size = size; set_referenced(true); } else { - char* tmp = static_cast(zone().allocate_align(size, MSGPACK_ZONE_ALIGNOF(char))); - std::memcpy(tmp, v, size); - obj->via.bin.ptr = tmp; + if (v) { + char* tmp = static_cast(zone().allocate_align(size, MSGPACK_ZONE_ALIGNOF(char))); + std::memcpy(tmp, v, size); + obj->via.bin.ptr = tmp; + obj->via.bin.size = size; + } + else { + obj->via.bin.ptr = MSGPACK_NULLPTR; + obj->via.bin.size = 0; + } } - obj->via.bin.size = size; return true; } bool visit_ext(const char* v, uint32_t size) { @@ -148,14 +160,21 @@ public: obj->type = msgpack::type::EXT; if (m_func && m_func(obj->type, size, m_user_data)) { obj->via.ext.ptr = v; + obj->via.ext.size = static_cast(size - 1); set_referenced(true); } else { - char* tmp = static_cast(zone().allocate_align(size, MSGPACK_ZONE_ALIGNOF(char))); - std::memcpy(tmp, v, size); - obj->via.ext.ptr = tmp; + if (v) { + char* tmp = static_cast(zone().allocate_align(size, MSGPACK_ZONE_ALIGNOF(char))); + std::memcpy(tmp, v, size); + obj->via.ext.ptr = tmp; + obj->via.ext.size = static_cast(size - 1); + } + else { + obj->via.ext.ptr = MSGPACK_NULLPTR; + obj->via.ext.size = 0; + } } - obj->via.ext.size = static_cast(size - 1); return true; } bool start_array(uint32_t num_elements) {