From 13e8e092a6c795c82b80b3c166239902d36251b0 Mon Sep 17 00:00:00 2001 From: Jonas 'Sortie' Termansen Date: Tue, 2 Jun 2015 13:31:43 +0200 Subject: [PATCH] Fix mkostemps and mkdtemp not restoring X's on error. --- libc/stdlib/mkdtemp.cpp | 2 ++ libc/stdlib/mkostemps.cpp | 11 +++++++---- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/libc/stdlib/mkdtemp.cpp b/libc/stdlib/mkdtemp.cpp index b16dec7d..7e34d017 100644 --- a/libc/stdlib/mkdtemp.cpp +++ b/libc/stdlib/mkdtemp.cpp @@ -59,5 +59,7 @@ extern "C" char* mkdtemp(char* templ) return templ; } while ( errno == EEXIST ); + memcpy(templ + xpos, "XXXXXX", 6); + return NULL; } diff --git a/libc/stdlib/mkostemps.cpp b/libc/stdlib/mkostemps.cpp index 66751638..c2a79487 100644 --- a/libc/stdlib/mkostemps.cpp +++ b/libc/stdlib/mkostemps.cpp @@ -54,13 +54,16 @@ extern "C" int mkostemps(char* templ, int suffixlen, int flags) return errno = EINVAL, -1; flags &= ~O_ACCMODE; - int fd; do { for ( size_t i = 0; i < 6; i++ ) templ[xpos + i] = random_character(); - } while ( (fd = open(templ, flags | O_RDWR | O_EXCL | O_CREAT, 0600)) < 0 && - (errno == EEXIST) ); + int fd = open(templ, flags | O_RDWR | O_EXCL | O_CREAT, 0600); + if ( 0 <= fd ) + return fd; + } while ( errno == EEXIST ); - return fd; + memcpy(templ + xpos, "XXXXXX", 6); + + return -1; }