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`的线程安全性