]> git.ipfire.org Git - thirdparty/coreutils.git/commitdiff
Don't let a helper function modify errno.
authorJim Meyering <meyering@redhat.com>
Sun, 7 Oct 2007 19:55:42 +0000 (21:55 +0200)
committerJim Meyering <meyering@redhat.com>
Sun, 7 Oct 2007 19:57:55 +0000 (21:57 +0200)
* src/remove.c (full_filename_): Save and restore errno.
Spotted by Bruno Haible.

ChangeLog
src/remove.c

index 157f126abd949b62c1d86260411362a106bd7a52..1c3b257b014a3d104c3755619dbe102f4c352ba9 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
 2007-10-07  Jim Meyering  <meyering@redhat.com>
 
+       Don't let a helper function modify errno.
+       * src/remove.c (full_filename_): Save and restore errno.
+       Spotted by Bruno Haible.
+
        Reflect 2->3 GPL copyright version update in gnulib.
        * gl/lib/tempname.h: Update copyright from gnulib.
        * gl/lib/tempname.c: Likewise.
index 3cbfe66831092ee27533a29fdd49dbc97ca15089..4f91dd420e96f51d30f2e34cd3e1ad3a7fdf7f47 100644 (file)
@@ -305,7 +305,8 @@ right_justify (char *dst, size_t dst_len, const char *src, size_t src_len,
 /* Using the global directory name obstack, create the full name FILENAME.
    Return it in sometimes-realloc'd space that should not be freed by the
    caller.  Realloc as necessary.  If realloc fails, use a static buffer
-   and put as long a suffix in that buffer as possible.  */
+   and put as long a suffix in that buffer as possible.  Be careful not
+   to change errno.  */
 
 #define full_filename(Filename) full_filename_ (ds, Filename)
 static char *
@@ -313,6 +314,7 @@ full_filename_ (Dirstack_state const *ds, const char *filename)
 {
   static char *buf = NULL;
   static size_t n_allocated = 0;
+  int saved_errno = errno;
 
   size_t dir_len = obstack_object_size (&ds->dir_stack);
   char *dir_name = obstack_base (&ds->dir_stack);
@@ -350,6 +352,7 @@ full_filename_ (Dirstack_state const *ds, const char *filename)
              memcpy (static_buf, ELLIPSES_PREFIX,
                      sizeof (ELLIPSES_PREFIX) - 1);
            }
+         errno = saved_errno;
          return p;
        }
 
@@ -372,6 +375,7 @@ full_filename_ (Dirstack_state const *ds, const char *filename)
       assert (strlen (buf) + 1 == n_bytes_needed);
     }
 
+  errno = saved_errno;
   return buf;
 }