]> Savannah Git Hosting - gnulib.git/commitdiff
openat: don’t lose track of save_cwd errno
authorPaul Eggert <eggert@cs.ucla.edu>
Mon, 18 Nov 2024 15:54:54 +0000 (07:54 -0800)
committerPaul Eggert <eggert@cs.ucla.edu>
Wed, 20 Nov 2024 19:23:32 +0000 (11:23 -0800)
* lib/openat.c (openat_permissive): When ‘close’ is called
after save_cwd failed, don’t lose track of save_cwd’s errno.
This fixes a recently-introduced unlikely bug.

ChangeLog
lib/openat.c

index 79e240c1fc7cbcfbec1fd9112f22db85dd4aee9b..13f68f57ce26e53ab9daac29f45e777ed0d85618 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2024-11-20  Paul Eggert  <eggert@cs.ucla.edu>
+
+       openat: don’t lose track of save_cwd errno
+       * lib/openat.c (openat_permissive): When ‘close’ is called
+       after save_cwd failed, don’t lose track of save_cwd’s errno.
+       This fixes a recently-introduced unlikely bug.
+
 2024-11-20  Bruno Haible  <bruno@clisp.org>
 
        c-stack: Avoid a busy-looping test on macOS.
index 698874427b6aaeba7e4b48a2bd1cf09c7a9ced62..c5d5d7d82787849e6382a6dedf696c6220958abd 100644 (file)
@@ -244,7 +244,7 @@ openat_permissive (int fd, char const *file, int flags, mode_t mode,
       }
   }
 
-  bool save_failed = save_cwd (&saved_cwd) < 0;
+  int save_failed = save_cwd (&saved_cwd) < 0 ? errno : 0;
 
   /* If save_cwd allocated a descriptor DFD other than FD, do another
      save_cwd and then close DFD, so that the later open (if successful)
@@ -252,7 +252,7 @@ openat_permissive (int fd, char const *file, int flags, mode_t mode,
   int dfd = saved_cwd.desc;
   if (0 <= dfd && dfd != fd)
     {
-      save_failed = save_cwd (&saved_cwd) < 0;
+      save_failed = save_cwd (&saved_cwd) < 0 ? errno : 0;
       close (dfd);
       dfd = saved_cwd.desc;
     }
@@ -269,8 +269,8 @@ openat_permissive (int fd, char const *file, int flags, mode_t mode,
   if (save_failed)
     {
       if (! cwd_errno)
-        openat_save_fail (errno);
-      *cwd_errno = errno;
+        openat_save_fail (save_failed);
+      *cwd_errno = save_failed;
     }
 
   err = fchdir (fd);