From 252c26bd2086f80d4ef75f57ee5825dee2f60d83 Mon Sep 17 00:00:00 2001 From: Dmitry Goncharov Date: Sun, 23 Oct 2022 15:45:42 -0400 Subject: [PATCH] * src/posixos.c (os_anontmp): If O_TMPFILE fails try dup() method. --- src/posixos.c | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/src/posixos.c b/src/posixos.c index fca31927..48e8cf5c 100644 --- a/src/posixos.c +++ b/src/posixos.c @@ -839,17 +839,22 @@ fd_set_append (int fd) int os_anontmp () { + const char *tdir = get_tmpdir (); int fd = -1; #ifdef O_TMPFILE - EINTRLOOP (fd, open (get_tmpdir (), O_RDWR | O_TMPFILE | O_EXCL, 0600)); - if (fd < 0) - pfatal_with_name ("open(O_TMPFILE)"); -#elif HAVE_DUP - /* We don't have O_TMPFILE but we can dup: if we are creating temp files in - the default location then try tmpfile() + dup() + fclose() to avoid ever - having a name for a file. */ - if (streq (get_tmpdir (), DEFAULT_TMPDIR)) + EINTRLOOP (fd, open (tdir, O_RDWR | O_TMPFILE | O_EXCL, 0600)); + if (fd >= 0) + return fd; + + DB (DB_BASIC, (_("Cannot open '%s' with O_TMPFILE: %s.\n"), + tdir, strerror (errno))); +#endif + +#if HAVE_DUP + /* If we can dup and we are creating temp files in the default location then + try tmpfile() + dup() + fclose() to avoid ever having a named file. */ + if (streq (tdir, DEFAULT_TMPDIR)) { mode_t mask = umask (0077); FILE *tfile;