From b3279b601e67ce47263082ef86cfc86e25607c5e Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Thu, 20 Sep 2018 16:04:04 -0600 Subject: Use mkostemp, not mkstemp I noticed that gdb could leak file descriptors coming from mkstemp. This patch fixes the problem by importing the gnulib mkostemp instead, and then changing gdb to pass O_CLOEXEC. A small gnulib patch was needed. This has already been accepted upstream. gdb/ChangeLog 2018-10-27 Tom Tromey * unittests/scoped_mmap-selftests.c (test_normal): Use gdb_mkostemp_cloexec. * unittests/scoped_fd-selftests.c (test_destroy, test_release): Use gdb_mkostemp_cloexec. * gnulib/aclocal-m4-deps.mk, gnulib/aclocal.m4, gnulib/config.in, gnulib/configure, gnulib/import/Makefile.am, gnulib/import/Makefile.in, gnulib/import/m4/gnulib-cache.m4, gnulib/import/m4/gnulib-comp.m4: Update. * gnulib/import/m4/mkostemp.m4: New file. * gnulib/import/m4/mkstemp.m4: Remove. * gnulib/import/mkostemp.c: New file. * gnulib/import/mkstemp.m4: Remove. * gnulib/update-gnulib.sh (IMPORTED_GNULIB_MODULES): Remove mkstemp, add mkostemp. Apply new patch. * gnulib/import/stdlib.in.h: Apply patch. * gnulib/patches/0002-mkostemp-mkostemps-Fix-compilation-error-in-C-mode-o.patch: New file. * dwarf-index-write.c (write_psymtabs_to_index): Use gdb_mkostemp_cloexec. * common/filestuff.h (gdb_mkostemp_cloexec): New function. --- gdb/dwarf-index-write.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'gdb/dwarf-index-write.c') diff --git a/gdb/dwarf-index-write.c b/gdb/dwarf-index-write.c index 4335c39..e07bda9 100644 --- a/gdb/dwarf-index-write.c +++ b/gdb/dwarf-index-write.c @@ -1567,7 +1567,7 @@ write_psymtabs_to_index (struct dwarf2_per_objfile *dwarf2_per_objfile, gdb::char_vector filename_temp = make_temp_filename (filename); gdb::optional out_file_fd - (gdb::in_place, mkstemp (filename_temp.data ())); + (gdb::in_place, gdb_mkostemp_cloexec (filename_temp.data (), O_BINARY)); if (out_file_fd->get () == -1) perror_with_name (("mkstemp")); @@ -1591,7 +1591,8 @@ write_psymtabs_to_index (struct dwarf2_per_objfile *dwarf2_per_objfile, gdb::char_vector filename_str_temp = make_temp_filename (filename_str); gdb::optional out_file_str_fd - (gdb::in_place, mkstemp (filename_str_temp.data ())); + (gdb::in_place, gdb_mkostemp_cloexec (filename_str_temp.data (), + O_BINARY)); if (out_file_str_fd->get () == -1) perror_with_name (("mkstemp")); -- cgit v1.1