mirror of
https://github.com/XRPLF/rippled.git
synced 2025-12-06 17:27:55 +00:00
Add safe_cast (RIPD-1702):
This change ensures that no overflow can occur when casting between enums and integral types.
This commit is contained in:
committed by
Nik Bougalis
parent
494724578a
commit
148bbf4e8f
@@ -17,6 +17,7 @@
|
||||
*/
|
||||
//==============================================================================
|
||||
|
||||
#include <ripple/basics/safe_cast.h>
|
||||
#include <ripple/overlay/Message.h>
|
||||
#include <ripple/overlay/impl/TrafficCount.h>
|
||||
#include <cstdint>
|
||||
@@ -38,7 +39,7 @@ Message::Message (::google::protobuf::Message const& message, int type)
|
||||
message.SerializeToArray (&mBuffer [Message::kHeaderBytes], messageBytes);
|
||||
}
|
||||
|
||||
mCategory = static_cast<int>(TrafficCount::categorize
|
||||
mCategory = safe_cast<int>(TrafficCount::categorize
|
||||
(message, type, false));
|
||||
}
|
||||
|
||||
|
||||
@@ -30,6 +30,7 @@
|
||||
#include <ripple/app/misc/ValidatorList.h>
|
||||
#include <ripple/app/tx/apply.h>
|
||||
#include <ripple/basics/random.h>
|
||||
#include <ripple/basics/safe_cast.h>
|
||||
#include <ripple/basics/UptimeClock.h>
|
||||
#include <ripple/beast/core/LexicalCast.h>
|
||||
#include <ripple/beast/core/SemanticVersion.h>
|
||||
@@ -192,7 +193,7 @@ PeerImp::send (Message::pointer const& m)
|
||||
return;
|
||||
|
||||
overlay_.reportTraffic (
|
||||
static_cast<TrafficCount::category>(m->getCategory()),
|
||||
safe_cast<TrafficCount::category>(m->getCategory()),
|
||||
false, static_cast<int>(m->getBuffer().size()));
|
||||
|
||||
auto sendq_size = send_queue_.size();
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
#include <ripple/app/ledger/LedgerMaster.h>
|
||||
#include <ripple/app/main/Application.h>
|
||||
#include <ripple/basics/base64.h>
|
||||
#include <ripple/basics/safe_cast.h>
|
||||
#include <ripple/beast/rfc2616.h>
|
||||
#include <ripple/beast/core/LexicalCast.h>
|
||||
#include <ripple/protocol/digest.h>
|
||||
@@ -226,11 +227,11 @@ parseHello (bool request, boost::beast::http::fields const& h, beast::Journal jo
|
||||
if (versions.empty())
|
||||
return boost::none;
|
||||
hello.set_protoversion(
|
||||
(static_cast<std::uint32_t>(versions.back().first) << 16) |
|
||||
(static_cast<std::uint32_t>(versions.back().second)));
|
||||
(safe_cast<std::uint32_t>(versions.back().first) << 16) |
|
||||
(safe_cast<std::uint32_t>(versions.back().second)));
|
||||
hello.set_protoversionmin(
|
||||
(static_cast<std::uint32_t>(versions.front().first) << 16) |
|
||||
(static_cast<std::uint32_t>(versions.front().second)));
|
||||
(safe_cast<std::uint32_t>(versions.front().first) << 16) |
|
||||
(safe_cast<std::uint32_t>(versions.front().second)));
|
||||
}
|
||||
|
||||
{
|
||||
@@ -362,7 +363,7 @@ verifyHello (protocol::TMHello const& h,
|
||||
|
||||
JLOG(journal.trace()) <<
|
||||
"Connect: time offset " <<
|
||||
static_cast<std::int64_t>(ourTime) - h.nettime();
|
||||
safe_cast<std::int64_t>(ourTime) - h.nettime();
|
||||
}
|
||||
|
||||
if (h.protoversionmin () > to_packed (BuildInfo::getCurrentProtocol()))
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
#ifndef RIPPLE_OVERLAY_TRAFFIC_H_INCLUDED
|
||||
#define RIPPLE_OVERLAY_TRAFFIC_H_INCLUDED
|
||||
|
||||
#include <ripple/basics/safe_cast.h>
|
||||
#include <ripple/protocol/messages.h>
|
||||
|
||||
#include <atomic>
|
||||
@@ -99,7 +100,7 @@ public:
|
||||
{
|
||||
for (category i = category::CT_base;
|
||||
i <= category::CT_unknown;
|
||||
i = static_cast<category>(static_cast<int>(i) + 1))
|
||||
i = safe_cast<category>(safe_cast<std::underlying_type_t<category>>(i) + 1))
|
||||
{
|
||||
counts_[i];
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user