aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWladimir J. van der Laan <laanwj@gmail.com>2015-08-05 15:42:30 +0200
committerWladimir J. van der Laan <laanwj@gmail.com>2015-08-05 15:43:10 +0200
commitc3848000277d5ab6b5f5faecb1d21b89374ef999 (patch)
treeea62f8f84cfe6c7d7b11189e048969399d80b6ae
parentc9c017adf6a7b78f609f5fc61fd91dfa2e3d9662 (diff)
parent7b79cbd722d35b8113d5136b06d4a8e5fd569fc6 (diff)
downloadbitcoin-c3848000277d5ab6b5f5faecb1d21b89374ef999.tar.xz
Merge pull request #6462
7b79cbd limit total length of user agent comments (Pavol Rusnak) 557f8ea implement uacomment config parameter which can add comments to user agent as per BIP-0014 (Pavol Rusnak)
-rw-r--r--src/init.cpp7
-rw-r--r--src/main.cpp2
-rw-r--r--src/net.cpp3
-rw-r--r--src/net.h5
-rw-r--r--src/rpcnet.cpp3
5 files changed, 16 insertions, 4 deletions
diff --git a/src/init.cpp b/src/init.cpp
index c92e9a7692..ef1c39db25 100644
--- a/src/init.cpp
+++ b/src/init.cpp
@@ -1020,6 +1020,13 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
RegisterNodeSignals(GetNodeSignals());
+ // format user agent, check total size
+ strSubVersion = FormatSubVersion(CLIENT_NAME, CLIENT_VERSION, mapMultiArgs.count("-uacomment") ? mapMultiArgs["-uacomment"] : std::vector<string>());
+ if (strSubVersion.size() > MAX_SUBVERSION_LENGTH) {
+ return InitError(strprintf("Total length of network version string %i exceeds maximum of %i characters. Reduce the number and/or size of uacomments.",
+ strSubVersion.size(), MAX_SUBVERSION_LENGTH));
+ }
+
if (mapArgs.count("-onlynet")) {
std::set<enum Network> nets;
BOOST_FOREACH(const std::string& snet, mapMultiArgs["-onlynet"]) {
diff --git a/src/main.cpp b/src/main.cpp
index 14f36762c9..52d543c117 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -3898,7 +3898,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
if (!vRecv.empty())
vRecv >> addrFrom >> nNonce;
if (!vRecv.empty()) {
- vRecv >> LIMITED_STRING(pfrom->strSubVer, 256);
+ vRecv >> LIMITED_STRING(pfrom->strSubVer, MAX_SUBVERSION_LENGTH);
pfrom->cleanSubVer = SanitizeString(pfrom->strSubVer);
}
if (!vRecv.empty())
diff --git a/src/net.cpp b/src/net.cpp
index 5d413697bf..e4ead3c92e 100644
--- a/src/net.cpp
+++ b/src/net.cpp
@@ -83,6 +83,7 @@ CAddrMan addrman;
int nMaxConnections = DEFAULT_MAX_PEER_CONNECTIONS;
int nWhiteConnections = 0;
bool fAddressesInitialized = false;
+std::string strSubVersion;
vector<CNode*> vNodes;
CCriticalSection cs_vNodes;
@@ -445,7 +446,7 @@ void CNode::PushVersion()
else
LogPrint("net", "send version message: version %d, blocks=%d, us=%s, peer=%d\n", PROTOCOL_VERSION, nBestHeight, addrMe.ToString(), id);
PushMessage("version", PROTOCOL_VERSION, nLocalServices, nTime, addrYou, addrMe,
- nLocalHostNonce, FormatSubVersion(CLIENT_NAME, CLIENT_VERSION, std::vector<string>()), nBestHeight, true);
+ nLocalHostNonce, strSubVersion, nBestHeight, true);
}
diff --git a/src/net.h b/src/net.h
index aac28fe105..efa2e29bb5 100644
--- a/src/net.h
+++ b/src/net.h
@@ -46,6 +46,8 @@ static const unsigned int MAX_INV_SZ = 50000;
static const unsigned int MAX_ADDR_TO_SEND = 1000;
/** Maximum length of incoming protocol messages (no message over 2 MiB is currently acceptable). */
static const unsigned int MAX_PROTOCOL_MESSAGE_LENGTH = 2 * 1024 * 1024;
+/** Maximum length of strSubVer in `version` message */
+static const unsigned int MAX_SUBVERSION_LENGTH = 256;
/** -listen default */
static const bool DEFAULT_LISTEN = true;
/** -upnp default */
@@ -168,6 +170,9 @@ extern CCriticalSection cs_vAddedNodes;
extern NodeId nLastNodeId;
extern CCriticalSection cs_nLastNodeId;
+/** Subversion as sent to the P2P network in `version` messages */
+extern std::string strSubVersion;
+
struct LocalServiceInfo {
int nScore;
int nPort;
diff --git a/src/rpcnet.cpp b/src/rpcnet.cpp
index d51aa50305..56ec59171d 100644
--- a/src/rpcnet.cpp
+++ b/src/rpcnet.cpp
@@ -443,8 +443,7 @@ UniValue getnetworkinfo(const UniValue& params, bool fHelp)
UniValue obj(UniValue::VOBJ);
obj.push_back(Pair("version", CLIENT_VERSION));
- obj.push_back(Pair("subversion",
- FormatSubVersion(CLIENT_NAME, CLIENT_VERSION, std::vector<string>())));
+ obj.push_back(Pair("subversion", strSubVersion));
obj.push_back(Pair("protocolversion",PROTOCOL_VERSION));
obj.push_back(Pair("localservices", strprintf("%016x", nLocalServices)));
obj.push_back(Pair("timeoffset", GetTimeOffset()));