C++ win32的mkstemp()实现
有谁能告诉我在Win32上实现mkstemp()(C/C++)或非常接近模拟的代码吗 必须是无种族的 应该看起来像C++ win32的mkstemp()实现,c++,winapi,mkstemp,C++,Winapi,Mkstemp,有谁能告诉我在Win32上实现mkstemp()(C/C++)或非常接近模拟的代码吗 必须是无种族的 应该看起来像 #include <windows.h> #include <io.h> // port of mkstemp() to win32. race-free. // behaviour as described in http://linux.die.net/man/3/mkstemp // int mkstemp(char *template) {
#include <windows.h>
#include <io.h>
// port of mkstemp() to win32. race-free.
// behaviour as described in http://linux.die.net/man/3/mkstemp
//
int mkstemp(char *template) {
...
}
#包括
#包括
//mkstemp()到win32的端口。无种族歧视。
//如中所述的行为http://linux.die.net/man/3/mkstemp
//
int mkstemp(字符*模板){
...
}
谢谢您可以使用从库中提取的以下函数(从文件
src/stdlib_extras.cpp
)
您可以轻松地从中删除mkstemp支持。您可以使用从库中提取的以下函数(从文件
src/stdlib_extras.cpp
)
您可以轻松取消对mkstemp的支持。您可以使用函数或其任何变体:
errno_t _mktemp_s(
char *template,
size_t sizeInChars
);
其中:
- 模板:文件名模式
- sizeInChars:缓冲区的大小(以单字节字符为单位,在
中);\u mktemp\u s
中的宽字符,包括空终止符\u wmktemp\u s
模板
参数。您可以使用函数或其任何变体:
errno_t _mktemp_s(
char *template,
size_t sizeInChars
);
其中:
- 模板:文件名模式
- sizeInChars:缓冲区的大小(以单字节字符为单位,在
中);\u mktemp\u s
中的宽字符,包括空终止符\u wmktemp\u s
模板
参数。实际上,使用_mktemp_s()是一个非常糟糕的想法——在任何一个上下文中只有26个可能的候选文件名,并且由于攻击范围有限,它暴露了mkstemp()设计用来克服的竞争条件。然而,另一个提议的解决方案虽然好得多,但也有缺陷,因为它在选择替代文件名字符时有62个自由度,而Windows文件系统的大小写不敏感消耗了其中的26个,因此只剩下36个;这具有将选择任何逻辑上可区分的字母字符的概率加权为数字字符概率的两倍的效果
考虑到这一点,我在这里发布了一个MinGW补丁:
如果采用,这将正式地将mkstemp()和mkdtemp()添加到标准的MinGW发行版中。实际上,使用_mktemp_s()是一个非常糟糕的想法--在任何一个上下文中只有26个可能的候选文件名,并且,由于攻击范围有限,它暴露了mkstemp()的竞争条件是为了克服这些困难而设计的。然而,另一个提议的解决方案虽然好得多,但也有缺陷,因为它在选择替代文件名字符时有62个自由度,而Windows文件系统的大小写不敏感消耗了其中的26个,因此只剩下36个;这具有将选择任何逻辑上可区分的字母字符的概率加权为数字字符概率的两倍的效果
考虑到这一点,我在这里发布了一个MinGW补丁:
如果采用,这将正式将mkstemp()和mkdtemp()添加到标准的MinGW发行版。使用
\u mktemp\u s()
肯定比重新发明轮子要好。但请注意,与POSIX的mkstemp()
不同,它不会打开文件或返回fd。它只返回一个文件名字符串,您必须自己打开它。使用\u mktemp\u s()
肯定比重新发明轮子要好。但请注意,与POSIX的mkstemp()
不同,它不会打开文件或返回fd。它只返回一个文件名字符串,您必须自己打开它。作为记录,MinGW.org现在在MinGW运行库mingwrt-3.21及更高版本中提供了mkstemp()和mkdtemp()(但在有致命缺陷的mingwrt-4.x变体中没有,这些变体现在已从常规版本中退出)。您有关于退出的链接吗?查看sourceforge文件部分,我可以看到一些mingwrt 4er版本可供使用。为了记录在案,MinGW.org现在在MinGW运行时库的发行版mingwrt-3.21和更高版本中提供了mkstemp()和mkdtemp()(但在有致命缺陷的mingwrt-4.x变体中没有,这些变体现在已经从通用版本中退出).你有关于提款的链接吗?查看sourceforge文件部分,我可以看到一些mingwrt 4er版本可供使用。@Andrei,请注意这个建议的实现中的缺陷:它错误地将62个自由度归因于文件名字符的选择,而实际上只有36个;(在MS Windows文件名中,大写和小写字母无法区分)。此外,Windows有更好的API来生成加密安全的随机数序列,而不是这里所示的技术。正如代码片段顶部所说,此实现(包括代码注释)取自glibc,特别是sysdeps/posix/tempname.c
中的\uu gen\u tempname
。正如@KeithMarshall所指出的,它向Windows的转换是不完整的,可能会有更多的陷阱…@Andrei,请注意这个提议的实现中的缺陷:它错误地将62个自由度归因于文件名字符的选择,而实际上只有36个;(在MS Windows文件名中,大写和小写字母无法区分)。此外,Windows有更好的API来生成加密安全的随机数序列,而不是这里所示的技术。正如代码片段顶部所说,此实现(包括代码注释)取自glibc,特别是sysdeps/posix/tempname.c
中的\uu gen\u tempname
。正如@KeithMarshall所指出的,它到Windows的转换是不完整的,可能还有更多的陷阱。。。
errno_t _mktemp_s(
char *template,
size_t sizeInChars
);