[PR #2211] [MERGED] Fixed data race at OPENSSL_sk_dup/free in libcurl #2392

Closed
opened 2026-03-04 02:05:18 +03:00 by kerem · 0 comments
Owner

📋 Pull Request Information

Original PR: https://github.com/s3fs-fuse/s3fs-fuse/pull/2211
Author: @ggtakec
Created: 7/11/2023
Status: Merged
Merged: 7/12/2023
Merged by: @gaul

Base: masterHead: fix_curl_data_race


📝 Commits (1)

  • e9c77e4 Fixed data race at OPENSSL_sk_dup/free in libcurl

📊 Changes

3 files changed (+30 additions, -16 deletions)

View changed files

📝 src/curl.cpp (+2 -1)
📝 src/curl_handlerpool.cpp (+27 -15)
📝 src/curl_handlerpool.h (+1 -0)

📄 Description

Relevant Issue (if applicable)

#2209

Details

Fixed the following data races that were not fixed in #2209.

WARNING: ThreadSanitizer: data race (pid=11216)
  Write of size 8 at 0x7b080002f920 by thread T170 (mutexes: write M0, write M1):
    #0 free ??:? (s3fs+0x4ad379) (BuildId: 227310a5f6a82ab3f004ee942adca3592e8d83e1)
    #1 OPENSSL_sk_free ??:? (libcrypto.so.3+0x205cfa) (BuildId: 3273586fcac67f861ec301429787310dc38b9e7e)
    #2 S3fsCurl::HeadRequest(char const*, std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, header_nocase_cmp, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >&) /__w/s3fs-fuse/s3fs-fuse/src/curl.cpp:3301 (s3fs+0x58152e) (BuildId: 227310a5f6a82ab3f004ee942adca3592e8d83e1)
    #3 get_object_attribute(char const*, stat*, std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, header_nocase_cmp, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >*, bool, bool*, bool) /__w/s3fs-fuse/s3fs-fuse/src/s3fs.cpp:513 (s3fs+0x538f52) (BuildId: 227310a5f6a82ab3f004ee942adca3592e8d83e1)
    #4 get_object_sse_type(char const*, sse_type_t&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&) /__w/s3fs-fuse/s3fs-fuse/src/s3fs.cpp:837 (s3fs+0x5386c3) (BuildId: 227310a5f6a82ab3f004ee942adca3592e8d83e1)
    #5 S3fsCurl::ParallelGetObjectRequest(char const*, int, long, long) /__w/s3fs-fuse/s3fs-fuse/src/curl.cpp:1638 (s3fs+0x577ec9) (BuildId: 227310a5f6a82ab3f004ee942adca3592e8d83e1)
    #6 FdEntity::Load(long, long, AutoLock::Type, bool) /__w/s3fs-fuse/s3fs-fuse/src/fdcache_entity.cpp:1107 (s3fs+0x5d2eea) (BuildId: 227310a5f6a82ab3f004ee942adca3592e8d83e1)
    #7 FdEntity::Read(int, char*, long, unsigned long, bool) /__w/s3fs-fuse/s3fs-fuse/src/fdcache_entity.cpp:2019 (s3fs+0x5d9d29) (BuildId: 227310a5f6a82ab3f004ee942adca3592e8d83e1)
    #8 s3fs_read(char const*, char*, unsigned long, long, fuse_file_info*) /__w/s3fs-fuse/s3fs-fuse/src/s3fs.cpp:2831 (s3fs+0x549b07) (BuildId: 227310a5f6a82ab3f004ee942adca3592e8d83e1)
    #9 fuse_fs_read_buf ??:? (libfuse.so.2+0xf926) (BuildId: 4db3553f25db655fdcad5600bb328da5dc18736b)

  Previous read of size 8 at 0x7b080002f920 by thread T154:
    #0 memcpy ??:? (s3fs+0x4babd4) (BuildId: 227310a5f6a82ab3f004ee942adca3592e8d83e1)
    #1 OPENSSL_sk_dup ??:? (libcrypto.so.3+0x207433) (BuildId: 3273586fcac67f861ec301429787310dc38b9e7e)
    #2 S3fsCurl::HeadRequest(char const*, std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, header_nocase_cmp, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >&) /__w/s3fs-fuse/s3fs-fuse/src/curl.cpp:3301 (s3fs+0x58152e) (BuildId: 227310a5f6a82ab3f004ee942adca3592e8d83e1)
    #3 get_object_attribute(char const*, stat*, std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, header_nocase_cmp, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >*, bool, bool*, bool) /__w/s3fs-fuse/s3fs-fuse/src/s3fs.cpp:513 (s3fs+0x538f52) (BuildId: 227310a5f6a82ab3f004ee942adca3592e8d83e1)
    #4 check_object_access(char const*, int, stat*) /__w/s3fs-fuse/s3fs-fuse/src/s3fs.cpp:694 (s3fs+0x550394) (BuildId: 227310a5f6a82ab3f004ee942adca3592e8d83e1)
    #5 s3fs_flush(char const*, fuse_file_info*) /__w/s3fs-fuse/s3fs-fuse/src/s3fs.cpp:2907 (s3fs+0x54a2e2) (BuildId: 227310a5f6a82ab3f004ee942adca3592e8d83e1)
    #6 fuse_fs_write ??:? (libfuse.so.2+0x101d1) (BuildId: 4db3553f25db655fdcad5600bb328da5dc18736b)

  Mutex M0 (0x7b4c00090ec0) created at:
    #0 pthread_mutex_init ??:? (s3fs+0x4b0354) (BuildId: 227310a5f6a82ab3f004ee942adca3592e8d83e1)
    #1 FdEntity /__w/s3fs-fuse/s3fs-fuse/src/fdcache_entity.cpp:120 (s3fs+0x5ce977) (BuildId: 227310a5f6a82ab3f004ee942adca3592e8d83e1)
    #2 FdManager::Open(int&, char const*, std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, header_nocase_cmp, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >*, long, timespec const&, int, bool, bool, bool, AutoLock::Type) /__w/s3fs-fuse/s3fs-fuse/src/fdcache.cpp:593 (s3fs+0x5c7e37) (BuildId: 227310a5f6a82ab3f004ee942adca3592e8d83e1)
    #3 AutoFdEntity::Open(char const*, std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, header_nocase_cmp, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >*, long, timespec const&, int, bool, bool, bool, AutoLock::Type) /__w/s3fs-fuse/s3fs-fuse/src/fdcache_auto.cpp:103 (s3fs+0x5e9463) (BuildId: 227310a5f6a82ab3f004ee942adca3592e8d83e1)
    #4 s3fs_open(char const*, fuse_file_info*) /__w/s3fs-fuse/s3fs-fuse/src/s3fs.cpp:2787 (s3fs+0x5495e5) (BuildId: 227310a5f6a82ab3f004ee942adca3592e8d83e1)
    #5 fuse_fs_open ??:? (libfuse.so.2+0xd720) (BuildId: 4db3553f25db655fdcad5600bb328da5dc18736b)

  Mutex M1 (0x7b4c00090fe0) created at:
    #0 pthread_mutex_init ??:? (s3fs+0x4b0354) (BuildId: 227310a5f6a82ab3f004ee942adca3592e8d83e1)
    #1 FdEntity /__w/s3fs-fuse/s3fs-fuse/src/fdcache_entity.cpp:124 (s3fs+0x5ce9d4) (BuildId: 227310a5f6a82ab3f004ee942adca3592e8d83e1)
    #2 FdManager::Open(int&, char const*, std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, header_nocase_cmp, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >*, long, timespec const&, int, bool, bool, bool, AutoLock::Type) /__w/s3fs-fuse/s3fs-fuse/src/fdcache.cpp:593 (s3fs+0x5c7e37) (BuildId: 227310a5f6a82ab3f004ee942adca3592e8d83e1)
    #3 AutoFdEntity::Open(char const*, std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, header_nocase_cmp, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >*, long, timespec const&, int, bool, bool, bool, AutoLock::Type) /__w/s3fs-fuse/s3fs-fuse/src/fdcache_auto.cpp:103 (s3fs+0x5e9463) (BuildId: 227310a5f6a82ab3f004ee942adca3592e8d83e1)
    #4 s3fs_open(char const*, fuse_file_info*) /__w/s3fs-fuse/s3fs-fuse/src/s3fs.cpp:2787 (s3fs+0x5495e5) (BuildId: 227310a5f6a82ab3f004ee942adca3592e8d83e1)
    #5 fuse_fs_open ??:? (libfuse.so.2+0xd720) (BuildId: 4db3553f25db655fdcad5600bb328da5dc18736b)

  Thread T170 (tid=11897, running) created by thread T155 at:
    #0 pthread_create ??:? (s3fs+0x4ae98f) (BuildId: 227310a5f6a82ab3f004ee942adca3592e8d83e1)
    #1 <null> <null> (libfuse.so.2+0xc4e0) (BuildId: 4db3553f25db655fdcad5600bb328da5dc18736b)

  Thread T154 (tid=11872, running) created by thread T81 at:
    #0 pthread_create ??:? (s3fs+0x4ae98f) (BuildId: 227310a5f6a82ab3f004ee942adca3592e8d83e1)
    #1 <null> <null> (libfuse.so.2+0xc4e0) (BuildId: 4db3553f25db655fdcad5600bb328da5dc18736b)

SUMMARY: ThreadSanitizer: data race ??:? in __interceptor_free

The above log reported that there is a data race between OPENSSL_sk_free and OPENSSL_sk_dup called from S3fsCurl::HeadRequest.
(this data race could occur in rare cases with the test_concurrent_writes CI test.)

This fix may not be accurate as the stack beyond S3fsCurl::HeadRequest is not recorded.
However, I suspect that the conflict between OPENSSL_sk_free and OPENSSL_sk_dup is caused by calls to curl_easy_init, curl_easy_reset and curl_easy_cleanup.
(In current master code, only curl_easy_reset is not exclusive control is not possible.)
Then I implemented all these calls in the CurlHandlerPool class, and changed the exclusive control within the CurlHandlerPool class.

I've run many times of problematic CI tests and now no errors are detected.


🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.

## 📋 Pull Request Information **Original PR:** https://github.com/s3fs-fuse/s3fs-fuse/pull/2211 **Author:** [@ggtakec](https://github.com/ggtakec) **Created:** 7/11/2023 **Status:** ✅ Merged **Merged:** 7/12/2023 **Merged by:** [@gaul](https://github.com/gaul) **Base:** `master` ← **Head:** `fix_curl_data_race` --- ### 📝 Commits (1) - [`e9c77e4`](https://github.com/s3fs-fuse/s3fs-fuse/commit/e9c77e48193bdfda7f101ee515afea15abf2e6d6) Fixed data race at OPENSSL_sk_dup/free in libcurl ### 📊 Changes **3 files changed** (+30 additions, -16 deletions) <details> <summary>View changed files</summary> 📝 `src/curl.cpp` (+2 -1) 📝 `src/curl_handlerpool.cpp` (+27 -15) 📝 `src/curl_handlerpool.h` (+1 -0) </details> ### 📄 Description ### Relevant Issue (if applicable) #2209 ### Details Fixed the following data races that were not fixed in #2209. ``` WARNING: ThreadSanitizer: data race (pid=11216) Write of size 8 at 0x7b080002f920 by thread T170 (mutexes: write M0, write M1): #0 free ??:? (s3fs+0x4ad379) (BuildId: 227310a5f6a82ab3f004ee942adca3592e8d83e1) #1 OPENSSL_sk_free ??:? (libcrypto.so.3+0x205cfa) (BuildId: 3273586fcac67f861ec301429787310dc38b9e7e) #2 S3fsCurl::HeadRequest(char const*, std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, header_nocase_cmp, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >&) /__w/s3fs-fuse/s3fs-fuse/src/curl.cpp:3301 (s3fs+0x58152e) (BuildId: 227310a5f6a82ab3f004ee942adca3592e8d83e1) #3 get_object_attribute(char const*, stat*, std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, header_nocase_cmp, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >*, bool, bool*, bool) /__w/s3fs-fuse/s3fs-fuse/src/s3fs.cpp:513 (s3fs+0x538f52) (BuildId: 227310a5f6a82ab3f004ee942adca3592e8d83e1) #4 get_object_sse_type(char const*, sse_type_t&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&) /__w/s3fs-fuse/s3fs-fuse/src/s3fs.cpp:837 (s3fs+0x5386c3) (BuildId: 227310a5f6a82ab3f004ee942adca3592e8d83e1) #5 S3fsCurl::ParallelGetObjectRequest(char const*, int, long, long) /__w/s3fs-fuse/s3fs-fuse/src/curl.cpp:1638 (s3fs+0x577ec9) (BuildId: 227310a5f6a82ab3f004ee942adca3592e8d83e1) #6 FdEntity::Load(long, long, AutoLock::Type, bool) /__w/s3fs-fuse/s3fs-fuse/src/fdcache_entity.cpp:1107 (s3fs+0x5d2eea) (BuildId: 227310a5f6a82ab3f004ee942adca3592e8d83e1) #7 FdEntity::Read(int, char*, long, unsigned long, bool) /__w/s3fs-fuse/s3fs-fuse/src/fdcache_entity.cpp:2019 (s3fs+0x5d9d29) (BuildId: 227310a5f6a82ab3f004ee942adca3592e8d83e1) #8 s3fs_read(char const*, char*, unsigned long, long, fuse_file_info*) /__w/s3fs-fuse/s3fs-fuse/src/s3fs.cpp:2831 (s3fs+0x549b07) (BuildId: 227310a5f6a82ab3f004ee942adca3592e8d83e1) #9 fuse_fs_read_buf ??:? (libfuse.so.2+0xf926) (BuildId: 4db3553f25db655fdcad5600bb328da5dc18736b) Previous read of size 8 at 0x7b080002f920 by thread T154: #0 memcpy ??:? (s3fs+0x4babd4) (BuildId: 227310a5f6a82ab3f004ee942adca3592e8d83e1) #1 OPENSSL_sk_dup ??:? (libcrypto.so.3+0x207433) (BuildId: 3273586fcac67f861ec301429787310dc38b9e7e) #2 S3fsCurl::HeadRequest(char const*, std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, header_nocase_cmp, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >&) /__w/s3fs-fuse/s3fs-fuse/src/curl.cpp:3301 (s3fs+0x58152e) (BuildId: 227310a5f6a82ab3f004ee942adca3592e8d83e1) #3 get_object_attribute(char const*, stat*, std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, header_nocase_cmp, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >*, bool, bool*, bool) /__w/s3fs-fuse/s3fs-fuse/src/s3fs.cpp:513 (s3fs+0x538f52) (BuildId: 227310a5f6a82ab3f004ee942adca3592e8d83e1) #4 check_object_access(char const*, int, stat*) /__w/s3fs-fuse/s3fs-fuse/src/s3fs.cpp:694 (s3fs+0x550394) (BuildId: 227310a5f6a82ab3f004ee942adca3592e8d83e1) #5 s3fs_flush(char const*, fuse_file_info*) /__w/s3fs-fuse/s3fs-fuse/src/s3fs.cpp:2907 (s3fs+0x54a2e2) (BuildId: 227310a5f6a82ab3f004ee942adca3592e8d83e1) #6 fuse_fs_write ??:? (libfuse.so.2+0x101d1) (BuildId: 4db3553f25db655fdcad5600bb328da5dc18736b) Mutex M0 (0x7b4c00090ec0) created at: #0 pthread_mutex_init ??:? (s3fs+0x4b0354) (BuildId: 227310a5f6a82ab3f004ee942adca3592e8d83e1) #1 FdEntity /__w/s3fs-fuse/s3fs-fuse/src/fdcache_entity.cpp:120 (s3fs+0x5ce977) (BuildId: 227310a5f6a82ab3f004ee942adca3592e8d83e1) #2 FdManager::Open(int&, char const*, std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, header_nocase_cmp, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >*, long, timespec const&, int, bool, bool, bool, AutoLock::Type) /__w/s3fs-fuse/s3fs-fuse/src/fdcache.cpp:593 (s3fs+0x5c7e37) (BuildId: 227310a5f6a82ab3f004ee942adca3592e8d83e1) #3 AutoFdEntity::Open(char const*, std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, header_nocase_cmp, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >*, long, timespec const&, int, bool, bool, bool, AutoLock::Type) /__w/s3fs-fuse/s3fs-fuse/src/fdcache_auto.cpp:103 (s3fs+0x5e9463) (BuildId: 227310a5f6a82ab3f004ee942adca3592e8d83e1) #4 s3fs_open(char const*, fuse_file_info*) /__w/s3fs-fuse/s3fs-fuse/src/s3fs.cpp:2787 (s3fs+0x5495e5) (BuildId: 227310a5f6a82ab3f004ee942adca3592e8d83e1) #5 fuse_fs_open ??:? (libfuse.so.2+0xd720) (BuildId: 4db3553f25db655fdcad5600bb328da5dc18736b) Mutex M1 (0x7b4c00090fe0) created at: #0 pthread_mutex_init ??:? (s3fs+0x4b0354) (BuildId: 227310a5f6a82ab3f004ee942adca3592e8d83e1) #1 FdEntity /__w/s3fs-fuse/s3fs-fuse/src/fdcache_entity.cpp:124 (s3fs+0x5ce9d4) (BuildId: 227310a5f6a82ab3f004ee942adca3592e8d83e1) #2 FdManager::Open(int&, char const*, std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, header_nocase_cmp, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >*, long, timespec const&, int, bool, bool, bool, AutoLock::Type) /__w/s3fs-fuse/s3fs-fuse/src/fdcache.cpp:593 (s3fs+0x5c7e37) (BuildId: 227310a5f6a82ab3f004ee942adca3592e8d83e1) #3 AutoFdEntity::Open(char const*, std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, header_nocase_cmp, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >*, long, timespec const&, int, bool, bool, bool, AutoLock::Type) /__w/s3fs-fuse/s3fs-fuse/src/fdcache_auto.cpp:103 (s3fs+0x5e9463) (BuildId: 227310a5f6a82ab3f004ee942adca3592e8d83e1) #4 s3fs_open(char const*, fuse_file_info*) /__w/s3fs-fuse/s3fs-fuse/src/s3fs.cpp:2787 (s3fs+0x5495e5) (BuildId: 227310a5f6a82ab3f004ee942adca3592e8d83e1) #5 fuse_fs_open ??:? (libfuse.so.2+0xd720) (BuildId: 4db3553f25db655fdcad5600bb328da5dc18736b) Thread T170 (tid=11897, running) created by thread T155 at: #0 pthread_create ??:? (s3fs+0x4ae98f) (BuildId: 227310a5f6a82ab3f004ee942adca3592e8d83e1) #1 <null> <null> (libfuse.so.2+0xc4e0) (BuildId: 4db3553f25db655fdcad5600bb328da5dc18736b) Thread T154 (tid=11872, running) created by thread T81 at: #0 pthread_create ??:? (s3fs+0x4ae98f) (BuildId: 227310a5f6a82ab3f004ee942adca3592e8d83e1) #1 <null> <null> (libfuse.so.2+0xc4e0) (BuildId: 4db3553f25db655fdcad5600bb328da5dc18736b) SUMMARY: ThreadSanitizer: data race ??:? in __interceptor_free ``` The above log reported that there is a data race between `OPENSSL_sk_free` and `OPENSSL_sk_dup` called from `S3fsCurl::HeadRequest`. _(this data race could occur in rare cases with the `test_concurrent_writes` CI test.)_ This fix may not be accurate as the stack beyond `S3fsCurl::HeadRequest` is not recorded. However, I suspect that the conflict between `OPENSSL_sk_free` and `OPENSSL_sk_dup` is caused by calls to `curl_easy_init`, `curl_easy_reset` and `curl_easy_cleanup`. _(In current master code, only `curl_easy_reset` is not exclusive control is not possible.)_ Then I implemented all these calls in the `CurlHandlerPool` class, and changed the exclusive control within the `CurlHandlerPool` class. I've run many times of problematic CI tests and now no errors are detected. --- <sub>🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.</sub>
kerem 2026-03-04 02:05:18 +03:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
starred/s3fs-fuse#2392
No description provided.