mktemp: prefer rmdir and unlink to remove

This avoids the following behavior:

    $ strace -e silence=exit -e trace=unlink,rmdir \
        mktemp -d > /dev/full
    unlink("/tmp/tmp.ZBuPmS9ZGD") = -1 EISDIR (Is a directory)
    rmdir("/tmp/tmp.ZBuPmS9ZGD")  = 0
    mktemp: write error: No space left on device

In the above invocation we know that we created a directory, so we
should not remove a regular file that must have been created by another
process:

    $ strace -e silence=exit -e trace=unlink,rmdir \
        ./src/mktemp -d > /dev/full
    rmdir("/tmp/tmp.hGbME1HmJr") = 0
    mktemp: write error: No space left on device

* src/mktemp.c (main): Prefer rmdir and unlink depending on whether we
created a directory or regular file.
* bootstrap.conf (gnulib_modules): Remove the remove module.
This commit is contained in:
Collin Funk
2026-04-10 20:29:54 -07:00
parent 9a3479f1ea
commit 79a6da3be7
2 changed files with 1 additions and 2 deletions
-1
View File
@@ -248,7 +248,6 @@ gnulib_modules="
readtokens0
readutmp
regex
remove
renameat
renameatu
rmdir
+1 -1
View File
@@ -347,7 +347,7 @@ main (int argc, char **argv)
if (!dry_run && ((stdout_closed = true), close_stream (stdout) != 0))
{
int saved_errno = errno;
remove (dest_name);
(create_directory ? rmdir : unlink) (dest_name);
if (!suppress_file_err)
error (0, saved_errno, _("write error"));
status = EXIT_FAILURE;