qt - 有效的 HKEY 可以为 NULL 吗?
问题描述
可以RegOpenKeyEx
/作为有效值RegCreateKeyEx
返回吗?NULL
HKEY
我正在分析QSettings
(https://code.woboq.org/qt5/qtbase/src/corelib/io/qsettings_win.cpp.html#_ZL15createOrOpenKeyiiRK7QStringi)的源代码。
如果NULL
是 的可能有效值HKEY
,则QSettings
' 在 Windows 下的实现存在错误。
解决方案
可以
RegOpenKeyEx
/RegCreateKeyEx
返回 NULL 作为有效的 HKEY 值吗?
不,有效的打开 HKEY
永远不会为 NULL。
另一方面,如果这些函数失败,返回的值HKEY
是不确定的。Win32 API 文档没有说明是否HKEY
在失败时将其设置为 NULL,因此在调用这些函数时不能仅依靠检查返回HKEY
的 NULL 与非 NULL,例如:
HKEY hKey; // uninitialized
RegOpenKeyEx(..., &hKey, ...);
if (hKey) {
// use hKey as needed - undefined behavior!
RegCloseKey(hKey);
}
这些函数在成功时返回 0,在失败时返回非零。调用者必须查看它以确定它是否HKEY
有效,例如:
HKEY hKey;
LONG res = RegOpenKeyEx(..., &hKey, ...);
if (res == ERROR_SUCCESS) {
// use hKey as needed - OK!
RegCloseKey(hKey);
}
而 AFAICSQSettings
正是这样做的,HKEY
在显式检测故障时将其变量显式设置为 NULL,这非常好。
如果 NULL 是 HKEY 的可能有效值
NULL 不是这些函数输出的有效打开值,因此 NULL 可用于应用程序HKEY
在表示未打开的键时将其 s 设置为。就像大多数其他 Win32 句柄/指针类型一样。
then
QSettings
在 Windows 下的实现有 bug。
我在您链接到的代码中没有看到任何此类错误。RegOpeKeyEx()
/的所有使用RegCreateKeyEx()
都是正确的,他们在使用返回之前检查错误代码HKEY
,HKEY
变量被设置为 NULL未打开的键,并且没有对 NULL 执行读/写操作HKEY
。那么漏洞在哪里呢?
推荐阅读
- bash - 如果文件大小为零,如何重复命令?
- cmake - 在构建 azure-iot-sdk-c 示例代码时链接与 libcurl 相关的错误
- python - 通过for循环调用类的属性会导致错误
- ecmascript-6 - SAP Lumira 书签未加载,即使它们已保存
- c - 使用逗号在 c 中解析 .csv 文件的问题
- python - 根据条件对变量进行分组
- php - PHP编码问题:显示询问标记的符号
- javascript - MySQL数据未输出到引导模式
- kubernetes - Kubernetes Pod 跨节点通信,它是如何工作的?
- javascript - 如果这些不是表单的一部分但正在由 javascript 解析,浏览器是否会将键盘输入保存在输入标记中?