fix fd leak in tmpfile when the fdopen operation fails
authorRich Felker <dalias@aerifal.cx>
Fri, 6 Jun 2014 07:17:47 +0000 (03:17 -0400)
committerRich Felker <dalias@aerifal.cx>
Fri, 6 Jun 2014 07:17:47 +0000 (03:17 -0400)
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.

src/stdio/tmpfile.c

index a7d0000..525090a 100644 (file)
@@ -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;
                }
        }