aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMacroFake <falke.marco@gmail.com>2022-10-24 11:46:47 +0200
committerMacroFake <falke.marco@gmail.com>2022-10-24 11:47:03 +0200
commit40b69fb06e49eef5d86ec0bd0d7e3033fbdbfb6d (patch)
treefb16bb53fd85fb35a850c58248be0931f306ba50 /src
parentc2d46d7434b307595e58ddf9a1d8a3f3b66eb221 (diff)
parent38d4601fe826069ee43b341e9d467beb7d14b5f0 (diff)
Merge bitcoin/bitcoin#26033: [23.x] Prevent data race for `pathHandlers`
38d4601fe826069ee43b341e9d467beb7d14b5f0 Prevent data race for `pathHandlers` (Hennadii Stepanov) Pull request description: Backport of https://github.com/bitcoin/bitcoin/pull/25983 to the 23.x branch. ACKs for top commit: dergoegge: ACK 38d4601fe826069ee43b341e9d467beb7d14b5f0 Tree-SHA512: b235d6d2cb374baf1b54c09f4cd2feca7b6c1588d081532e987fd5def8ed0dee4b8255112b130a77aca633ec6a63cfd81f215b2e7a403c213eb6048a54774d26
Diffstat (limited to 'src')
-rw-r--r--src/httpserver.cpp6
1 files changed, 5 insertions, 1 deletions
diff --git a/src/httpserver.cpp b/src/httpserver.cpp
index e00c68585e..022703e79d 100644
--- a/src/httpserver.cpp
+++ b/src/httpserver.cpp
@@ -143,7 +143,8 @@ static std::vector<CSubNet> rpc_allow_subnets;
//! Work queue for handling longer requests off the event loop thread
static std::unique_ptr<WorkQueue<HTTPClosure>> g_work_queue{nullptr};
//! Handlers for (sub)paths
-static std::vector<HTTPPathHandler> pathHandlers;
+static Mutex g_httppathhandlers_mutex;
+static std::vector<HTTPPathHandler> pathHandlers GUARDED_BY(g_httppathhandlers_mutex);
//! Bound listening sockets
static std::vector<evhttp_bound_socket *> boundSockets;
@@ -244,6 +245,7 @@ static void http_request_cb(struct evhttp_request* req, void* arg)
// Find registered handler for prefix
std::string strURI = hreq->GetURI();
std::string path;
+ LOCK(g_httppathhandlers_mutex);
std::vector<HTTPPathHandler>::const_iterator i = pathHandlers.begin();
std::vector<HTTPPathHandler>::const_iterator iend = pathHandlers.end();
for (; i != iend; ++i) {
@@ -642,11 +644,13 @@ HTTPRequest::RequestMethod HTTPRequest::GetRequestMethod() const
void RegisterHTTPHandler(const std::string &prefix, bool exactMatch, const HTTPRequestHandler &handler)
{
LogPrint(BCLog::HTTP, "Registering HTTP handler for %s (exactmatch %d)\n", prefix, exactMatch);
+ LOCK(g_httppathhandlers_mutex);
pathHandlers.push_back(HTTPPathHandler(prefix, exactMatch, handler));
}
void UnregisterHTTPHandler(const std::string &prefix, bool exactMatch)
{
+ LOCK(g_httppathhandlers_mutex);
std::vector<HTTPPathHandler>::iterator i = pathHandlers.begin();
std::vector<HTTPPathHandler>::iterator iend = pathHandlers.end();
for (; i != iend; ++i)