Skip to content

Commit 69bbead

Browse files
fchevassu-antidotetr
authored andcommitted
Protect webserver::registered_resources_*
1 parent 49648b2 commit 69bbead

File tree

2 files changed

+43
-35
lines changed

2 files changed

+43
-35
lines changed

src/httpserver/webserver.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
#include <map>
4444
#include <memory>
4545
#include <set>
46+
#include <shared_mutex>
4647
#include <string>
4748

4849
#ifdef HAVE_GNUTLS
@@ -179,6 +180,7 @@ class webserver {
179180
const render_ptr not_found_resource;
180181
const render_ptr method_not_allowed_resource;
181182
const render_ptr internal_error_resource;
183+
std::shared_mutex registered_resources_mutex;
182184
std::map<details::http_endpoint, http_resource*> registered_resources;
183185
std::map<std::string, http_resource*> registered_resources_str;
184186

src/webserver.cpp

Lines changed: 41 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
#include <iosfwd>
4545
#include <iostream>
4646
#include <memory>
47+
#include <mutex>
4748
#include <set>
4849
#include <stdexcept>
4950
#include <string>
@@ -196,6 +197,7 @@ bool webserver::register_resource(const std::string& resource, http_resource* hr
196197

197198
details::http_endpoint idx(resource, family, true, regex_checking);
198199

200+
std::unique_lock registered_resources_lock(registered_resources_mutex);
199201
pair<map<details::http_endpoint, http_resource*>::iterator, bool> result = registered_resources.insert(map<details::http_endpoint, http_resource*>::value_type(idx, hrm));
200202

201203
if (!family && result.second) {
@@ -370,6 +372,7 @@ bool webserver::stop() {
370372
void webserver::unregister_resource(const string& resource) {
371373
// family does not matter - it just checks the url_normalized anyhow
372374
details::http_endpoint he(resource, false, true, regex_checking);
375+
std::unique_lock registered_resources_lock(registered_resources_mutex);
373376
registered_resources.erase(he);
374377
registered_resources.erase(he.get_url_complete());
375378
registered_resources_str.erase(he.get_url_complete());
@@ -676,51 +679,54 @@ MHD_Result webserver::finalize_answer(MHD_Connection* connection, struct details
676679

677680
bool found = false;
678681
struct MHD_Response* raw_response;
679-
if (!single_resource) {
680-
const char* st_url = mr->standardized_url->c_str();
681-
fe = registered_resources_str.find(st_url);
682-
if (fe == registered_resources_str.end()) {
683-
if (regex_checking) {
684-
map<details::http_endpoint, http_resource*>::iterator found_endpoint;
685-
686-
details::http_endpoint endpoint(st_url, false, false, false);
687-
688-
map<details::http_endpoint, http_resource*>::iterator it;
689-
690-
size_t len = 0;
691-
size_t tot_len = 0;
692-
for (it = registered_resources.begin(); it != registered_resources.end(); ++it) {
693-
size_t endpoint_pieces_len = (*it).first.get_url_pieces().size();
694-
size_t endpoint_tot_len = (*it).first.get_url_complete().size();
695-
if (!found || endpoint_pieces_len > len || (endpoint_pieces_len == len && endpoint_tot_len > tot_len)) {
696-
if ((*it).first.match(endpoint)) {
697-
found = true;
698-
len = endpoint_pieces_len;
699-
tot_len = endpoint_tot_len;
700-
found_endpoint = it;
682+
{
683+
std::shared_lock registered_resources_lock(registered_resources_mutex);
684+
if (!single_resource) {
685+
const char* st_url = mr->standardized_url->c_str();
686+
fe = registered_resources_str.find(st_url);
687+
if (fe == registered_resources_str.end()) {
688+
if (regex_checking) {
689+
map<details::http_endpoint, http_resource*>::iterator found_endpoint;
690+
691+
details::http_endpoint endpoint(st_url, false, false, false);
692+
693+
map<details::http_endpoint, http_resource*>::iterator it;
694+
695+
size_t len = 0;
696+
size_t tot_len = 0;
697+
for (it = registered_resources.begin(); it != registered_resources.end(); ++it) {
698+
size_t endpoint_pieces_len = (*it).first.get_url_pieces().size();
699+
size_t endpoint_tot_len = (*it).first.get_url_complete().size();
700+
if (!found || endpoint_pieces_len > len || (endpoint_pieces_len == len && endpoint_tot_len > tot_len)) {
701+
if ((*it).first.match(endpoint)) {
702+
found = true;
703+
len = endpoint_pieces_len;
704+
tot_len = endpoint_tot_len;
705+
found_endpoint = it;
706+
}
701707
}
702708
}
703-
}
704709

705-
if (found) {
706-
vector<string> url_pars = found_endpoint->first.get_url_pars();
710+
if (found) {
711+
vector<string> url_pars = found_endpoint->first.get_url_pars();
707712

708-
vector<string> url_pieces = endpoint.get_url_pieces();
709-
vector<int> chunks = found_endpoint->first.get_chunk_positions();
710-
for (unsigned int i = 0; i < url_pars.size(); i++) {
711-
mr->dhr->set_arg(url_pars[i], url_pieces[chunks[i]]);
712-
}
713+
vector<string> url_pieces = endpoint.get_url_pieces();
714+
vector<int> chunks = found_endpoint->first.get_chunk_positions();
715+
for (unsigned int i = 0; i < url_pars.size(); i++) {
716+
mr->dhr->set_arg(url_pars[i], url_pieces[chunks[i]]);
717+
}
713718

714-
hrm = found_endpoint->second;
719+
hrm = found_endpoint->second;
720+
}
715721
}
722+
} else {
723+
hrm = fe->second;
724+
found = true;
716725
}
717726
} else {
718-
hrm = fe->second;
727+
hrm = registered_resources.begin()->second;
719728
found = true;
720729
}
721-
} else {
722-
hrm = registered_resources.begin()->second;
723-
found = true;
724730
}
725731

726732
if (found) {

0 commit comments

Comments
 (0)