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 <tom@tromey.com> * 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.
This commit is contained in:
parent
e418a61a67
commit
b3279b601e
@ -1,3 +1,27 @@
|
||||
2018-10-27 Tom Tromey <tom@tromey.com>
|
||||
|
||||
* 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 <tom@tromey.com>
|
||||
|
||||
* unittests/mkdir-recursive-selftests.c: New file.
|
||||
|
@ -20,6 +20,7 @@
|
||||
#define FILESTUFF_H
|
||||
|
||||
#include <dirent.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
/* 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. */
|
||||
|
||||
|
@ -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<scoped_fd> 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<scoped_fd> 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"));
|
||||
|
||||
|
@ -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 \
|
||||
|
2
gdb/gnulib/aclocal.m4
vendored
2
gdb/gnulib/aclocal.m4
vendored
@ -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])
|
||||
|
@ -95,6 +95,10 @@
|
||||
whether the gnulib module getcwd shall be considered present. */
|
||||
#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
|
||||
|
117
gdb/gnulib/configure
vendored
117
gdb/gnulib/configure
vendored
@ -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,91 +21893,37 @@ $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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
gl_LIBOBJS="$gl_LIBOBJS mkostemp.$ac_objext"
|
||||
|
||||
|
||||
|
||||
fi
|
||||
|
||||
|
||||
cat >>confdefs.h <<_ACEOF
|
||||
#define GNULIB_MKOSTEMP 1
|
||||
_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
|
||||
|
||||
|
||||
|
||||
@ -21985,24 +21931,13 @@ $as_echo "$gl_cv_func_working_mkstemp" >&6; }
|
||||
|
||||
|
||||
|
||||
|
||||
gl_LIBOBJS="$gl_LIBOBJS mkstemp.$ac_objext"
|
||||
|
||||
|
||||
|
||||
fi
|
||||
GNULIB_MKOSTEMP=1
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
GNULIB_MKSTEMP=1
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
$as_echo "#define GNULIB_TEST_MKSTEMP 1" >>confdefs.h
|
||||
$as_echo "#define GNULIB_TEST_MKOSTEMP 1" >>confdefs.h
|
||||
|
||||
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -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@
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
23
gdb/gnulib/import/m4/mkostemp.m4
Normal file
23
gdb/gnulib/import/m4/mkostemp.m4
Normal file
@ -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 <stdlib.h> 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],
|
||||
[
|
||||
])
|
@ -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],
|
||||
[
|
||||
])
|
@ -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);
|
||||
}
|
@ -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 <unistd.h> declares mkstemp. */
|
||||
/* On Mac OS X 10.5, only <unistd.h> declares mkstemps. */
|
||||
/* On Mac OS X 10.13, only <unistd.h> declares mkostemp and mkostemps. */
|
||||
/* On Cygwin 1.7.1, only <unistd.h> declares getsubopt. */
|
||||
/* But avoid namespace pollution on glibc systems and native Windows. */
|
||||
# include <unistd.h>
|
||||
|
@ -0,0 +1,38 @@
|
||||
From 6954995dd32ea98a1973df31f411f3996bb47dfb Mon Sep 17 00:00:00 2001
|
||||
From: Tom Tromey <tom@tromey.com>
|
||||
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 <unistd.h> 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 <unistd.h> declares mkstemp. */
|
||||
/* On Mac OS X 10.5, only <unistd.h> declares mkstemps. */
|
||||
+/* On Mac OS X 10.13, only <unistd.h> declares mkostemp and mkostemps. */
|
||||
/* On Cygwin 1.7.1, only <unistd.h> declares getsubopt. */
|
||||
/* But avoid namespace pollution on glibc systems and native Windows. */
|
||||
# include <unistd.h>
|
||||
--
|
||||
2.19.0
|
||||
|
@ -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 &&
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user