mirror of
https://github.com/Zenithsiz/ftmemsim-valgrind.git
synced 2026-02-03 10:05:29 +00:00
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
This commit is contained in:
parent
81e7391bef
commit
6b9dcdcd97
@ -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.
|
||||
#----------------------------------------------------------------------------
|
||||
|
||||
@ -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)
|
||||
|
||||
|
||||
@ -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 ---*/
|
||||
|
||||
@ -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 !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/<pid>/cmdline\n");
|
||||
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.");
|
||||
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);
|
||||
|
||||
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 ));
|
||||
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);
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
/* 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
|
||||
|
||||
@ -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/<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. */
|
||||
if (VG_(have_proc_filesystem)())
|
||||
{
|
||||
/* 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,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/<pid>/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));
|
||||
|
||||
@ -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
|
||||
|
||||
/*--------------------------------------------------------------------*/
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user