From: Bart Van Assche Date: Sun, 23 Aug 2009 09:53:27 +0000 (+0000) Subject: The configure-time test whether the proc filesystem is mounted (introduced X-Git-Tag: svn/VALGRIND_3_6_0~534 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6b9dcdcd972e74faa1fbf3a5098c72799335b264;p=thirdparty%2Fvalgrind.git The configure-time test whether the proc filesystem is mounted (introduced in r10156) broke cross-compilation. This patch converts the configure-time test into a runtime test. Should fix bug #204843. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@10860 --- diff --git a/configure.in b/configure.in index edb4274427..bd3df63e38 100644 --- a/configure.in +++ b/configure.in @@ -1469,14 +1469,6 @@ AC_DEFINE([HAVE_TLS], 1, [can use __thread to define thread-local variables]) fi -#---------------------------------------------------------------------------- -# Check for /proc filesystem -#---------------------------------------------------------------------------- -AC_CHECK_FILES(/proc/self/fd /proc/self/exe /proc/self/maps, - [ AC_DEFINE([HAVE_PROC], 1, [can use /proc filesystem]) ], - []) - - #---------------------------------------------------------------------------- # Checks for C header files. #---------------------------------------------------------------------------- diff --git a/coregrind/m_aspacemgr/aspacemgr-linux.c b/coregrind/m_aspacemgr/aspacemgr-linux.c index 8580b19e05..f7c3446ac3 100644 --- a/coregrind/m_aspacemgr/aspacemgr-linux.c +++ b/coregrind/m_aspacemgr/aspacemgr-linux.c @@ -2986,8 +2986,6 @@ Bool VG_(am_relocate_nooverlap_client)( /*OUT*/Bool* need_discard, #endif // HAVE_MREMAP -#if HAVE_PROC - /*-----------------------------------------------------------------*/ /*--- ---*/ /*--- A simple parser for /proc/self/maps on Linux 2.4.X/2.6.X. ---*/ @@ -3493,8 +3491,6 @@ Bool VG_(get_changed_segments)( return !css_overflowed; } -#endif // HAVE_PROC - #endif // defined(VGO_linux) || defined(VGO_darwin) diff --git a/coregrind/m_libcfile.c b/coregrind/m_libcfile.c index 72a9ea624d..61d35a545a 100644 --- a/coregrind/m_libcfile.c +++ b/coregrind/m_libcfile.c @@ -1083,6 +1083,23 @@ Char *VG_(dirname)(const Char *path) return buf; } +/* --------------------------------------------------------------------- + proc filesystem + ------------------------------------------------------------------ */ +Bool VG_(have_proc_filesystem)(void) +{ + static int have_proc_fs = -1; + + if (have_proc_fs < 0) + { + have_proc_fs + = VG_(access)("/proc/self/fd", 1, 0, 0) == 0 + && VG_(access)("/proc/self/exe", 1, 0, 0) == 0 + && VG_(access)("/proc/self/maps", 1, 0, 0) == 0; + } + return have_proc_fs; +} + /*--------------------------------------------------------------------*/ /*--- end ---*/ diff --git a/coregrind/m_main.c b/coregrind/m_main.c index 216ce548f7..f12b056f72 100644 --- a/coregrind/m_main.c +++ b/coregrind/m_main.c @@ -1802,48 +1802,48 @@ Int valgrind_main ( Int argc, HChar **argv, HChar **envp ) // when it tries to open /proc//cmdline for itself. // p: setup file descriptors //-------------------------------------------------------------- -#if !HAVE_PROC - // client shouldn't be using /proc! - VG_(cl_cmdline_fd) = -1; -#else - if (!need_help) { - HChar buf[50], buf2[50+64]; - HChar nul[1]; - Int fd, r; - HChar* exename; + if (! VG_(have_proc_filesystem)()) { + // client shouldn't be using /proc! + VG_(cl_cmdline_fd) = -1; + } else { + if (!need_help) { + HChar buf[50], buf2[50+64]; + HChar nul[1]; + Int fd, r; + HChar* exename; + + VG_(debugLog)(1, "main", "Create fake /proc//cmdline\n"); + + VG_(sprintf)(buf, "proc_%d_cmdline", VG_(getpid)()); + fd = VG_(mkstemp)( buf, buf2 ); + if (fd == -1) + VG_(err_config_error)("Can't create client cmdline file in /tmp."); + + nul[0] = 0; + exename = VG_(args_the_exename) ? VG_(args_the_exename) + : "unknown_exename"; + VG_(write)(fd, VG_(args_the_exename), + VG_(strlen)( VG_(args_the_exename) )); + VG_(write)(fd, nul, 1); - VG_(debugLog)(1, "main", "Create fake /proc//cmdline\n"); + for (i = 0; i < VG_(sizeXA)( VG_(args_for_client) ); i++) { + HChar* arg = * (HChar**) VG_(indexXA)( VG_(args_for_client), i ); + VG_(write)(fd, arg, VG_(strlen)( arg )); + VG_(write)(fd, nul, 1); + } - VG_(sprintf)(buf, "proc_%d_cmdline", VG_(getpid)()); - fd = VG_(mkstemp)( buf, buf2 ); - if (fd == -1) - VG_(err_config_error)("Can't create client cmdline file in /tmp."); + /* Don't bother to seek the file back to the start; instead do + it every time a copy of it is given out (by PRE(sys_open)). + That is probably more robust across fork() etc. */ - nul[0] = 0; - exename = VG_(args_the_exename) ? VG_(args_the_exename) - : "unknown_exename"; - VG_(write)(fd, VG_(args_the_exename), - VG_(strlen)( VG_(args_the_exename) )); - VG_(write)(fd, nul, 1); + /* Now delete it, but hang on to the fd. */ + r = VG_(unlink)( buf2 ); + if (r) + VG_(err_config_error)("Can't delete client cmdline file in /tmp."); - for (i = 0; i < VG_(sizeXA)( VG_(args_for_client) ); i++) { - HChar* arg = * (HChar**) VG_(indexXA)( VG_(args_for_client), i ); - VG_(write)(fd, arg, VG_(strlen)( arg )); - VG_(write)(fd, nul, 1); + VG_(cl_cmdline_fd) = fd; } - - /* Don't bother to seek the file back to the start; instead do - it every time a copy of it is given out (by PRE(sys_open)). - That is probably more robust across fork() etc. */ - - /* Now delete it, but hang on to the fd. */ - r = VG_(unlink)( buf2 ); - if (r) - VG_(err_config_error)("Can't delete client cmdline file in /tmp."); - - VG_(cl_cmdline_fd) = fd; } -#endif //-------------------------------------------------------------- // Init tool part 1: pre_clo_init diff --git a/coregrind/m_syswrap/syswrap-generic.c b/coregrind/m_syswrap/syswrap-generic.c index 6332859a42..1063802ae8 100644 --- a/coregrind/m_syswrap/syswrap-generic.c +++ b/coregrind/m_syswrap/syswrap-generic.c @@ -3526,12 +3526,12 @@ PRE(sys_open) } PRE_MEM_RASCIIZ( "open(filename)", ARG1 ); -#if HAVE_PROC - /* Handle the case where the open is of /proc/self/cmdline or - /proc//cmdline, and just give it a copy of the fd for the - fake file we cooked up at startup (in m_main). Also, seek the - cloned fd back to the start. */ + if (VG_(have_proc_filesystem)()) { + /* Handle the case where the open is of /proc/self/cmdline or + /proc//cmdline, and just give it a copy of the fd for the + fake file we cooked up at startup (in m_main). Also, seek the + cloned fd back to the start. */ HChar name[30]; Char* arg1s = (Char*) ARG1; SysRes sres; @@ -3551,7 +3551,6 @@ PRE(sys_open) return; } } -#endif // HAVE_PROC /* Otherwise handle normally */ *flags |= SfMayBlock; @@ -3674,7 +3673,6 @@ PRE(sys_readlink) PRE_MEM_WRITE( "readlink(buf)", ARG2,ARG3 ); { -#if HAVE_PROC /* * Handle the case where readlink is looking at /proc/self/exe or * /proc//exe. @@ -3682,7 +3680,7 @@ PRE(sys_readlink) HChar name[25]; Char* arg1s = (Char*) ARG1; VG_(sprintf)(name, "/proc/%d/exe", VG_(getpid)()); - if (ML_(safe_to_deref)(arg1s, 1) && + if (VG_(have_proc_filesystem()) && ML_(safe_to_deref)(arg1s, 1) && (VG_STREQ(arg1s, name) || VG_STREQ(arg1s, "/proc/self/exe")) ) { @@ -3690,7 +3688,6 @@ PRE(sys_readlink) SET_STATUS_from_SysRes( VG_(do_syscall3)(saved, (UWord)name, ARG2, ARG3)); } else -#endif // HAVE_PROC { /* Normal case */ SET_STATUS_from_SysRes( VG_(do_syscall3)(saved, ARG1, ARG2, ARG3)); diff --git a/coregrind/pub_core_libcfile.h b/coregrind/pub_core_libcfile.h index 548f1b4d70..cc66e2311a 100644 --- a/coregrind/pub_core_libcfile.h +++ b/coregrind/pub_core_libcfile.h @@ -98,6 +98,10 @@ extern Int VG_(mkstemp) ( HChar* part_of_name, /*OUT*/HChar* fullname ); calling VG_(get_startup_wd) (in pub_tool_libcfile.h). */ extern Bool VG_(record_startup_wd) ( void ); +/* Whether or not the proc filesystem has been mounted at the /proc + mountpoint. */ +extern Bool VG_(have_proc_filesystem)(void); + #endif // __PUB_CORE_LIBCFILE_H /*--------------------------------------------------------------------*/