gdbsupport: make gdb_mkostemp_cloexec return a scoped_fd

This encourages the callers to use automatic file descriptor management.

Change-Id: I137a81df6f3607b457e28c35aafde8ed6f3a3344
This commit is contained in:
Simon Marchi 2021-07-22 15:33:42 -04:00
parent 13084383e8
commit 2fed9db40b
5 changed files with 13 additions and 12 deletions

View file

@ -1833,7 +1833,7 @@ copy_shell_to_cache (const char *shell, const std::string &new_name)
new_dir.c_str (), safe_strerror (errno)); new_dir.c_str (), safe_strerror (errno));
gdb::char_vector temp_name = make_temp_filename (new_name); gdb::char_vector temp_name = make_temp_filename (new_name);
scoped_fd to_fd (gdb_mkostemp_cloexec (&temp_name[0])); scoped_fd to_fd = gdb_mkostemp_cloexec (&temp_name[0]);
gdb::unlinker unlink_file_on_error (temp_name.data ()); gdb::unlinker unlink_file_on_error (temp_name.data ());
if (to_fd.get () < 0) if (to_fd.get () < 0)

View file

@ -1538,8 +1538,8 @@ struct index_wip_file
filename_temp = make_temp_filename (filename); filename_temp = make_temp_filename (filename);
scoped_fd out_file_fd (gdb_mkostemp_cloexec (filename_temp.data (), scoped_fd out_file_fd = gdb_mkostemp_cloexec (filename_temp.data (),
O_BINARY)); O_BINARY);
if (out_file_fd.get () == -1) if (out_file_fd.get () == -1)
perror_with_name (("mkstemp")); perror_with_name (("mkstemp"));

View file

@ -32,7 +32,7 @@ static void
test_destroy () test_destroy ()
{ {
char filename[] = "scoped_fd-selftest-XXXXXX"; char filename[] = "scoped_fd-selftest-XXXXXX";
int fd = gdb_mkostemp_cloexec (filename); int fd = gdb_mkostemp_cloexec (filename).release ();
SELF_CHECK (fd >= 0); SELF_CHECK (fd >= 0);
unlink (filename); unlink (filename);
@ -51,7 +51,7 @@ static void
test_release () test_release ()
{ {
char filename[] = "scoped_fd-selftest-XXXXXX"; char filename[] = "scoped_fd-selftest-XXXXXX";
int fd = gdb_mkostemp_cloexec (filename); int fd = gdb_mkostemp_cloexec (filename).release ();
SELF_CHECK (fd >= 0); SELF_CHECK (fd >= 0);
unlink (filename); unlink (filename);
@ -71,7 +71,7 @@ test_to_file ()
{ {
char filename[] = "scoped_fd-selftest-XXXXXX"; char filename[] = "scoped_fd-selftest-XXXXXX";
::scoped_fd sfd (gdb_mkostemp_cloexec (filename)); ::scoped_fd sfd = gdb_mkostemp_cloexec (filename);
SELF_CHECK (sfd.get () >= 0); SELF_CHECK (sfd.get () >= 0);
unlink (filename); unlink (filename);

View file

@ -89,11 +89,12 @@ static void
test_normal () test_normal ()
{ {
char filename[] = "scoped_mmapped_file-selftest-XXXXXX"; char filename[] = "scoped_mmapped_file-selftest-XXXXXX";
int fd = gdb_mkostemp_cloexec (filename); {
SELF_CHECK (fd >= 0); scoped_fd fd = gdb_mkostemp_cloexec (filename);
SELF_CHECK (fd.get () >= 0);
SELF_CHECK (write (fd, "Hello!", 7) == 7); SELF_CHECK (write (fd.get (), "Hello!", 7) == 7);
close (fd); }
gdb::unlinker unlink_test_file (filename); gdb::unlinker unlink_test_file (filename);

View file

@ -54,11 +54,11 @@ extern scoped_fd gdb_open_cloexec (const char *filename, int flags,
/* Like mkstemp, but ensures that the file descriptor is /* Like mkstemp, but ensures that the file descriptor is
close-on-exec. */ close-on-exec. */
static inline int static inline scoped_fd
gdb_mkostemp_cloexec (char *name_template, int flags = 0) gdb_mkostemp_cloexec (char *name_template, int flags = 0)
{ {
/* gnulib provides a mkostemp replacement if needed. */ /* gnulib provides a mkostemp replacement if needed. */
return mkostemp (name_template, flags | O_CLOEXEC); return scoped_fd (mkostemp (name_template, flags | O_CLOEXEC));
} }
/* Convenience wrapper for the above, which takes the filename as an /* Convenience wrapper for the above, which takes the filename as an