diff --git a/include/msgpack/v3/parse.hpp b/include/msgpack/v3/parse.hpp index 9b0b0a29..b833f3e3 100644 --- a/include/msgpack/v3/parse.hpp +++ b/include/msgpack/v3/parse.hpp @@ -71,6 +71,7 @@ private: return PARSE_STOP_VISITOR; } parse_return ret = m_stack.consume(holder(), m_current); + ++m_current; if (ret != PARSE_CONTINUE) { off = m_current - m_start; return ret; @@ -82,12 +83,12 @@ private: return PARSE_STOP_VISITOR; } parse_return ret = m_stack.push(holder(), sv.type(), static_cast(size)); + ++m_current; if (ret != PARSE_CONTINUE) { off = m_current - m_start; return ret; } } - ++m_current; m_cs = MSGPACK_CS_HEADER; return PARSE_CONTINUE; } diff --git a/test/pack_unpack.cpp b/test/pack_unpack.cpp index 2a443ad6..aba452ec 100644 --- a/test/pack_unpack.cpp +++ b/test/pack_unpack.cpp @@ -513,3 +513,87 @@ TEST(unpack, int_off_larger_than_length) EXPECT_TRUE(thrown); EXPECT_EQ(off, 2u); } + +TEST(unpack, empty_array_fix) +{ + std::string buf; + buf.push_back(static_cast(0x90)); + std::size_t off = 0; + + msgpack::object_handle oh = msgpack::unpack(buf.data(), buf.size(), off); + EXPECT_EQ(oh.get().type, msgpack::type::ARRAY); + EXPECT_EQ(oh.get().via.array.size, 0u); + EXPECT_EQ(off, 1u); +} + +TEST(unpack, empty_array_16) +{ + std::string buf; + buf.push_back(static_cast(0xdc)); + buf.push_back(static_cast(0x00)); + buf.push_back(static_cast(0x00)); + std::size_t off = 0; + + msgpack::object_handle oh = msgpack::unpack(buf.data(), buf.size(), off); + EXPECT_EQ(oh.get().type, msgpack::type::ARRAY); + EXPECT_EQ(oh.get().via.array.size, 0u); + EXPECT_EQ(off, 3u); +} + +TEST(unpack, empty_array_32) +{ + std::string buf; + buf.push_back(static_cast(0xdd)); + buf.push_back(static_cast(0x00)); + buf.push_back(static_cast(0x00)); + buf.push_back(static_cast(0x00)); + buf.push_back(static_cast(0x00)); + std::size_t off = 0; + + msgpack::object_handle oh = msgpack::unpack(buf.data(), buf.size(), off); + EXPECT_EQ(oh.get().type, msgpack::type::ARRAY); + EXPECT_EQ(oh.get().via.array.size, 0u); + EXPECT_EQ(off, 5u); +} + +TEST(unpack, empty_map_fix) +{ + std::string buf; + buf.push_back(static_cast(0x80)); + std::size_t off = 0; + + msgpack::object_handle oh = msgpack::unpack(buf.data(), buf.size(), off); + EXPECT_EQ(oh.get().type, msgpack::type::MAP); + EXPECT_EQ(oh.get().via.map.size, 0u); + EXPECT_EQ(off, 1u); +} + +TEST(unpack, empty_map_16) +{ + std::string buf; + buf.push_back(static_cast(0xde)); + buf.push_back(static_cast(0x00)); + buf.push_back(static_cast(0x00)); + std::size_t off = 0; + + msgpack::object_handle oh = msgpack::unpack(buf.data(), buf.size(), off); + EXPECT_EQ(oh.get().type, msgpack::type::MAP); + EXPECT_EQ(oh.get().via.map.size, 0u); + EXPECT_EQ(off, 3u); +} + +TEST(unpack, empty_map_32) +{ + std::string buf; + buf.push_back(static_cast(0xdf)); + buf.push_back(static_cast(0x00)); + buf.push_back(static_cast(0x00)); + buf.push_back(static_cast(0x00)); + buf.push_back(static_cast(0x00)); + std::size_t off = 0; + + msgpack::object_handle oh = msgpack::unpack(buf.data(), buf.size(), off); + EXPECT_EQ(oh.get().type, msgpack::type::MAP); + EXPECT_EQ(oh.get().via.map.size, 0u); + EXPECT_EQ(off, 5u); +}