From f94de5ac2baf71ce71b86acb85eee38ff4c57a99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrien=20B=C3=A9raud?= Date: Sun, 8 Nov 2015 16:05:54 -0500 Subject: [PATCH] values: apply a maximum value size --- include/opendht/value.h | 6 +++--- src/default_types.cpp | 9 ++++----- src/value.cpp | 8 ++++---- 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/include/opendht/value.h b/include/opendht/value.h index 6423ca1d..6616e0e3 100644 --- a/include/opendht/value.h +++ b/include/opendht/value.h @@ -54,6 +54,8 @@ struct Value; typedef std::function&, InfoHash, const sockaddr*, socklen_t)> StorePolicy; typedef std::function&, std::shared_ptr&, InfoHash, const sockaddr*, socklen_t)> EditPolicy; +static constexpr size_t MAX_VALUE_SIZE {1024 * 128}; + struct ValueType { typedef uint16_t Id; ValueType () {} @@ -73,9 +75,7 @@ struct ValueType { // Generic value type static const ValueType USER_DATA; - static bool DEFAULT_STORE_POLICY(InfoHash, std::shared_ptr&, InfoHash, const sockaddr*, socklen_t) { - return true; - } + static bool DEFAULT_STORE_POLICY(InfoHash, std::shared_ptr& v, InfoHash, const sockaddr*, socklen_t); static bool DEFAULT_EDIT_POLICY(InfoHash, const std::shared_ptr&, std::shared_ptr&, InfoHash, const sockaddr*, socklen_t) { return false; } diff --git a/src/default_types.cpp b/src/default_types.cpp index 86ff073c..c73406da 100644 --- a/src/default_types.cpp +++ b/src/default_types.cpp @@ -28,14 +28,14 @@ std::ostream& operator<< (std::ostream& s, const DhtMessage& v) } bool -DhtMessage::storePolicy(InfoHash, std::shared_ptr& v, InfoHash, const sockaddr*, socklen_t) +DhtMessage::storePolicy(InfoHash h, std::shared_ptr& v, InfoHash f, const sockaddr* fa, socklen_t fas) { try { auto msg = unpackMsg(v->data); if (msg.service.empty()) return false; } catch (const std::exception& e) {} - return true; + return ValueType::DEFAULT_STORE_POLICY(h, v, f, fa, fas); } Value::Filter @@ -68,7 +68,7 @@ std::ostream& operator<< (std::ostream& s, const IpServiceAnnouncement& v) } bool -IpServiceAnnouncement::storePolicy(InfoHash, std::shared_ptr& v, InfoHash, const sockaddr* from, socklen_t fromlen) +IpServiceAnnouncement::storePolicy(InfoHash h, std::shared_ptr& v, InfoHash f, const sockaddr* from, socklen_t fromlen) { try { auto msg = unpackMsg(v->data); @@ -78,7 +78,7 @@ IpServiceAnnouncement::storePolicy(InfoHash, std::shared_ptr& v, InfoHash sa_addr.setPort(msg.getPort()); // argument v is modified (not the value). v = std::make_shared(IpServiceAnnouncement::TYPE, sa_addr, v->id); - return true; + return ValueType::DEFAULT_STORE_POLICY(h, v, f, from, fromlen); } catch (const std::exception& e) {} return false; } @@ -89,7 +89,6 @@ const ValueType ImMessage::TYPE = {3, "IM message", std::chrono::minutes(5)}; const ValueType TrustRequest::TYPE = {4, "Certificate trust request", std::chrono::hours(24*7)}; const ValueType IceCandidates::TYPE = {5, "ICE candidates", std::chrono::minutes(5)}; - const std::array, 5> DEFAULT_TYPES {{ diff --git a/src/value.cpp b/src/value.cpp index 2d1bdad5..bb45e298 100644 --- a/src/value.cpp +++ b/src/value.cpp @@ -59,10 +59,10 @@ std::ostream& operator<< (std::ostream& s, const Value& v) const ValueType ValueType::USER_DATA = {0, "User Data"}; - -msgpack::unpacked -unpackMsg(Blob b) { - return msgpack::unpack((const char*)b.data(), b.size()); +bool +ValueType::DEFAULT_STORE_POLICY(InfoHash, std::shared_ptr& v, InfoHash, const sockaddr*, socklen_t) +{ + return v->data.size() <= MAX_VALUE_SIZE; } msgpack::object*