1. 基本信息
- 反馈者:小学生菲利克斯
- 操作系统:Windows 10
- 目标产物:Windows XP模式 + x86
- 受影响的VC-LTL版本:<= 5.0.6 均受到影响
- 复现概率:尚不明确,其概率与函数持有的栈大小有关,崩溃也不是必然。
- 影响范围:
Windows XP模式且使用到 _wputenv_s的代码将受到影响,其他模式不受到影响。
- dmp信息:win32.7z(QQ发送)
1.1. 临时规避方案
临时改用_wputenv,同时新版本5.0.7将修复此问题。
// 在老版本VC-LTL中 不要使用_wputenv_s,下面是等效的替换。
// _wputenv_s(L"Name", L"");
_wputenv(L"Name=");
1.2. 最小复现代码
int main()
{
// 可观察到 返回值为 22,而非预期的 0。
// 崩溃它不一定发生,除非开启ASAN。
_wputenv_s(L"123", L"");
return 0;
}
2. 问题原因
_wputenv内部为字符串分配缓冲区时,没有正确的 * sizeof(wchar_t),导致实际分配的缓冲区长度小于预期。从而发生越界访问。
具体代码点:https://github.com/Chuyu-Team/VC-LTL5/blob/v5.0.6/ucrtbase.msvcrt/putenv.cpp#L43
3. 问题修复
修正缓冲区长度,重新确认所有 * sizeof 位点有无异常。静态代码分析???
1. 基本信息
Windows XP模式且使用到_wputenv_s的代码将受到影响,其他模式不受到影响。1.1. 临时规避方案
临时改用
_wputenv,同时新版本5.0.7将修复此问题。1.2. 最小复现代码
2. 问题原因
_wputenv内部为字符串分配缓冲区时,没有正确的
* sizeof(wchar_t),导致实际分配的缓冲区长度小于预期。从而发生越界访问。具体代码点:https://github.com/Chuyu-Team/VC-LTL5/blob/v5.0.6/ucrtbase.msvcrt/putenv.cpp#L43
3. 问题修复
修正缓冲区长度,重新确认所有
* sizeof位点有无异常。静态代码分析???