From 8210a1b2f259447acddd5fd93f95e3984609db9b Mon Sep 17 00:00:00 2001 From: Andrew Gaul Date: Mon, 17 Aug 2020 09:10:49 +0900 Subject: [PATCH] Consistently lock curl_times and curl_progress References #1362. --- src/curl.cpp | 13 ++++++++++--- src/curl.h | 2 +- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/curl.cpp b/src/curl.cpp index 1cdde81..5a25014 100644 --- a/src/curl.cpp +++ b/src/curl.cpp @@ -419,8 +419,11 @@ string S3fsCurl::IAM_token_field = "Token"; string S3fsCurl::IAM_expiry_field = "Expiration"; string S3fsCurl::IAM_role; long S3fsCurl::ssl_verify_hostname = 1; // default(original code...) + +// protected by curl_handles_lock curltime_t S3fsCurl::curl_times; curlprogress_t S3fsCurl::curl_progress; + string S3fsCurl::curl_ca_bundle; mimes_t S3fsCurl::mimeTypes; string S3fsCurl::userAgent; @@ -2132,7 +2135,7 @@ S3fsCurl::~S3fsCurl() DestroyCurlHandle(); } -bool S3fsCurl::ResetHandle() +bool S3fsCurl::ResetHandle(bool lock_already_held) { static volatile bool run_once = false; // emit older curl warnings only once curl_easy_reset(hCurl); @@ -2179,6 +2182,7 @@ bool S3fsCurl::ResetHandle() curl_easy_setopt(hCurl, CURLOPT_SSL_CIPHER_LIST, cipher_suites.c_str()); } + AutoLock lock(&S3fsCurl::curl_handles_lock, lock_already_held ? AutoLock::ALREADY_LOCKED : AutoLock::NONE); S3fsCurl::curl_times[hCurl] = time(0); S3fsCurl::curl_progress[hCurl] = progress_t(-1, -1); @@ -2211,7 +2215,7 @@ bool S3fsCurl::CreateCurlHandle(bool only_pool, bool remake) } } - ResetHandle(); + ResetHandle(/*lock_already_held=*/ true); return true; } @@ -2600,7 +2604,10 @@ int S3fsCurl::RequestPerform(bool dontAddAuthHeaders /*=false*/) case CURLE_ABORTED_BY_CALLBACK: S3FS_PRN_ERR("### CURLE_ABORTED_BY_CALLBACK"); sleep(4); - S3fsCurl::curl_times[hCurl] = time(0); + { + AutoLock lock(&S3fsCurl::curl_handles_lock); + S3fsCurl::curl_times[hCurl] = time(0); + } break; case CURLE_PARTIAL_FILE: diff --git a/src/curl.h b/src/curl.h index c164cce..a9ffdaa 100644 --- a/src/curl.h +++ b/src/curl.h @@ -394,7 +394,7 @@ class S3fsCurl static int RawCurlDebugFunc(CURL* hcurl, curl_infotype type, char* data, size_t size, void* userptr, curl_infotype datatype); // methods - bool ResetHandle(void); + bool ResetHandle(bool lock_already_held = false); bool RemakeHandle(void); bool ClearInternalData(void); void insertV4Headers();