From: Bart Van Assche Date: Tue, 25 Aug 2009 20:15:41 +0000 (+0000) Subject: Switched back from dynamic detection of whether the proc filesystem X-Git-Tag: svn/VALGRIND_3_6_0~529 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=82e0033fdd165523217cc3b22fd350301d5a3264;p=thirdparty%2Fvalgrind.git Switched back from dynamic detection of whether the proc filesystem is mounted to compile-time logic in order to minimize the differences in behavior with Valgrind version 3.5.0. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@10868 --- diff --git a/coregrind/m_libcfile.c b/coregrind/m_libcfile.c index f30c0d8157..72a9ea624d 100644 --- a/coregrind/m_libcfile.c +++ b/coregrind/m_libcfile.c @@ -1083,23 +1083,6 @@ Char *VG_(dirname)(const Char *path) return buf; } -/* --------------------------------------------------------------------- - proc filesystem - ------------------------------------------------------------------ */ -Bool VG_(is_procfs_mounted)(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 c3cd1e491f..190569c86b 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 (! VG_(is_procfs_mounted)()) { - // 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); +#if !defined(VGO_linux) + // 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; - 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_(debugLog)(1, "main", "Create fake /proc//cmdline\n"); - /* 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. */ + 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."); - /* 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."); + 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_(cl_cmdline_fd) = fd; + 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); } + + /* 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 25f056b2ed..5f66535600 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 (VG_(is_procfs_mounted)()) +#if defined(VGO_linux) + /* 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. */ { - /* 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,6 +3551,7 @@ PRE(sys_open) return; } } +#endif // defined(VGO_linux) /* Otherwise handle normally */ *flags |= SfMayBlock; @@ -3673,6 +3674,7 @@ PRE(sys_readlink) PRE_MEM_WRITE( "readlink(buf)", ARG2,ARG3 ); { +#if defined(VGO_linux) /* * Handle the case where readlink is looking at /proc/self/exe or * /proc//exe. @@ -3680,7 +3682,7 @@ PRE(sys_readlink) HChar name[25]; Char* arg1s = (Char*) ARG1; VG_(sprintf)(name, "/proc/%d/exe", VG_(getpid)()); - if (VG_(is_procfs_mounted()) && ML_(safe_to_deref)(arg1s, 1) && + if (ML_(safe_to_deref)(arg1s, 1) && (VG_STREQ(arg1s, name) || VG_STREQ(arg1s, "/proc/self/exe")) ) { @@ -3688,6 +3690,7 @@ PRE(sys_readlink) SET_STATUS_from_SysRes( VG_(do_syscall3)(saved, (UWord)name, ARG2, ARG3)); } else +#endif // defined(VGO_linux) { /* 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 36b8f045a2..548f1b4d70 100644 --- a/coregrind/pub_core_libcfile.h +++ b/coregrind/pub_core_libcfile.h @@ -98,10 +98,6 @@ 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_(is_procfs_mounted)(void); - #endif // __PUB_CORE_LIBCFILE_H /*--------------------------------------------------------------------*/