Chuyu-Team / VC-LTL5

Shared to msvcrt.dll or ucrtbase.dll and optimize the C/C++ application file size.
Eclipse Public License 2.0
499 stars 48 forks source link

Windows XP模式编译时_wputenv_s发生缓冲区越界访问 #47

Closed mingkuang-Chuyu closed 1 year ago

mingkuang-Chuyu commented 1 year ago

1. 基本信息

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 位点有无异常。静态代码分析???

mingkuang-Chuyu commented 1 year ago

最终修复版本。 https://github.com/Chuyu-Team/VC-LTL5/releases/tag/v5.0.7