From 4587c0925f6fd271853e129ff532e30cd3a8d50a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Adrien=20B=C3=A9raud?= <adrien.beraud@savoirfairelinux.com>
Date: Wed, 13 May 2020 16:11:31 -0400
Subject: [PATCH] utils: always check length in findMapValue

---
 include/opendht/utils.h | 10 ++++++++--
 src/utils.cpp           | 16 ++--------------
 2 files changed, 10 insertions(+), 16 deletions(-)

diff --git a/include/opendht/utils.h b/include/opendht/utils.h
index 4836fd65..93b6e8d9 100644
--- a/include/opendht/utils.h
+++ b/include/opendht/utils.h
@@ -173,7 +173,13 @@ unpackMsg(Blob b) {
 
 msgpack::unpacked unpackMsg(Blob b);
 
-msgpack::object* findMapValue(const msgpack::object& map, const char* key);
-msgpack::object* findMapValue(const msgpack::object& map, const std::string& key);
+msgpack::object* findMapValue(const msgpack::object& map, const char* key, size_t length);
+
+inline msgpack::object* findMapValue(const msgpack::object& map, const char* key) {
+    return findMapValue(map, key, strlen(key));
+}
+inline msgpack::object* findMapValue(const msgpack::object& map, const std::string& key) {
+    return findMapValue(map, key.c_str(), key.size());
+}
 
 } // namespace dht
diff --git a/src/utils.cpp b/src/utils.cpp
index 90efca77..be69eac0 100644
--- a/src/utils.cpp
+++ b/src/utils.cpp
@@ -277,28 +277,16 @@ unpackMsg(Blob b) {
 }
 
 msgpack::object*
-findMapValue(const msgpack::object& map, const char* key) {
+findMapValue(const msgpack::object& map, const char* key, size_t key_length) {
     if (map.type != msgpack::type::MAP) throw msgpack::type_error();
     for (unsigned i = 0; i < map.via.map.size; i++) {
         auto& o = map.via.map.ptr[i];
         if (o.key.type == msgpack::type::STR
+            && key_length == o.key.via.str.size
             && std::strncmp(o.key.via.str.ptr, key, o.key.via.str.size) == 0)
             return &o.val;
     }
     return nullptr;
 }
 
-msgpack::object*
-findMapValue(const msgpack::object& map, const std::string& key) {
-    if (map.type != msgpack::type::MAP) throw msgpack::type_error();
-    for (unsigned i = 0; i < map.via.map.size; i++) {
-        auto& o = map.via.map.ptr[i];
-        if (o.key.type == msgpack::type::STR
-            && key.size() == o.key.via.str.size
-            && std::strncmp(o.key.via.str.ptr, key.data(), o.key.via.str.size) == 0)
-            return &o.val;
-    }
-    return nullptr;
-}
-
 }
-- 
GitLab