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