From a21d4d4adcd0890530082b76c926de209bf0e62e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20D=C3=A9saulniers?= <sim.desaulniers@gmail.com> Date: Fri, 5 Aug 2016 20:48:51 -0400 Subject: [PATCH] queries: fix deserialization bug Only the first two entries of the array would be accessed in a consistent way. Therefor, only the two first field value index would be returned. --- include/opendht/value.h | 4 ++-- src/network_engine.cpp | 5 ++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/include/opendht/value.h b/include/opendht/value.h index ff30d022..efb084b4 100644 --- a/include/opendht/value.h +++ b/include/opendht/value.h @@ -457,10 +457,10 @@ struct Value for (const auto& field : fields) switch (field) { case Value::Field::Id: - pk.pack(id); + pk.pack(static_cast<uint64_t>(id)); break; case Value::Field::ValueType: - pk.pack(type); + pk.pack(static_cast<uint64_t>(type)); break; case Value::Field::OwnerPk: if (owner) diff --git a/src/network_engine.cpp b/src/network_engine.cpp index ef3366c4..760a88ed 100644 --- a/src/network_engine.cpp +++ b/src/network_engine.cpp @@ -748,9 +748,8 @@ NetworkEngine::sendNodesValues(const sockaddr* sa, socklen_t salen, TransId tid, pk.pack_map(2); pk.pack(std::string("f")); pk.pack(fields); pk.pack(std::string("v")); pk.pack_array(st.size()*fields.size()); - for (const auto& v : st) { + for (const auto& v : st) v->msgpack_pack_fields(fields, pk); - } DHT_LOG.DEBUG("sending closest nodes (%d+%d nodes.), %u value headers containing %u fields", nodes.size(), nodes6.size(), st.size(), fields.size()); } @@ -1102,7 +1101,7 @@ ParsedMessage::msgpack_unpack(msgpack::object msg) for (size_t i = 0; i < rvalues->via.array.size; ++i) { try { auto v = std::make_shared<FieldValueIndex>(); - v->msgpack_unpack_fields(fields_, *rvalues, i*fields.size()); + v->msgpack_unpack_fields(fields_, *rvalues, i*fields_.size()); fields.emplace_back(std::move(v)); } catch (const std::exception& e) { } } -- GitLab