diff options
author | Rich Felker <dalias@aerifal.cx> | 2014-06-06 03:17:47 -0400 |
---|---|---|
committer | Rich Felker <dalias@aerifal.cx> | 2014-06-06 03:17:47 -0400 |
commit | 60158bff74e478a8031f618ea5e0546bf41a3523 (patch) | |
tree | 87bcb18c9d4efa3410579d9467b40047f7a91ca3 /src/stdio | |
parent | 2abb70c302efe46dfd8fd9e1d64fa00f1376f428 (diff) | |
download | musl-60158bff74e478a8031f618ea5e0546bf41a3523.tar.gz |
fix fd leak in tmpfile when the fdopen operation fails
this condition could only happen due to malloc failure.
the fdopen operation is also moved to take place after the unlink to
minimize the window during which a link to the file exists in the
directory table.
Diffstat (limited to 'src/stdio')
-rw-r--r-- | src/stdio/tmpfile.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/src/stdio/tmpfile.c b/src/stdio/tmpfile.c index a7d0000a..525090aa 100644 --- a/src/stdio/tmpfile.c +++ b/src/stdio/tmpfile.c @@ -16,12 +16,13 @@ FILE *tmpfile(void) __randname(s+13); fd = sys_open(s, O_RDWR|O_CREAT|O_EXCL, 0600); if (fd >= 0) { - f = __fdopen(fd, "w+"); #ifdef SYS_unlink __syscall(SYS_unlink, s); #else __syscall(SYS_unlinkat, AT_FDCWD, s, 0); #endif + f = __fdopen(fd, "w+"); + if (!f) __syscall(SYS_close, fd); return f; } } |