From: Tom Tromey Date: Thu, 20 Sep 2018 22:04:04 +0000 (-0600) Subject: Use mkostemp, not mkstemp X-Git-Tag: users/ARM/embedded-binutils-master-2018q4~324 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=b3279b601e67ce47263082ef86cfc86e25607c5e;p=external%2Fbinutils.git 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. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 0f7078c..c6a5635 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,29 @@ 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. + +2018-10-27 Tom Tromey + * unittests/mkdir-recursive-selftests.c: New file. * Makefile.in (SUBDIR_UNITTESTS_SRCS): Add unittests/mkdir-recursive-selftests.c. diff --git a/gdb/common/filestuff.h b/gdb/common/filestuff.h index ecfc18d..9a12f83 100644 --- a/gdb/common/filestuff.h +++ b/gdb/common/filestuff.h @@ -20,6 +20,7 @@ #define FILESTUFF_H #include +#include /* Note all the file descriptors which are open when this is called. These file descriptors will not be closed by close_most_fds. */ @@ -48,6 +49,16 @@ extern void close_most_fds (void); extern int 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. */ + +static inline int +gdb_mkostemp_cloexec (char *name_template, int flags = 0) +{ + /* gnulib provides a mkostemp replacement if needed. */ + return mkostemp (name_template, flags | O_CLOEXEC); +} + /* Convenience wrapper for the above, which takes the filename as an std::string. */ 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")); diff --git a/gdb/gnulib/aclocal-m4-deps.mk b/gdb/gnulib/aclocal-m4-deps.mk index d866b6d..5b2c6cc 100644 --- a/gdb/gnulib/aclocal-m4-deps.mk +++ b/gdb/gnulib/aclocal-m4-deps.mk @@ -80,7 +80,7 @@ aclocal_m4_deps = \ import/m4/mempcpy.m4 \ import/m4/memrchr.m4 \ import/m4/mkdir.m4 \ - import/m4/mkstemp.m4 \ + import/m4/mkostemp.m4 \ import/m4/mmap-anon.m4 \ import/m4/mode_t.m4 \ import/m4/msvc-inval.m4 \ diff --git a/gdb/gnulib/aclocal.m4 b/gdb/gnulib/aclocal.m4 index 740387a..861caf6 100644 --- a/gdb/gnulib/aclocal.m4 +++ b/gdb/gnulib/aclocal.m4 @@ -1353,7 +1353,7 @@ m4_include([import/m4/memmem.m4]) m4_include([import/m4/mempcpy.m4]) m4_include([import/m4/memrchr.m4]) m4_include([import/m4/mkdir.m4]) -m4_include([import/m4/mkstemp.m4]) +m4_include([import/m4/mkostemp.m4]) m4_include([import/m4/mmap-anon.m4]) m4_include([import/m4/mode_t.m4]) m4_include([import/m4/msvc-inval.m4]) diff --git a/gdb/gnulib/config.in b/gdb/gnulib/config.in index d32b192..d23d208 100644 --- a/gdb/gnulib/config.in +++ b/gdb/gnulib/config.in @@ -96,6 +96,10 @@ #undef GNULIB_GETCWD /* Define to a C preprocessor expression that evaluates to 1 or 0, depending + whether the gnulib module mkostemp shall be considered present. */ +#undef GNULIB_MKOSTEMP + +/* Define to a C preprocessor expression that evaluates to 1 or 0, depending whether the gnulib module openat shall be considered present. */ #undef GNULIB_OPENAT @@ -199,8 +203,8 @@ /* Define to 1 when the gnulib module memrchr should be tested. */ #undef GNULIB_TEST_MEMRCHR -/* Define to 1 when the gnulib module mkstemp should be tested. */ -#undef GNULIB_TEST_MKSTEMP +/* Define to 1 when the gnulib module mkostemp should be tested. */ +#undef GNULIB_TEST_MKOSTEMP /* Define to 1 when the gnulib module open should be tested. */ #undef GNULIB_TEST_OPEN @@ -544,8 +548,8 @@ when it succeeds. */ #undef HAVE_MINIMALLY_WORKING_GETCWD -/* Define to 1 if you have the 'mkstemp' function. */ -#undef HAVE_MKSTEMP +/* Define to 1 if you have the 'mkostemp' function. */ +#undef HAVE_MKOSTEMP /* Define to 1 if you have the 'mprotect' function. */ #undef HAVE_MPROTECT diff --git a/gdb/gnulib/configure b/gdb/gnulib/configure index dc6c5b6..5d7f8aa 100644 --- a/gdb/gnulib/configure +++ b/gdb/gnulib/configure @@ -3525,7 +3525,7 @@ gl_func_list="$gl_func_list mbsinit" gl_func_list="$gl_func_list mbrtowc" gl_header_list="$gl_header_list sys/mman.h" gl_func_list="$gl_func_list mprotect" -gl_func_list="$gl_func_list mkstemp" +gl_func_list="$gl_func_list mkostemp" gl_func_list="$gl_func_list openat" gl_func_list="$gl_func_list link" gl_func_list="$gl_func_list secure_getenv" @@ -5841,7 +5841,7 @@ fi # Code from module mempcpy: # Code from module memrchr: # Code from module mkdir: - # Code from module mkstemp: + # Code from module mkostemp: # Code from module msvc-inval: # Code from module msvc-nothrow: # Code from module multiarch: @@ -21893,116 +21893,51 @@ $as_echo "#define FUNC_MKDIR_DOT_BUG 1" >>confdefs.h + + : - if test $ac_cv_func_mkstemp = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working mkstemp" >&5 -$as_echo_n "checking for working mkstemp... " >&6; } -if ${gl_cv_func_working_mkstemp+:} false; then : - $as_echo_n "(cached) " >&6 -else + if test $ac_cv_func_mkostemp != yes; then + HAVE_MKOSTEMP=0 + fi - mkdir conftest.mkstemp - if test "$cross_compiling" = yes; then : - case "$host_os" in - # Guess yes on glibc systems. - *-gnu*) gl_cv_func_working_mkstemp="guessing yes" ;; - # If we don't know, assume the worst. - *) gl_cv_func_working_mkstemp="guessing no" ;; - esac + if test $HAVE_MKOSTEMP = 0; then -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -int result = 0; - int i; - off_t large = (off_t) 4294967295u; - if (large < 0) - large = 2147483647; - umask (0); - for (i = 0; i < 70; i++) - { - char templ[] = "conftest.mkstemp/coXXXXXX"; - int (*mkstemp_function) (char *) = mkstemp; - int fd = mkstemp_function (templ); - if (fd < 0) - result |= 1; - else - { - struct stat st; - if (lseek (fd, large, SEEK_SET) != large) - result |= 2; - if (fstat (fd, &st) < 0) - result |= 4; - else if (st.st_mode & 0077) - result |= 8; - if (close (fd)) - result |= 16; - } - } - return result; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - gl_cv_func_working_mkstemp=yes -else - gl_cv_func_working_mkstemp=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi - rm -rf conftest.mkstemp -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_working_mkstemp" >&5 -$as_echo "$gl_cv_func_working_mkstemp" >&6; } - case "$gl_cv_func_working_mkstemp" in - *yes) ;; - *) - REPLACE_MKSTEMP=1 - ;; - esac - else - HAVE_MKSTEMP=0 - fi - if test $HAVE_MKSTEMP = 0 || test $REPLACE_MKSTEMP = 1; then + gl_LIBOBJS="$gl_LIBOBJS mkostemp.$ac_objext" + fi - gl_LIBOBJS="$gl_LIBOBJS mkstemp.$ac_objext" +cat >>confdefs.h <<_ACEOF +#define GNULIB_MKOSTEMP 1 +_ACEOF - fi - GNULIB_MKSTEMP=1 + GNULIB_MKOSTEMP=1 -$as_echo "#define GNULIB_TEST_MKSTEMP 1" >>confdefs.h +$as_echo "#define GNULIB_TEST_MKOSTEMP 1" >>confdefs.h diff --git a/gdb/gnulib/import/Makefile.am b/gdb/gnulib/import/Makefile.am index d1bee0b..608c2c7 100644 --- a/gdb/gnulib/import/Makefile.am +++ b/gdb/gnulib/import/Makefile.am @@ -21,7 +21,7 @@ # the same distribution terms as the rest of that program. # # Generated by gnulib-tool. -# Reproduce by: gnulib-tool --import --lib=libgnu --source-base=import --m4-base=import/m4 --doc-base=doc --tests-base=tests --aux-dir=import/extra --no-conditional-dependencies --no-libtool --macro-prefix=gl --no-vc-files alloca canonicalize-lgpl dirent dirfd errno fnmatch-gnu frexpl getcwd glob inet_ntop inttypes limits-h lstat memchr memmem mkdir mkstemp pathmax rawmemchr readlink rename setenv signal-h strchrnul strstr strtok_r sys_stat unistd unsetenv update-copyright wchar wctype-h +# Reproduce by: gnulib-tool --import --lib=libgnu --source-base=import --m4-base=import/m4 --doc-base=doc --tests-base=tests --aux-dir=import/extra --no-conditional-dependencies --no-libtool --macro-prefix=gl --no-vc-files alloca canonicalize-lgpl dirent dirfd errno fnmatch-gnu frexpl getcwd glob inet_ntop inttypes limits-h lstat memchr memmem mkdir mkostemp pathmax rawmemchr readlink rename setenv signal-h strchrnul strstr strtok_r sys_stat unistd unsetenv update-copyright wchar wctype-h AUTOMAKE_OPTIONS = 1.9.6 gnits @@ -1223,14 +1223,14 @@ EXTRA_libgnu_a_SOURCES += mkdir.c ## end gnulib module mkdir -## begin gnulib module mkstemp +## begin gnulib module mkostemp -EXTRA_DIST += mkstemp.c +EXTRA_DIST += mkostemp.c -EXTRA_libgnu_a_SOURCES += mkstemp.c +EXTRA_libgnu_a_SOURCES += mkostemp.c -## end gnulib module mkstemp +## end gnulib module mkostemp ## begin gnulib module msvc-inval diff --git a/gdb/gnulib/import/Makefile.in b/gdb/gnulib/import/Makefile.in index 7e4d278..8b0487c 100644 --- a/gdb/gnulib/import/Makefile.in +++ b/gdb/gnulib/import/Makefile.in @@ -35,7 +35,7 @@ # the same distribution terms as the rest of that program. # # Generated by gnulib-tool. -# Reproduce by: gnulib-tool --import --lib=libgnu --source-base=import --m4-base=import/m4 --doc-base=doc --tests-base=tests --aux-dir=import/extra --no-conditional-dependencies --no-libtool --macro-prefix=gl --no-vc-files alloca canonicalize-lgpl dirent dirfd errno fnmatch-gnu frexpl getcwd glob inet_ntop inttypes limits-h lstat memchr memmem mkdir mkstemp pathmax rawmemchr readlink rename setenv signal-h strchrnul strstr strtok_r sys_stat unistd unsetenv update-copyright wchar wctype-h +# Reproduce by: gnulib-tool --import --lib=libgnu --source-base=import --m4-base=import/m4 --doc-base=doc --tests-base=tests --aux-dir=import/extra --no-conditional-dependencies --no-libtool --macro-prefix=gl --no-vc-files alloca canonicalize-lgpl dirent dirfd errno fnmatch-gnu frexpl getcwd glob inet_ntop inttypes limits-h lstat memchr memmem mkdir mkostemp pathmax rawmemchr readlink rename setenv signal-h strchrnul strstr strtok_r sys_stat unistd unsetenv update-copyright wchar wctype-h @@ -192,7 +192,7 @@ am__aclocal_m4_deps = $(top_srcdir)/import/m4/00gnulib.m4 \ $(top_srcdir)/import/m4/mempcpy.m4 \ $(top_srcdir)/import/m4/memrchr.m4 \ $(top_srcdir)/import/m4/mkdir.m4 \ - $(top_srcdir)/import/m4/mkstemp.m4 \ + $(top_srcdir)/import/m4/mkostemp.m4 \ $(top_srcdir)/import/m4/mmap-anon.m4 \ $(top_srcdir)/import/m4/mode_t.m4 \ $(top_srcdir)/import/m4/msvc-inval.m4 \ @@ -1515,7 +1515,7 @@ EXTRA_DIST = m4/gnulib-cache.m4 alloca.c alloca.in.h arpa_inet.in.h \ malloca.valgrind math.in.h mbrtowc.c mbsinit.c \ mbsrtowcs-impl.h mbsrtowcs-state.c mbsrtowcs.c memchr.c \ memchr.valgrind memmem.c str-two-way.h mempcpy.c memrchr.c \ - mkdir.c mkstemp.c msvc-inval.c msvc-inval.h msvc-nothrow.c \ + mkdir.c mkostemp.c msvc-inval.c msvc-inval.h msvc-nothrow.c \ msvc-nothrow.h netinet_in.in.h open.c openat.c openat.h \ dirent-private.h opendir.c pathmax.h rawmemchr.c \ rawmemchr.valgrind dirent-private.h readdir.c readlink.c \ @@ -1587,11 +1587,11 @@ EXTRA_libgnu_a_SOURCES = alloca.c openat-proc.c canonicalize-lgpl.c \ gettimeofday.c glob.c inet_ntop.c isnan.c isnand.c isnan.c \ isnanl.c lstat.c malloc.c mbrtowc.c mbsinit.c \ mbsrtowcs-state.c mbsrtowcs.c memchr.c memmem.c mempcpy.c \ - memrchr.c mkdir.c mkstemp.c msvc-inval.c msvc-nothrow.c open.c \ - openat.c opendir.c rawmemchr.c readdir.c readlink.c realloc.c \ - rename.c rewinddir.c rmdir.c secure_getenv.c setenv.c stat.c \ - strchrnul.c strdup.c strerror.c strerror-override.c strstr.c \ - strtok_r.c unsetenv.c + memrchr.c mkdir.c mkostemp.c msvc-inval.c msvc-nothrow.c \ + open.c openat.c opendir.c rawmemchr.c readdir.c readlink.c \ + realloc.c rename.c rewinddir.c rmdir.c secure_getenv.c \ + setenv.c stat.c strchrnul.c strdup.c strerror.c \ + strerror-override.c strstr.c strtok_r.c unsetenv.c # Use this preprocessor expression to decide whether #include_next works. # Do not rely on a 'configure'-time test for this, since the expression @@ -1722,7 +1722,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mempcpy.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/memrchr.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mkdir.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mkstemp.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mkostemp.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/msvc-inval.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/msvc-nothrow.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/open.Po@am__quote@ diff --git a/gdb/gnulib/import/m4/gnulib-cache.m4 b/gdb/gnulib/import/m4/gnulib-cache.m4 index 442aad5..8cefb67 100644 --- a/gdb/gnulib/import/m4/gnulib-cache.m4 +++ b/gdb/gnulib/import/m4/gnulib-cache.m4 @@ -27,7 +27,7 @@ # Specification in the form of a command-line invocation: -# gnulib-tool --import --lib=libgnu --source-base=import --m4-base=import/m4 --doc-base=doc --tests-base=tests --aux-dir=import/extra --no-conditional-dependencies --no-libtool --macro-prefix=gl --no-vc-files alloca canonicalize-lgpl dirent dirfd errno fnmatch-gnu frexpl getcwd glob inet_ntop inttypes limits-h lstat memchr memmem mkdir mkstemp pathmax rawmemchr readlink rename setenv signal-h strchrnul strstr strtok_r sys_stat unistd unsetenv update-copyright wchar wctype-h +# gnulib-tool --import --lib=libgnu --source-base=import --m4-base=import/m4 --doc-base=doc --tests-base=tests --aux-dir=import/extra --no-conditional-dependencies --no-libtool --macro-prefix=gl --no-vc-files alloca canonicalize-lgpl dirent dirfd errno fnmatch-gnu frexpl getcwd glob inet_ntop inttypes limits-h lstat memchr memmem mkdir mkostemp pathmax rawmemchr readlink rename setenv signal-h strchrnul strstr strtok_r sys_stat unistd unsetenv update-copyright wchar wctype-h # Specification in the form of a few gnulib-tool.m4 macro invocations: gl_LOCAL_DIR([]) @@ -48,7 +48,7 @@ gl_MODULES([ memchr memmem mkdir - mkstemp + mkostemp pathmax rawmemchr readlink diff --git a/gdb/gnulib/import/m4/gnulib-comp.m4 b/gdb/gnulib/import/m4/gnulib-comp.m4 index 21e4383..2c55958 100644 --- a/gdb/gnulib/import/m4/gnulib-comp.m4 +++ b/gdb/gnulib/import/m4/gnulib-comp.m4 @@ -121,7 +121,7 @@ AC_DEFUN([gl_EARLY], # Code from module mempcpy: # Code from module memrchr: # Code from module mkdir: - # Code from module mkstemp: + # Code from module mkostemp: # Code from module msvc-inval: # Code from module msvc-nothrow: # Code from module multiarch: @@ -444,12 +444,13 @@ AC_DEFUN([gl_INIT], if test $REPLACE_MKDIR = 1; then AC_LIBOBJ([mkdir]) fi - gl_FUNC_MKSTEMP - if test $HAVE_MKSTEMP = 0 || test $REPLACE_MKSTEMP = 1; then - AC_LIBOBJ([mkstemp]) - gl_PREREQ_MKSTEMP + gl_FUNC_MKOSTEMP + if test $HAVE_MKOSTEMP = 0; then + AC_LIBOBJ([mkostemp]) + gl_PREREQ_MKOSTEMP fi - gl_STDLIB_MODULE_INDICATOR([mkstemp]) + gl_MODULE_INDICATOR([mkostemp]) + gl_STDLIB_MODULE_INDICATOR([mkostemp]) AC_REQUIRE([gl_MSVC_INVAL]) if test $HAVE_MSVC_INVALID_PARAMETER_HANDLER = 1; then AC_LIBOBJ([msvc-inval]) @@ -844,7 +845,7 @@ AC_DEFUN([gl_FILE_LIST], [ lib/mempcpy.c lib/memrchr.c lib/mkdir.c - lib/mkstemp.c + lib/mkostemp.c lib/msvc-inval.c lib/msvc-inval.h lib/msvc-nothrow.c @@ -991,7 +992,7 @@ AC_DEFUN([gl_FILE_LIST], [ m4/mempcpy.m4 m4/memrchr.m4 m4/mkdir.m4 - m4/mkstemp.m4 + m4/mkostemp.m4 m4/mmap-anon.m4 m4/mode_t.m4 m4/msvc-inval.m4 diff --git a/gdb/gnulib/import/m4/mkostemp.m4 b/gdb/gnulib/import/m4/mkostemp.m4 new file mode 100644 index 0000000..1f44a03 --- /dev/null +++ b/gdb/gnulib/import/m4/mkostemp.m4 @@ -0,0 +1,23 @@ +# mkostemp.m4 serial 2 +dnl Copyright (C) 2009-2016 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +AC_DEFUN([gl_FUNC_MKOSTEMP], +[ + AC_REQUIRE([gl_STDLIB_H_DEFAULTS]) + + dnl Persuade glibc to declare mkostemp(). + AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) + + AC_CHECK_FUNCS_ONCE([mkostemp]) + if test $ac_cv_func_mkostemp != yes; then + HAVE_MKOSTEMP=0 + fi +]) + +# Prerequisites of lib/mkostemp.c. +AC_DEFUN([gl_PREREQ_MKOSTEMP], +[ +]) diff --git a/gdb/gnulib/import/m4/mkstemp.m4 b/gdb/gnulib/import/m4/mkstemp.m4 deleted file mode 100644 index 131e4a7..0000000 --- a/gdb/gnulib/import/m4/mkstemp.m4 +++ /dev/null @@ -1,82 +0,0 @@ -#serial 23 - -# Copyright (C) 2001, 2003-2007, 2009-2016 Free Software Foundation, Inc. -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# On some hosts (e.g., HP-UX 10.20, SunOS 4.1.4, Solaris 2.5.1), mkstemp has a -# silly limit that it can create no more than 26 files from a given template. -# Other systems lack mkstemp altogether. -# On OSF1/Tru64 V4.0F, the system-provided mkstemp function can create -# only 32 files per process. -# On some hosts, mkstemp creates files with mode 0666, which is a security -# problem and a violation of POSIX 2008. -# On systems like the above, arrange to use the replacement function. -AC_DEFUN([gl_FUNC_MKSTEMP], -[ - AC_REQUIRE([gl_STDLIB_H_DEFAULTS]) - AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles - - AC_CHECK_FUNCS_ONCE([mkstemp]) - if test $ac_cv_func_mkstemp = yes; then - AC_CACHE_CHECK([for working mkstemp], - [gl_cv_func_working_mkstemp], - [ - mkdir conftest.mkstemp - AC_RUN_IFELSE( - [AC_LANG_PROGRAM( - [AC_INCLUDES_DEFAULT], - [[int result = 0; - int i; - off_t large = (off_t) 4294967295u; - if (large < 0) - large = 2147483647; - umask (0); - for (i = 0; i < 70; i++) - { - char templ[] = "conftest.mkstemp/coXXXXXX"; - int (*mkstemp_function) (char *) = mkstemp; - int fd = mkstemp_function (templ); - if (fd < 0) - result |= 1; - else - { - struct stat st; - if (lseek (fd, large, SEEK_SET) != large) - result |= 2; - if (fstat (fd, &st) < 0) - result |= 4; - else if (st.st_mode & 0077) - result |= 8; - if (close (fd)) - result |= 16; - } - } - return result;]])], - [gl_cv_func_working_mkstemp=yes], - [gl_cv_func_working_mkstemp=no], - [case "$host_os" in - # Guess yes on glibc systems. - *-gnu*) gl_cv_func_working_mkstemp="guessing yes" ;; - # If we don't know, assume the worst. - *) gl_cv_func_working_mkstemp="guessing no" ;; - esac - ]) - rm -rf conftest.mkstemp - ]) - case "$gl_cv_func_working_mkstemp" in - *yes) ;; - *) - REPLACE_MKSTEMP=1 - ;; - esac - else - HAVE_MKSTEMP=0 - fi -]) - -# Prerequisites of lib/mkstemp.c. -AC_DEFUN([gl_PREREQ_MKSTEMP], -[ -]) diff --git a/gdb/gnulib/import/mkstemp.c b/gdb/gnulib/import/mkostemp.c similarity index 79% rename from gdb/gnulib/import/mkstemp.c rename to gdb/gnulib/import/mkostemp.c index 90ed78e..31c3e48 100644 --- a/gdb/gnulib/import/mkstemp.c +++ b/gdb/gnulib/import/mkostemp.c @@ -24,7 +24,7 @@ #if !_LIBC # include "tempname.h" # define __gen_tempname gen_tempname -# ifndef __GT_FILE +# ifndef __GTFILE # define __GT_FILE GT_FILE # endif #endif @@ -38,13 +38,9 @@ /* Generate a unique temporary file name from XTEMPLATE. The last six characters of XTEMPLATE must be "XXXXXX"; they are replaced with a string that makes the file name unique. - Then open the file and return a fd. - - If you are creating temporary files which will later be removed, - consider using the clean-temp module, which avoids several pitfalls - of using mkstemp directly. */ + Then open the file and return a fd. */ int -mkstemp (char *xtemplate) +mkostemp (char *xtemplate, int flags) { - return __gen_tempname (xtemplate, 0, 0, __GT_FILE); + return __gen_tempname (xtemplate, 0, flags, __GT_FILE); } diff --git a/gdb/gnulib/import/stdlib.in.h b/gdb/gnulib/import/stdlib.in.h index db3253b..8f803a2 100644 --- a/gdb/gnulib/import/stdlib.in.h +++ b/gdb/gnulib/import/stdlib.in.h @@ -87,9 +87,10 @@ struct random_data # endif #endif -#if (@GNULIB_MKSTEMP@ || @GNULIB_MKSTEMPS@ || @GNULIB_GETSUBOPT@ || defined GNULIB_POSIXCHECK) && ! defined __GLIBC__ && !((defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__) +#if (@GNULIB_MKSTEMP@ || @GNULIB_MKSTEMPS@ || @GNULIB_MKOSTEMP@ || @GNULIB_MKOSTEMPS@ || @GNULIB_GETSUBOPT@ || defined GNULIB_POSIXCHECK) && ! defined __GLIBC__ && !((defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__) /* On Mac OS X 10.3, only declares mkstemp. */ /* On Mac OS X 10.5, only declares mkstemps. */ +/* On Mac OS X 10.13, only declares mkostemp and mkostemps. */ /* On Cygwin 1.7.1, only declares getsubopt. */ /* But avoid namespace pollution on glibc systems and native Windows. */ # include diff --git a/gdb/gnulib/patches/0002-mkostemp-mkostemps-Fix-compilation-error-in-C-mode-o.patch b/gdb/gnulib/patches/0002-mkostemp-mkostemps-Fix-compilation-error-in-C-mode-o.patch new file mode 100644 index 0000000..35f917f --- /dev/null +++ b/gdb/gnulib/patches/0002-mkostemp-mkostemps-Fix-compilation-error-in-C-mode-o.patch @@ -0,0 +1,38 @@ +From 6954995dd32ea98a1973df31f411f3996bb47dfb Mon Sep 17 00:00:00 2001 +From: Tom Tromey +Date: Mon, 1 Oct 2018 14:57:45 -0600 +Subject: [PATCH] mkostemp, mkostemps: Fix compilation error in C++ mode on Mac + OS X. + +Attempting to use the mkostemp module in gdb caused a build failure +when using the C++ namespace feature, because mkostemp was not +declared. On OS X, mkostemp is declared in unistd.h, so this patch +extends the existing special case in stdlib.in.h to cover mkostemp and +mkostemps. + +* lib/stdlib.in.h: Include for mkostemp and mkostemps +on OS X. +--- + ChangeLog | 6 ++++++ + lib/stdlib.in.h | 3 ++- + 2 files changed, 8 insertions(+), 1 deletion(-) + +diff --git a/gdb/gnulib/import/stdlib.in.h b/gdb/gnulib/import/stdlib.in.h +index db3253bd97..8f803a2ea3 100644 +--- a/gdb/gnulib/import/stdlib.in.h ++++ b/gdb/gnulib/import/stdlib.in.h +@@ -87,9 +87,10 @@ struct random_data + # endif + #endif + +-#if (@GNULIB_MKSTEMP@ || @GNULIB_MKSTEMPS@ || @GNULIB_GETSUBOPT@ || defined GNULIB_POSIXCHECK) && ! defined __GLIBC__ && !((defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__) ++#if (@GNULIB_MKSTEMP@ || @GNULIB_MKSTEMPS@ || @GNULIB_MKOSTEMP@ || @GNULIB_MKOSTEMPS@ || @GNULIB_GETSUBOPT@ || defined GNULIB_POSIXCHECK) && ! defined __GLIBC__ && !((defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__) + /* On Mac OS X 10.3, only declares mkstemp. */ + /* On Mac OS X 10.5, only declares mkstemps. */ ++/* On Mac OS X 10.13, only declares mkostemp and mkostemps. */ + /* On Cygwin 1.7.1, only declares getsubopt. */ + /* But avoid namespace pollution on glibc systems and native Windows. */ + # include +-- +2.19.0 + diff --git a/gdb/gnulib/update-gnulib.sh b/gdb/gnulib/update-gnulib.sh index 09933ab..5129450 100755 --- a/gdb/gnulib/update-gnulib.sh +++ b/gdb/gnulib/update-gnulib.sh @@ -46,7 +46,7 @@ IMPORTED_GNULIB_MODULES="\ memchr \ memmem \ mkdir \ - mkstemp \ + mkostemp \ pathmax \ rawmemchr \ readlink \ @@ -169,6 +169,7 @@ apply_patches () } apply_patches "patches/0001-Fix-PR-gdb-23558-Use-system-s-getcwd-when-cross-comp.patch" +apply_patches "patches/0002-mkostemp-mkostemps-Fix-compilation-error-in-C-mode-o.patch" # Regenerate all necessary files... aclocal -Iimport/m4 && diff --git a/gdb/unittests/scoped_fd-selftests.c b/gdb/unittests/scoped_fd-selftests.c index d5c0d30..fb6a0d6 100644 --- a/gdb/unittests/scoped_fd-selftests.c +++ b/gdb/unittests/scoped_fd-selftests.c @@ -19,6 +19,7 @@ #include "defs.h" +#include "common/filestuff.h" #include "common/scoped_fd.h" #include "config.h" #include "selftest.h" @@ -31,7 +32,7 @@ static void test_destroy () { char filename[] = "scoped_fd-selftest-XXXXXX"; - int fd = mkstemp (filename); + int fd = gdb_mkostemp_cloexec (filename); SELF_CHECK (fd >= 0); unlink (filename); @@ -50,7 +51,7 @@ static void test_release () { char filename[] = "scoped_fd-selftest-XXXXXX"; - int fd = mkstemp (filename); + int fd = gdb_mkostemp_cloexec (filename); SELF_CHECK (fd >= 0); unlink (filename); diff --git a/gdb/unittests/scoped_mmap-selftests.c b/gdb/unittests/scoped_mmap-selftests.c index b181e02..75d1aed 100644 --- a/gdb/unittests/scoped_mmap-selftests.c +++ b/gdb/unittests/scoped_mmap-selftests.c @@ -19,6 +19,7 @@ #include "defs.h" +#include "common/filestuff.h" #include "common/scoped_mmap.h" #include "config.h" @@ -88,7 +89,7 @@ static void test_normal () { char filename[] = "scoped_mmapped_file-selftest-XXXXXX"; - int fd = mkstemp (filename); + int fd = gdb_mkostemp_cloexec (filename); SELF_CHECK (fd >= 0); SELF_CHECK (write (fd, "Hello!", 7) == 7);