Hasty Briefsbeta

双语

Setenv() isn't threadsafe and even safe Rust didn't save us

a year ago
  • #Rust
  • #Debugging
  • #ARM64
  • EdgeDB在将网络I/O代码从Python移植到Rust时,在ARM64 CI运行器上遭遇崩溃
  • 该问题表面看似死锁,实则是由于`getenv`与`setenv`的竞态条件导致的崩溃
  • 调试发现崩溃发生在`getenv`尝试扫描环境变量时访问了无效内存地址
  • 根本原因是`openssl-probe`调用`setenv`设置SSL证书路径时引发了竞态条件
  • 解决方案是在Linux平台将`reqwest`的后端从`rust-native-tls`/`openssl`切换为`rustls`
  • Rust项目计划在2024版中将环境变量设置函数标记为`unsafe`以防止类似问题
  • 近期`glibc`通过避免`realloc`和泄漏旧环境变量空间的方式改进了`getenv`的线程安全性