Skip to content

Commit 98c52e7

Browse files
committed
Unlock CurlStack mutex before calling CurlGet::activate_unsafe().
1 parent 54c14f8 commit 98c52e7

3 files changed

Lines changed: 10 additions & 6 deletions

File tree

src/net/curl_get.cc

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,7 @@ CurlGet::prepare_start_unsafe(CurlStack* stack) {
252252

253253
try {
254254
try {
255-
if (prepare_resolve(m_initial_resolve))
255+
if (prepare_resolve_unsafe(m_initial_resolve))
256256
return true;
257257

258258
} catch (const torrent::input_error& e) {
@@ -264,7 +264,7 @@ CurlGet::prepare_start_unsafe(CurlStack* stack) {
264264

265265
m_retrying_resolve = true;
266266

267-
if (prepare_resolve(m_retry_resolve))
267+
if (prepare_resolve_unsafe(m_retry_resolve))
268268
return true;
269269

270270
throw torrent::input_error("Exhausted all resolve options.");
@@ -354,7 +354,7 @@ CurlGet::retry_resolve() {
354354
m_retrying_resolve = true;
355355

356356
try {
357-
if (!prepare_resolve(m_retry_resolve))
357+
if (!prepare_resolve_unsafe(m_retry_resolve))
358358
return false;
359359

360360
activate_unsafe();
@@ -401,7 +401,7 @@ CurlGet::receive_write(const char* data, size_t size, size_t nmemb, CurlGet* han
401401
}
402402

403403
bool
404-
CurlGet::prepare_resolve(resolve_type current_resolve) {
404+
CurlGet::prepare_resolve_unsafe(resolve_type current_resolve) {
405405
auto [bind_inet_address, bind_inet6_address] = config::network_config()->bind_addresses_or_null();
406406

407407
int detected_family = utils::uri_detect_numeric(m_url);
@@ -437,7 +437,7 @@ CurlGet::prepare_resolve(resolve_type current_resolve) {
437437
return false;
438438

439439
default:
440-
throw torrent::internal_error("CurlGet::prepare_start_unsafe() reached unreachable code with invalid current_resolve.");
440+
throw torrent::internal_error("CurlGet::prepare_resolve_unsafe() reached unreachable code with invalid current_resolve.");
441441
}
442442
}
443443

src/net/curl_get.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ class CurlGet {
106106

107107
static size_t receive_write(const char* data, size_t size, size_t nmemb, CurlGet* handle);
108108

109-
bool prepare_resolve(resolve_type current_resolve);
109+
bool prepare_resolve_unsafe(resolve_type current_resolve);
110110

111111
mutable std::mutex m_mutex;
112112

src/net/curl_stack.cc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,10 @@ CurlStack::start_get(const std::shared_ptr<CurlGet>& curl_get) {
126126

127127
base_type::push_back(curl_get);
128128

129+
// Calling curl_multi_add_handle() can result in CurlSocket::receive_socket() being called,
130+
// which calls CurlStack::is_running().
131+
m_mutex.unlock();
132+
129133
curl_get->activate_unsafe();
130134
}
131135
}

0 commit comments

Comments
 (0)