source.c:openp: save/restore errno
authorPedro Alves <palves@redhat.com>
Tue, 27 Oct 2015 16:03:24 +0000 (16:03 +0000)
committerPedro Alves <palves@redhat.com>
Tue, 27 Oct 2015 16:03:24 +0000 (16:03 +0000)
openp's return is documented as:

~~~
   If a file is found, return the descriptor.
   Otherwise, return -1, with errno set for the last name we tried to open.  */
~~~

By inspection, I noticed that there are function calls after the ones
that first set errno, and those may clobber errno.  It's safer to save
errno when see an open fail, and restore it on exit.

Tested on x86_64 Fedora 20.

gdb/ChangeLog:
2015-10-27  Pedro Alves  <palves@redhat.com>

* source.c (openp): New local 'last_errno'.  Use it to
save/restore errno.

gdb/ChangeLog
gdb/source.c

index 6c81a9fa1237d6c2dbda8640944814b196bb0860..0e40c7ed6aa0da6bd7e0e07b366dd65f7061d41a 100644 (file)
@@ -1,3 +1,8 @@
+2015-10-27  Pedro Alves  <palves@redhat.com>
+
+       * source.c (openp): New local 'last_errno'.  Use it to
+       save/restore errno.
+
 2015-10-27  Pedro Alves  <palves@redhat.com>
 
        * psymtab.c (dump_psymtab_addrmap_1): Add casts.
index 3e5e15c1112915d228ce443a608460f113ee7505..194b044f44432370236f822ca1f5cf9af1587628 100644 (file)
@@ -746,6 +746,9 @@ openp (const char *path, int opts, const char *string,
   struct cleanup *back_to;
   int ix;
   char *dir;
+  /* The errno set for the last name we tried to open (and
+     failed).  */
+  int last_errno = 0;
 
   /* The open syscall MODE parameter is not specified.  */
   gdb_assert ((mode & O_CREAT) == 0);
@@ -786,6 +789,7 @@ openp (const char *path, int opts, const char *string,
          filename = NULL;
          fd = -1;
        }
+      last_errno = errno;
 
       if (!(opts & OPF_SEARCH_IN_PATH))
        for (i = 0; string[i]; i++)
@@ -808,6 +812,7 @@ openp (const char *path, int opts, const char *string,
   alloclen = strlen (path) + strlen (string) + 2;
   filename = (char *) alloca (alloclen);
   fd = -1;
+  last_errno = ENOENT;
 
   dir_vec = dirnames_to_char_ptr_vec (path);
   back_to = make_cleanup_free_char_ptr_vec (dir_vec);
@@ -878,6 +883,7 @@ openp (const char *path, int opts, const char *string,
          fd = gdb_open_cloexec (filename, mode, 0);
          if (fd >= 0)
            break;
+         last_errno = errno;
        }
     }
 
@@ -895,6 +901,7 @@ done:
        *filename_opened = gdb_abspath (filename);
     }
 
+  errno = last_errno;
   return fd;
 }
 
This page took 0.034348 seconds and 4 git commands to generate.