]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Switched back from dynamic detection of whether the proc filesystem
authorBart Van Assche <bvanassche@acm.org>
Tue, 25 Aug 2009 20:15:41 +0000 (20:15 +0000)
committerBart Van Assche <bvanassche@acm.org>
Tue, 25 Aug 2009 20:15:41 +0000 (20:15 +0000)
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

coregrind/m_libcfile.c
coregrind/m_main.c
coregrind/m_syswrap/syswrap-generic.c
coregrind/pub_core_libcfile.h

index f30c0d8157034831b902f73c33aaa3a5a0a8efdf..72a9ea624d25122cf5ef51a934bf2f800927d66c 100644 (file)
@@ -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                                                          ---*/
index c3cd1e491f16386e01bd4b7f503b14a7254356f7..190569c86b4f014e6d9f4f0452c5cd13fb998bdb 100644 (file)
@@ -1802,48 +1802,48 @@ Int valgrind_main ( Int argc, HChar **argv, HChar **envp )
    // when it tries to open /proc/<pid>/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/<pid>/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/<pid>/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
index 25f056b2ed2c57f2896e3b922929fd10eb5f5a6a..5f66535600af1cff40aafb6d3a6c125469b574b8 100644 (file)
@@ -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/<pid>/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/<pid>/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/<pid>/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));
index 36b8f045a29f21eca2086b6ead4a8232c1083b95..548f1b4d709fca1f909cc90b9c153edb6224c855 100644 (file)
@@ -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
 
 /*--------------------------------------------------------------------*/