gdbsupport: make gdb_open_cloexec return scoped_fd
authorSimon Marchi <simon.marchi@polymtl.ca>
Thu, 22 Jul 2021 15:56:33 +0000 (11:56 -0400)
committerSimon Marchi <simon.marchi@polymtl.ca>
Thu, 30 Sep 2021 19:21:48 +0000 (15:21 -0400)
Make gdb_open_cloexec return a scoped_fd, to encourage using automatic
management of the file descriptor closing.  Except in the most trivial
cases, I changed the callers to just release the fd, which retains their
existing behavior.  That will allow the transition to using scoped_fd
more to go gradually, one caller at a time.

Change-Id: Ife022b403f96e71d5ebb4f1056ef6251b30fe554

16 files changed:
gdb/auxv.c
gdb/corelow.c
gdb/darwin-nat.c
gdb/gdb_bfd.c
gdb/inf-child.c
gdb/linux-nat.c
gdb/nat/linux-namespaces.c
gdb/remote-fileio.c
gdb/ser-unix.c
gdb/solib.c
gdb/source.c
gdb/top.c
gdb/tracefile-tfile.c
gdbsupport/filestuff.cc
gdbsupport/filestuff.h
gdbsupport/scoped_mmap.cc

index 2bcf9f452e3eb2541cc3e5cfaa0b1caac4179d91..120e5c7cc21ba4bebf4cc2cad85591d4f6b35a99 100644 (file)
@@ -46,23 +46,21 @@ procfs_xfer_auxv (gdb_byte *readbuf,
                  ULONGEST len,
                  ULONGEST *xfered_len)
 {
-  int fd;
   ssize_t l;
 
   std::string pathname = string_printf ("/proc/%d/auxv", inferior_ptid.pid ());
-  fd = gdb_open_cloexec (pathname, writebuf != NULL ? O_WRONLY : O_RDONLY, 0);
-  if (fd < 0)
+  scoped_fd fd
+    = gdb_open_cloexec (pathname, writebuf != NULL ? O_WRONLY : O_RDONLY, 0);
+  if (fd.get () < 0)
     return TARGET_XFER_E_IO;
 
   if (offset != (ULONGEST) 0
-      && lseek (fd, (off_t) offset, SEEK_SET) != (off_t) offset)
+      && lseek (fd.get (), (off_t) offset, SEEK_SET) != (off_t) offset)
     l = -1;
   else if (readbuf != NULL)
-    l = read (fd, readbuf, (size_t) len);
+    l = read (fd.get (), readbuf, (size_t) len);
   else
-    l = write (fd, writebuf, (size_t) len);
-
-  (void) close (fd);
+    l = write (fd.get (), writebuf, (size_t) len);
 
   if (l < 0)
     return TARGET_XFER_E_IO;
index 711e86c4cd4b5fc07670140baf8aea186e69657c..5f48d96aa12de0d16f199e65b76b5af3bc4d441b 100644 (file)
@@ -437,7 +437,7 @@ core_target_open (const char *arg, int from_tty)
     flags |= O_RDWR;
   else
     flags |= O_RDONLY;
-  scratch_chan = gdb_open_cloexec (filename.get (), flags, 0);
+  scratch_chan = gdb_open_cloexec (filename.get (), flags, 0).release ();
   if (scratch_chan < 0)
     perror_with_name (filename.get ());
 
index f3478a55341cf5adbcfded6072af591da843d452..525f59ae2ceae58ccb844e9ee9d118ad3c53737c 100644 (file)
@@ -1822,7 +1822,7 @@ may_have_sip ()
 static void
 copy_shell_to_cache (const char *shell, const std::string &new_name)
 {
-  scoped_fd from_fd (gdb_open_cloexec (shell, O_RDONLY, 0));
+  scoped_fd from_fd = gdb_open_cloexec (shell, O_RDONLY, 0);
   if (from_fd.get () < 0)
     error (_("Could not open shell (%s) for reading: %s"),
           shell, safe_strerror (errno));
index 312442a466e275092525acebe8cdd544fc635abc..c6ff409d49c6bc4352a1d140022ad8e9a4352b2e 100644 (file)
@@ -541,7 +541,7 @@ gdb_bfd_open (const char *name, const char *target, int fd,
 
   if (fd == -1)
     {
-      fd = gdb_open_cloexec (name, O_RDONLY | O_BINARY, 0);
+      fd = gdb_open_cloexec (name, O_RDONLY | O_BINARY, 0).release ();
       if (fd == -1)
        {
          bfd_set_error (bfd_error_system_call);
index f690aa77913f33d2a53c3ab577b6f1b743980e01..5084f448c1e0369f8980f0bdc4f6b70e6ff3c54b 100644 (file)
@@ -261,7 +261,7 @@ inf_child_target::fileio_open (struct inferior *inf, const char *filename,
       return -1;
     }
 
-  fd = gdb_open_cloexec (filename, nat_flags, nat_mode);
+  fd = gdb_open_cloexec (filename, nat_flags, nat_mode).release ();
   if (fd == -1)
     *target_errno = host_to_fileio_error (errno);
 
index bac383dd5e89d05dd3c7bbbf1e18700848dde274..6f50ea39142450c044f182ac21b3cf1ed0eb25cc 100644 (file)
@@ -3832,7 +3832,7 @@ linux_proc_xfer_memory_partial_pid (ptid_t ptid,
                 "/proc/%d/task/%ld/mem", ptid.pid (), ptid.lwp ());
 
       last_proc_mem_file.fd
-       = gdb_open_cloexec (filename, O_RDWR | O_LARGEFILE, 0);
+       = gdb_open_cloexec (filename, O_RDWR | O_LARGEFILE, 0).release ();
 
       if (last_proc_mem_file.fd == -1)
        {
index 0c4fadd49f7b0a0a5518047f1feb368af6e8c0c1..c5d5eb4ea8ce799b162e4d938f4d79632ef70b7e 100644 (file)
@@ -520,13 +520,8 @@ static ssize_t
 mnsh_handle_open (int sock, const char *filename,
                  int flags, mode_t mode)
 {
-  int fd = gdb_open_cloexec (filename, flags, mode);
-  ssize_t result = mnsh_return_fd (sock, fd, errno);
-
-  if (fd >= 0)
-    close (fd);
-
-  return result;
+  scoped_fd fd = gdb_open_cloexec (filename, flags, mode);
+  return mnsh_return_fd (sock, fd.get (), errno);
 }
 
 /* Handle a MNSH_REQ_UNLINK message.  Must be async-signal-safe.  */
@@ -901,7 +896,7 @@ linux_mntns_access_fs (pid_t pid)
   if (ns == NULL)
     return MNSH_FS_DIRECT;
 
-  fd = gdb_open_cloexec (linux_ns_filename (ns, pid), O_RDONLY, 0);
+  fd = gdb_open_cloexec (linux_ns_filename (ns, pid), O_RDONLY, 0).release ();
   if (fd < 0)
     return MNSH_FS_ERROR;
 
@@ -968,7 +963,7 @@ linux_mntns_open_cloexec (pid_t pid, const char *filename,
     return -1;
 
   if (access == MNSH_FS_DIRECT)
-    return gdb_open_cloexec (filename, flags, mode);
+    return gdb_open_cloexec (filename, flags, mode).release ();
 
   gdb_assert (access == MNSH_FS_HELPER);
 
index 9765093a7235891664dab243dae0b2a3b26e6753..20ec0f215aae48c7930d11a08983661f578cdda2 100644 (file)
@@ -425,7 +425,7 @@ remote_fileio_func_open (remote_target *remote, char *buf)
        }
     }
 
-  fd = gdb_open_cloexec (pathname, flags, mode);
+  fd = gdb_open_cloexec (pathname, flags, mode).release ();
   if (fd < 0)
     {
       remote_fileio_return_errno (remote, -1);
index 96d024eea3d956814f976b4be533c12178a26626..597032afe8967b7ccc311e75029cd66b4c7789bf 100644 (file)
@@ -75,7 +75,7 @@ static int hardwire_setstopbits (struct serial *, int);
 static int
 hardwire_open (struct serial *scb, const char *name)
 {
-  scb->fd = gdb_open_cloexec (name, O_RDWR, 0);
+  scb->fd = gdb_open_cloexec (name, O_RDWR, 0).release ();
   if (scb->fd < 0)
     return -1;
 
index e30affbb7e78cff22ed57cbf8f8978143ce1cca9..dba3d843025ed0f7bfe75ba02e715a90c6fe6718 100644 (file)
@@ -257,7 +257,8 @@ solib_find_1 (const char *in_pathname, int *fd, bool is_solib)
     }
 
   /* Now see if we can open it.  */
-  found_file = gdb_open_cloexec (temp_pathname.get (), O_RDONLY | O_BINARY, 0);
+  found_file = gdb_open_cloexec (temp_pathname.get (),
+                                O_RDONLY | O_BINARY, 0).release ();
 
   /* If the search in gdb_sysroot failed, and the path name has a
      drive spec (e.g, c:/foo), try stripping ':' from the drive spec,
@@ -278,7 +279,7 @@ solib_find_1 (const char *in_pathname, int *fd, bool is_solib)
                                   in_pathname + 2, (char *) NULL));
 
       found_file = gdb_open_cloexec (temp_pathname.get (),
-                                    O_RDONLY | O_BINARY, 0);
+                                    O_RDONLY | O_BINARY, 0).release ();
       if (found_file < 0)
        {
          /* If the search in gdb_sysroot still failed, try fully
@@ -292,7 +293,7 @@ solib_find_1 (const char *in_pathname, int *fd, bool is_solib)
                                       in_pathname + 2, (char *) NULL));
 
          found_file = gdb_open_cloexec (temp_pathname.get (),
-                                        O_RDONLY | O_BINARY, 0);
+                                        O_RDONLY | O_BINARY, 0).release ();
        }
     }
 
index eec6e77eaa302caade8b5d1cb4e93a4997f226d2..3559eeac283e44d6d2f62e2a982dbb7503e69654 100644 (file)
@@ -832,7 +832,7 @@ openp (const char *path, openp_flags opts, const char *string,
        {
          filename = (char *) alloca (strlen (string) + 1);
          strcpy (filename, string);
-         fd = gdb_open_cloexec (filename, mode, 0);
+         fd = gdb_open_cloexec (filename, mode, 0).release ();
          if (fd >= 0)
            goto done;
          last_errno = errno;
@@ -924,7 +924,7 @@ openp (const char *path, openp_flags opts, const char *string,
 
       if (is_regular_file (filename, &reg_file_errno))
        {
-         fd = gdb_open_cloexec (filename, mode, 0);
+         fd = gdb_open_cloexec (filename, mode, 0).release ();
          if (fd >= 0)
            break;
          last_errno = errno;
@@ -1060,7 +1060,6 @@ find_and_open_source (const char *filename,
 {
   char *path = source_path;
   const char *p;
-  int result;
 
   /* If reading of source files is disabled then return a result indicating
      the attempt to read this source file failed.  GDB will then display
@@ -1080,12 +1079,11 @@ find_and_open_source (const char *filename,
       if (rewritten_fullname != NULL)
        *fullname = std::move (rewritten_fullname);
 
-      result = gdb_open_cloexec (fullname->get (), OPEN_MODE, 0);
-
-      if (result >= 0)
+      scoped_fd result = gdb_open_cloexec (fullname->get (), OPEN_MODE, 0);
+      if (result.get () >= 0)
        {
          *fullname = gdb_realpath (fullname->get ());
-         return scoped_fd (result);
+         return result;
        }
 
       /* Didn't work -- free old one, try again.  */
@@ -1129,8 +1127,8 @@ find_and_open_source (const char *filename,
     filename = rewritten_filename.get ();
 
   /* Try to locate file using filename.  */
-  result = openp (path, OPF_SEARCH_IN_PATH | OPF_RETURN_REALPATH, filename,
-                 OPEN_MODE, fullname);
+  int result = openp (path, OPF_SEARCH_IN_PATH | OPF_RETURN_REALPATH, filename,
+                     OPEN_MODE, fullname);
   if (result < 0 && dirname != NULL)
     {
       /* Remove characters from the start of PATH that we don't need when
index 7e95ed3969ce94fba47d1067519b27d1929362f9..bca007e38ffab3be78d4046ee11ed38839c7b197 100644 (file)
--- a/gdb/top.c
+++ b/gdb/top.c
@@ -335,13 +335,11 @@ ui::~ui ()
 static gdb_file_up
 open_terminal_stream (const char *name)
 {
-  int fd;
-
-  fd = gdb_open_cloexec (name, O_RDWR | O_NOCTTY, 0);
-  if (fd < 0)
+  scoped_fd fd = gdb_open_cloexec (name, O_RDWR | O_NOCTTY, 0);
+  if (fd.get () < 0)
     perror_with_name  (_("opening terminal failed"));
 
-  return gdb_file_up (fdopen (fd, "w+"));
+  return fd.to_file ("w+");
 }
 
 /* Implementation of the "new-ui" command.  */
index 33ce86bbe2389a7098b2b4bf098b10df6471069f..e1534826c5fe2b987c7d26d9ab5d7b5e710882e3 100644 (file)
@@ -475,7 +475,7 @@ tfile_target_open (const char *arg, int from_tty)
 
   flags = O_BINARY | O_LARGEFILE;
   flags |= O_RDONLY;
-  scratch_chan = gdb_open_cloexec (filename.get (), flags, 0);
+  scratch_chan = gdb_open_cloexec (filename.get (), flags, 0).release ();
   if (scratch_chan < 0)
     perror_with_name (filename.get ());
 
index 6ea2ad842d5d209e62837b0a4d9c9a45ca791210..2975a0e6a990a97014412423e3f9a941fee3b8b6 100644 (file)
@@ -306,13 +306,13 @@ socket_mark_cloexec (int fd)
 
 /* See filestuff.h.  */
 
-int
+scoped_fd
 gdb_open_cloexec (const char *filename, int flags, unsigned long mode)
 {
-  int fd = open (filename, flags | O_CLOEXEC, mode);
+  scoped_fd fd (open (filename, flags | O_CLOEXEC, mode));
 
-  if (fd >= 0)
-    maybe_mark_cloexec (fd);
+  if (fd.get () >= 0)
+    maybe_mark_cloexec (fd.get ());
 
   return fd;
 }
index aa15f89aa920ffd4f43d511ad2cba628801cdc82..a2cb916dd15d8d35222ffa1ceea16c7fd0b67bbb 100644 (file)
@@ -22,6 +22,7 @@
 #include <dirent.h>
 #include <fcntl.h>
 #include "gdb_file.h"
+#include "scoped_fd.h"
 
 /* Note all the file descriptors which are open when this is called.
    These file descriptors will not be closed by close_most_fds.  */
@@ -47,8 +48,8 @@ extern void close_most_fds (void);
 /* Like 'open', but ensures that the returned file descriptor has the
    close-on-exec flag set.  */
 
-extern int gdb_open_cloexec (const char *filename, int flags,
-                            /* mode_t */ unsigned long mode);
+extern scoped_fd gdb_open_cloexec (const char *filename, int flags,
+                                  /* mode_t */ unsigned long mode);
 
 /* Like mkstemp, but ensures that the file descriptor is
    close-on-exec.  */
@@ -63,7 +64,7 @@ gdb_mkostemp_cloexec (char *name_template, int flags = 0)
 /* Convenience wrapper for the above, which takes the filename as an
    std::string.  */
 
-static inline int
+static inline scoped_fd
 gdb_open_cloexec (const std::string &filename, int flags,
                  /* mode_t */ unsigned long mode)
 {
index c76fb77b72d309e7ee04b74da80f80a610cbeee7..598b3280381ff1bf4067bb6295f15365c68e7a00 100644 (file)
@@ -27,7 +27,7 @@
 scoped_mmap
 mmap_file (const char *filename)
 {
-  scoped_fd fd (gdb_open_cloexec (filename, O_RDONLY, 0));
+  scoped_fd fd = gdb_open_cloexec (filename, O_RDONLY, 0);
   if (fd.get () < 0)
     perror_with_name (("open"));