diff options
author | MacroFake <falke.marco@gmail.com> | 2022-10-24 11:46:09 +0200 |
---|---|---|
committer | MacroFake <falke.marco@gmail.com> | 2022-10-24 11:46:15 +0200 |
commit | 6164618964549f44beb48c796ef12b14452fab4f (patch) | |
tree | c5f6ee000018279579b811838e80c13c836cde34 | |
parent | 2d3161fdd5787632a1a2d3bb1a749a6eb3072cf2 (diff) | |
parent | 2c6c628ab95b018ac7ce6595954644bf9197ce35 (diff) | |
download | bitcoin-6164618964549f44beb48c796ef12b14452fab4f.tar.xz |
Merge bitcoin/bitcoin#26034: [22.x] Prevent data race for `pathHandlers`
2c6c628ab95b018ac7ce6595954644bf9197ce35 Prevent data race for `pathHandlers` (Hennadii Stepanov)
Pull request description:
Backport of https://github.com/bitcoin/bitcoin/pull/25983 to the 22.x branch.
ACKs for top commit:
dergoegge:
ACK 2c6c628ab95b018ac7ce6595954644bf9197ce35
Tree-SHA512: 9b172f73407fdd5a79e67ed1b2b3b7c6e7989ea1de6757c839ee7040d62ebbd87d10770c6fcb39709a07d52345dc9b7b244ef2b490c9ad8a656ff8ad4d618a01
-rw-r--r-- | src/httpserver.cpp | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/src/httpserver.cpp b/src/httpserver.cpp index 8741ad9b86..fb00fbc30b 100644 --- a/src/httpserver.cpp +++ b/src/httpserver.cpp @@ -138,7 +138,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; @@ -239,6 +240,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) { @@ -633,11 +635,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) |