|
From: Nicholas N. <nj...@ca...> - 2004-02-12 14:35:37
|
CVS commit by nethercote:
Now doing pre_mem_read()s on the args to execve(), so eg. Memcheck can check
them. Added a regtest for this.
A memcheck/tests/execve.c 1.1 [no copyright]
A memcheck/tests/execve.stderr.exp 1.1
A memcheck/tests/execve.vgtest 1.1
M +17 -2 coregrind/vg_syscalls.c 1.84
M +4 -1 memcheck/tests/Makefile.am 1.31
--- valgrind/coregrind/vg_syscalls.c #1.83:1.84
@@ -1811,4 +1811,16 @@ PRE(capset)
}
+// Pre_read a char** argument.
+void pre_argv_envp(Addr a, ThreadId tid, Char* s1, Char* s2)
+{
+ while (True) {
+ Addr a_deref = deref_Addr( tid, a, s1 );
+ if (0 == a_deref)
+ break;
+ SYSCALL_TRACK( pre_mem_read_asciiz, tid, s2, a_deref );
+ a += sizeof(char*);
+ }
+}
+
PRE(execve)
{
@@ -1816,6 +1828,9 @@ PRE(execve)
char *const argv [],
char *const envp[]); */
- MAYBE_PRINTF("execve ( %p(%s), %p, %p ) --- NOT CHECKED\n",
- arg1, arg1, arg2, arg3);
+ MAYBE_PRINTF("execve ( %p(%s), %p, %p )\n", arg1, arg1, arg2, arg3);
+
+ SYSCALL_TRACK( pre_mem_read_asciiz, tid, "execve(filename)", arg1 );
+ pre_argv_envp( arg2, tid, "execve(argv)", "execve(argv[i])" );
+ pre_argv_envp( arg3, tid, "execve(envp)", "execve(envp[i])" );
/* Erk. If the exec fails, then the following will have made a
--- valgrind/memcheck/tests/Makefile.am #1.30:1.31
@@ -25,4 +25,5 @@
errs1.stderr.exp errs1.vgtest \
exitprog.stderr.exp exitprog.vgtest \
+ execve.stderr.exp execve.vgtest \
fprw.stderr.exp fprw.vgtest \
fwrite.stderr.exp fwrite.stdout.exp fwrite.vgtest \
@@ -69,5 +70,6 @@
badaddrvalue badfree badjump badloop badrw brk buflen_check \
clientperm custom_alloc \
- doublefree error_counts errs1 exitprog fprw fwrite inits inline \
+ doublefree error_counts errs1 exitprog execve \
+ fprw fwrite inits inline \
malloc1 malloc2 malloc3 manuel1 manuel2 manuel3 \
memalign_test memcmptest mmaptest nanoleak new_nothrow null_socket \
@@ -94,4 +96,5 @@
error_counts_SOURCES = error_counts.c
errs1_SOURCES = errs1.c
+execve_SOURCES = execve.c
exitprog_SOURCES = exitprog.c
fprw_SOURCES = fprw.c
|