This commit is contained in:
Takatoshi Kondo 2018-04-08 21:17:29 +09:00
parent 347658cdc1
commit f8dc0f0d04
2 changed files with 86 additions and 1 deletions

View File

@ -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<uint32_t>(size));
++m_current;
if (ret != PARSE_CONTINUE) {
off = m_current - m_start;
return ret;
}
}
++m_current;
m_cs = MSGPACK_CS_HEADER;
return PARSE_CONTINUE;
}

View File

@ -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<char>(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<char>(0xdc));
buf.push_back(static_cast<char>(0x00));
buf.push_back(static_cast<char>(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<char>(0xdd));
buf.push_back(static_cast<char>(0x00));
buf.push_back(static_cast<char>(0x00));
buf.push_back(static_cast<char>(0x00));
buf.push_back(static_cast<char>(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<char>(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<char>(0xde));
buf.push_back(static_cast<char>(0x00));
buf.push_back(static_cast<char>(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<char>(0xdf));
buf.push_back(static_cast<char>(0x00));
buf.push_back(static_cast<char>(0x00));
buf.push_back(static_cast<char>(0x00));
buf.push_back(static_cast<char>(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);
}