`
idning
  • 浏览: 139575 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

linux mktemp 不可重入 问题

 
阅读更多

问题起源:

lighttpd 在接收到上传数据(PUT/POST),会生成大小为1M的很多临时文件。

线上最近有很多上传请求,lighttpd 经常报警,说上传的临时文件丢失,


分析

起初怀疑是被其它程序删除,后来勇哥提到,会不会是我们生成临时文件的方法有问题,生成了重名的临时文件?

查了lighttpd 的实现,使用的是mktemp函数:



http://linux.die.net/man/3/mktemp


If the call was successful, the last six bytes of template will have been modified in such a way that the resulting name is unique (does not exist already). If the call was unsuccessful, template is made an empty string.

Never use mktemp(). Some implementations follow 4.3BSD and replace XXXXXX by the current process ID and a single letter, so that at most 26 different names can be returned.



The tempnam() function is re-entrant while mktemp() isn't
不可重入,可能两个进程产生同一个文件名


实验:


a.c

#include<stdio.h>

int main(){

   int i = 0;

   for (i=0; i< 1024*1024*8; i++){

       char s[200] = "/tmp/XXXXXX";                                                                                                                         

       mktemp(s);

       printf("%s\n", s);

   }

}~  



ning@ning-baidu ~/idning/langtest/c/mktemp$ cc a.c
/tmp/ccXoEO8Z.o: In function `main':
a.c:(.text+0x63): warning: the use of `mktemp' is dangerous, better use `mkstemp' or `mkdtemp'
ning@ning-baidu ~/idning/langtest/c/mktemp$ ./a.out > /tmp/x
^C
ning@ning-baidu ~/idning/langtest/c/mktemp$ cat /tmp/x | sort | uniq -c | sort -nr | head
     2 /tmp/ywysSJ
     2 /tmp/YbfzNb
     2 /tmp/wzJUMa
     2 /tmp/WwwcEJ
     2 /tmp/wV6oJe
     2 /tmp/wjsmMR
     2 /tmp/WIefPG
     2 /tmp/wbOxzX
     2 /tmp/UPUz9A
     2 /tmp/uGJcIG


可以看出确实有重名文件生成。

lighttpd源码中使用了:
#define mkstemp(x) open(mktemp(x), O_RDWR)


解决

建议去掉该#define,直接使用可重入的 mkstemp,它会返回:
fd = __open (tmpl,
              (flags & ~O_ACCMODE)
              | O_RDWR | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR);    
打开的文件


Warning: Between the time the pathname is constructed and the file is created another process might have created a file with the same name using mktemp, leading to a possible security hole. The implementation generates names which can hardly be predicted, but when opening the file you should use the O_EXCL flag. Using mkstemp is a safe way to avoid this problem.

分享到:
评论

相关推荐

    Linux基础命令之mktemp详解

    `mktemp`是这些基础命令的扩展,它在处理临时文件时提供了额外的安全性,是系统管理员和开发人员日常工作中不可或缺的一部分。在使用`mktemp`时,理解其选项和用法可以确保临时资源的安全管理和有效利用。

    Linux 常用命令整理

    Linux是一种广泛使用的开源类Unix操作系统,其用户界面是基于命令行的。在Linux环境下,命令行工具和脚本提供了强大的数据操作和系统管理能力。以下是一些Linux系统中常用的命令及其使用方法: 1. 文件和目录操作 ...

    kali linux系统常用命令手册

    Kali Linux提供的命令体系完整且功能强大,从系统管理到文件操作,再到安全测试,每一个命令都是系统管理不可或缺的工具。通过深入学习这些命令,即便是新手也能快速掌握Kali Linux的使用,进而在网络安全领域开展...

    linux 所有命令的集合

    ### Linux命令集合详解 #### ac -- 输出用户连接时间 `ac` 命令用于显示用户的连接时间。这对于了解用户何时登录系统非常有用。 #### access -- 确定文件是否可以存取访问 `access` 命令可以帮助判断一个文件是否...

    Linux命令大全

    2. `chattr`:改变文件的特殊属性,如使文件不可修改。 3. `chgrp`:更改文件或目录的所属组。 4. `chmod`:改变文件或目录的权限设置,如读、写、执行权限。 5. `chown`:改变文件或目录的所有者,通常只有root用户...

    Linux命令全集中文版

    例如,`+i`标志使文件不可更改,`-i`则取消这一限制。 3. **chgrp**:更改文件或目录的所属组。使用格式为`chgrp [选项] group file`。 4. **chmod**:修改文件或目录的权限。例如,`chmod 755 filename`给予所有...

    Linux常用命令--完整

    Linux系统中存在众多的命令行工具,它们支持文件管理...此外,Linux命令的参数和选项众多,大多数命令还支持高级选项,可用于执行更为复杂和专业的任务,用户在实践中应通过man命令获取更多相关信息以加深理解和应用。

    Linux常用命令全集

    `chattr [选项] 属性 文件`,如添加“i”属性使文件不可修改。 - **chgrp**:更改文件所属的组。`chgrp [选项] 组名 文件`,用于改变文件或目录的所有者组。 - **chmod**:更改文件权限。`chmod [选项] 模式 文件`,...

    Linux常用命令集

    ### Linux常用命令集详解 #### 引言 随着信息技术的发展,Linux作为一种开源的操作系统,在服务器领域及开发环境中占据了举足轻重的地位。相比于Windows,Linux以其稳定性和安全性著称,并且具备丰富的命令行工具...

    linux常用命令手册

    - **ftp count**:具体含义不明确,在标准`ftp`命令集中未提及该命令,可能是特定环境中使用的自定义命令或语法错误。 - **ftp shut (ftp shutdown)**:用于关闭`ftp`服务。 - **ftp who**:显示当前连接到`ftp`...

    Linux下对临时文件的操作之mkstemp.docx

    然而,对于`mktemp`、`tmpnam`和`tempnam`这些函数,由于它们在安全性和健壮性方面的不足,通常不推荐在现代编程中使用。`mkstemp`和`tmpfile`提供了更好的解决方案,尤其是考虑到防止文件名冲突和保护文件内容的...

    Linux常用命令手册

    ### Linux常用命令手册知识点 #### 文件传输 - **FTP (File Transfer Protocol)** - `ftp`: 是一种标准网络协议,用于在计算机网络之间传输文件。`ftp` 命令允许用户登录到远程计算机并执行文件上传或下载操作。 ...

    Linux命令手册

    ### Linux命令手册知识点详解 #### 文件目录管理 在Linux系统中,文件目录管理是极其重要的一个环节,涉及到了文件和目录的各种操作。 - **cat**:用于显示文件内容或者连接多个文件并打印到标准输出设备上。 - *...

    linux 命令大全

    - **功能**:压缩可执行文件为.gz格式,并保持其可执行性。 - **用法**:`gzexe [文件]`。 **2.9 GZIP (GNU Zip)** - **功能**:压缩文件为.gz格式。 - **用法**:`gzip [文件]`。 **2.10 LHA** - **功能**:一种...

    使用任何离线或在线媒体文件或流作为PulseAudio源-Linux开发

    依赖于任何POSIX兼容的Shell PulseAudio FFmpeg mktemp(可选,当使用-p文件名运行virtualmic时不需要)安装将脚本复制到任何$ PATH目录中。 在大多数系统上,/ usr / bin是最明智的目录。 用法用法:virtualmic [-p...

    阮一峰 Bash 脚本教程.pdf

    根据提供的文件内容,这份文档是关于阮一峰所编写的Bash脚本教程,主要涉及Linux命令行环境下Bash的基本用法和脚本编程。下面将详细介绍文档中提及的知识点: 1. Bash简介: - Bash(Bourne Again SHell)是Unix...

    SHELL脚本编程教材share.pdf

    - 环境变量对整个shell会话有效,只读变量一旦设定不可更改。 - 位置变量用于存储命令行参数,退出状态码表示命令执行结果。 - 使用`$`引用变量,`$*`和`$@`用于获取所有参数。 4. 流程控制: - 条件选择:`if`...

    6 SHELL脚本编程.pdf

    只读变量是被设置后不可更改的变量。位置变量指的是脚本调用时传入的参数。退出状态码变量存储上一个执行命令的退出状态。 ### 命令和执行 Shell脚本中的命令和执行部分涉及算术运算、逻辑运算、条件测试以及使用...

Global site tag (gtag.js) - Google Analytics