Blame SOURCES/0148-tests-fix-execve-test-with-fresh-linux-kernels.patch

242c1e
From 1ec648999d3bf01ae87cac65c810d5d8f19c71c0 Mon Sep 17 00:00:00 2001
242c1e
From: Sven Schnelle <svens@stackframe.org>
242c1e
Date: Tue, 10 Nov 2020 07:38:34 +0100
242c1e
Subject: [PATCH 148/149] tests: fix execve test with fresh linux kernels
242c1e
242c1e
Starting with Linux commit v5.9-rc1~164^2^2~2, execve copies syscall
242c1e
arguments before trying to find the executable, failing with EFAULT
242c1e
in case of a faulty address.  Adjust the test to handle both variants
242c1e
of execve behaviour.
242c1e
242c1e
* tests/execve.c (errstr): New variable.
242c1e
(call_execve): New function.
242c1e
(main): Use it instead of execve.  Do not hardcode ENOENT in expected
242c1e
output of tests, use errstr instead.
242c1e
242c1e
Signed-off-by: Sven Schnelle <svens@stackframe.org>
242c1e
Signed-off-by: Dmitry V. Levin <ldv@altlinux.org>
242c1e
---
242c1e
 tests/execve.c | 54 ++++++++++++++++++++++++++++++++----------------------
242c1e
 1 file changed, 32 insertions(+), 22 deletions(-)
242c1e
242c1e
diff --git a/tests/execve.c b/tests/execve.c
242c1e
index 2f6ae52..961d284 100644
242c1e
--- a/tests/execve.c
242c1e
+++ b/tests/execve.c
242c1e
@@ -12,6 +12,16 @@
242c1e
 #include <stdio.h>
242c1e
 #include <unistd.h>
242c1e
 
242c1e
+static const char *errstr;
242c1e
+
242c1e
+static int
242c1e
+call_execve(const char *pathname, char *const *argv, char *const *envp)
242c1e
+{
242c1e
+	int rc = execve(pathname, argv, envp);
242c1e
+	errstr = sprintrc(rc);
242c1e
+	return rc;
242c1e
+}
242c1e
+
242c1e
 #define FILENAME "test.execve\nfilename"
242c1e
 #define Q_FILENAME "test.execve\\nfilename"
242c1e
 
242c1e
@@ -43,7 +53,7 @@ main(void)
242c1e
 	char ** const tail_argv = tail_memdup(argv, sizeof(argv));
242c1e
 	char ** const tail_envp = tail_memdup(envp, sizeof(envp));
242c1e
 
242c1e
-	execve(FILENAME, tail_argv, tail_envp);
242c1e
+	call_execve(FILENAME, tail_argv, tail_envp);
242c1e
 	printf("execve(\"%s\""
242c1e
 	       ", [\"%s\", \"%s\", \"%s\", %p, %p, %p, ... /* %p */]"
242c1e
 #if VERBOSE
242c1e
@@ -51,7 +61,7 @@ main(void)
242c1e
 #else
242c1e
 	       ", %p /* 5 vars, unterminated */"
242c1e
 #endif
242c1e
-	       ") = -1 ENOENT (%m)\n",
242c1e
+	       ") = %s\n",
242c1e
 	       Q_FILENAME, q_argv[0], q_argv[1], q_argv[2],
242c1e
 	       argv[3], argv[4], argv[5], (char *) tail_argv + sizeof(argv)
242c1e
 #if VERBOSE
242c1e
@@ -60,60 +70,60 @@ main(void)
242c1e
 #else
242c1e
 	       , tail_envp
242c1e
 #endif
242c1e
-	       );
242c1e
+	       , errstr);
242c1e
 
242c1e
 	tail_argv[ARRAY_SIZE(q_argv)] = NULL;
242c1e
 	tail_envp[ARRAY_SIZE(q_envp)] = NULL;
242c1e
 	(void) q_envp;	/* workaround for clang bug #33068 */
242c1e
 
242c1e
-	execve(FILENAME, tail_argv, tail_envp);
242c1e
+	call_execve(FILENAME, tail_argv, tail_envp);
242c1e
 	printf("execve(\"%s\", [\"%s\", \"%s\", \"%s\"]"
242c1e
 #if VERBOSE
242c1e
 	       ", [\"%s\", \"%s\"]"
242c1e
 #else
242c1e
 	       ", %p /* 2 vars */"
242c1e
 #endif
242c1e
-	       ") = -1 ENOENT (%m)\n",
242c1e
+	       ") = %s\n",
242c1e
 	       Q_FILENAME, q_argv[0], q_argv[1], q_argv[2]
242c1e
 #if VERBOSE
242c1e
 	       , q_envp[0], q_envp[1]
242c1e
 #else
242c1e
 	       , tail_envp
242c1e
 #endif
242c1e
-	       );
242c1e
+	       , errstr);
242c1e
 
242c1e
-	execve(FILENAME, tail_argv + 2, tail_envp + 1);
242c1e
+	call_execve(FILENAME, tail_argv + 2, tail_envp + 1);
242c1e
 	printf("execve(\"%s\", [\"%s\"]"
242c1e
 #if VERBOSE
242c1e
 	       ", [\"%s\"]"
242c1e
 #else
242c1e
 	       ", %p /* 1 var */"
242c1e
 #endif
242c1e
-	       ") = -1 ENOENT (%m)\n",
242c1e
+	       ") = %s\n",
242c1e
 	       Q_FILENAME, q_argv[2]
242c1e
 #if VERBOSE
242c1e
 	       , q_envp[1]
242c1e
 #else
242c1e
 	       , tail_envp + 1
242c1e
 #endif
242c1e
-	       );
242c1e
+	       , errstr);
242c1e
 
242c1e
 	TAIL_ALLOC_OBJECT_CONST_PTR(char *, empty);
242c1e
 	char **const efault = empty + 1;
242c1e
 	*empty = NULL;
242c1e
 
242c1e
-	execve(FILENAME, empty, empty);
242c1e
+	call_execve(FILENAME, empty, empty);
242c1e
 	printf("execve(\"%s\", []"
242c1e
 #if VERBOSE
242c1e
 	       ", []"
242c1e
 #else
242c1e
 	       ", %p /* 0 vars */"
242c1e
 #endif
242c1e
-	       ") = -1 ENOENT (%m)\n", Q_FILENAME
242c1e
+	       ") = %s\n", Q_FILENAME
242c1e
 #if !VERBOSE
242c1e
 	       , empty
242c1e
 #endif
242c1e
-	       );
242c1e
+	       , errstr);
242c1e
 
242c1e
 	char *const str_a = tail_alloc(DEFAULT_STRLEN + 2);
242c1e
 	fill_memory_ex(str_a, DEFAULT_STRLEN + 1, '0', 10);
242c1e
@@ -132,7 +142,7 @@ main(void)
242c1e
 	}
242c1e
 	a[i] = b[i] = NULL;
242c1e
 
242c1e
-	execve(FILENAME, a, b);
242c1e
+	call_execve(FILENAME, a, b);
242c1e
 	printf("execve(\"%s\", [\"%.*s\"...", Q_FILENAME, DEFAULT_STRLEN, a[0]);
242c1e
 	for (i = 1; i < DEFAULT_STRLEN; ++i)
242c1e
 		printf(", \"%s\"", a[i]);
242c1e
@@ -149,9 +159,9 @@ main(void)
242c1e
 #else
242c1e
 	printf("], %p /* %u vars */", b, DEFAULT_STRLEN + 1);
242c1e
 #endif
242c1e
-	printf(") = -1 ENOENT (%m)\n");
242c1e
+	printf(") = %s\n", errstr);
242c1e
 
242c1e
-	execve(FILENAME, a + 1, b + 1);
242c1e
+	call_execve(FILENAME, a + 1, b + 1);
242c1e
 	printf("execve(\"%s\", [\"%s\"", Q_FILENAME, a[1]);
242c1e
 	for (i = 2; i <= DEFAULT_STRLEN; ++i)
242c1e
 		printf(", \"%s\"", a[i]);
242c1e
@@ -163,15 +173,15 @@ main(void)
242c1e
 #else
242c1e
 	printf("], %p /* %d vars */", b + 1, DEFAULT_STRLEN);
242c1e
 #endif
242c1e
-	printf(") = -1 ENOENT (%m)\n");
242c1e
+	printf(") = %s\n", errstr);
242c1e
 
242c1e
-	execve(FILENAME, (char **) tail_argv[ARRAY_SIZE(q_argv)], efault);
242c1e
-	printf("execve(\"%s\", NULL, %p) = -1 ENOENT (%m)\n",
242c1e
-	       Q_FILENAME, efault);
242c1e
+	call_execve(FILENAME, (char **) tail_argv[ARRAY_SIZE(q_argv)], efault);
242c1e
+	printf("execve(\"%s\", NULL, %p) = %s\n",
242c1e
+	       Q_FILENAME, efault, errstr);
242c1e
 
242c1e
-	execve(FILENAME, efault, NULL);
242c1e
-	printf("execve(\"%s\", %p, NULL) = -1 ENOENT (%m)\n",
242c1e
-	       Q_FILENAME, efault);
242c1e
+	call_execve(FILENAME, efault, NULL);
242c1e
+	printf("execve(\"%s\", %p, NULL) = %s\n",
242c1e
+	       Q_FILENAME, efault, errstr);
242c1e
 
242c1e
 	leave_and_remove_subdir();
242c1e
 
242c1e
diff --git a/tests-m32/execve.c b/tests-m32/execve.c
242c1e
index 2f6ae52..961d284 100644
242c1e
--- a/tests-m32/execve.c
242c1e
+++ b/tests-m32/execve.c
242c1e
@@ -12,6 +12,16 @@
242c1e
 #include <stdio.h>
242c1e
 #include <unistd.h>
242c1e
 
242c1e
+static const char *errstr;
242c1e
+
242c1e
+static int
242c1e
+call_execve(const char *pathname, char *const *argv, char *const *envp)
242c1e
+{
242c1e
+	int rc = execve(pathname, argv, envp);
242c1e
+	errstr = sprintrc(rc);
242c1e
+	return rc;
242c1e
+}
242c1e
+
242c1e
 #define FILENAME "test.execve\nfilename"
242c1e
 #define Q_FILENAME "test.execve\\nfilename"
242c1e
 
242c1e
@@ -43,7 +53,7 @@ main(void)
242c1e
 	char ** const tail_argv = tail_memdup(argv, sizeof(argv));
242c1e
 	char ** const tail_envp = tail_memdup(envp, sizeof(envp));
242c1e
 
242c1e
-	execve(FILENAME, tail_argv, tail_envp);
242c1e
+	call_execve(FILENAME, tail_argv, tail_envp);
242c1e
 	printf("execve(\"%s\""
242c1e
 	       ", [\"%s\", \"%s\", \"%s\", %p, %p, %p, ... /* %p */]"
242c1e
 #if VERBOSE
242c1e
@@ -51,7 +61,7 @@ main(void)
242c1e
 #else
242c1e
 	       ", %p /* 5 vars, unterminated */"
242c1e
 #endif
242c1e
-	       ") = -1 ENOENT (%m)\n",
242c1e
+	       ") = %s\n",
242c1e
 	       Q_FILENAME, q_argv[0], q_argv[1], q_argv[2],
242c1e
 	       argv[3], argv[4], argv[5], (char *) tail_argv + sizeof(argv)
242c1e
 #if VERBOSE
242c1e
@@ -60,60 +70,60 @@ main(void)
242c1e
 #else
242c1e
 	       , tail_envp
242c1e
 #endif
242c1e
-	       );
242c1e
+	       , errstr);
242c1e
 
242c1e
 	tail_argv[ARRAY_SIZE(q_argv)] = NULL;
242c1e
 	tail_envp[ARRAY_SIZE(q_envp)] = NULL;
242c1e
 	(void) q_envp;	/* workaround for clang bug #33068 */
242c1e
 
242c1e
-	execve(FILENAME, tail_argv, tail_envp);
242c1e
+	call_execve(FILENAME, tail_argv, tail_envp);
242c1e
 	printf("execve(\"%s\", [\"%s\", \"%s\", \"%s\"]"
242c1e
 #if VERBOSE
242c1e
 	       ", [\"%s\", \"%s\"]"
242c1e
 #else
242c1e
 	       ", %p /* 2 vars */"
242c1e
 #endif
242c1e
-	       ") = -1 ENOENT (%m)\n",
242c1e
+	       ") = %s\n",
242c1e
 	       Q_FILENAME, q_argv[0], q_argv[1], q_argv[2]
242c1e
 #if VERBOSE
242c1e
 	       , q_envp[0], q_envp[1]
242c1e
 #else
242c1e
 	       , tail_envp
242c1e
 #endif
242c1e
-	       );
242c1e
+	       , errstr);
242c1e
 
242c1e
-	execve(FILENAME, tail_argv + 2, tail_envp + 1);
242c1e
+	call_execve(FILENAME, tail_argv + 2, tail_envp + 1);
242c1e
 	printf("execve(\"%s\", [\"%s\"]"
242c1e
 #if VERBOSE
242c1e
 	       ", [\"%s\"]"
242c1e
 #else
242c1e
 	       ", %p /* 1 var */"
242c1e
 #endif
242c1e
-	       ") = -1 ENOENT (%m)\n",
242c1e
+	       ") = %s\n",
242c1e
 	       Q_FILENAME, q_argv[2]
242c1e
 #if VERBOSE
242c1e
 	       , q_envp[1]
242c1e
 #else
242c1e
 	       , tail_envp + 1
242c1e
 #endif
242c1e
-	       );
242c1e
+	       , errstr);
242c1e
 
242c1e
 	TAIL_ALLOC_OBJECT_CONST_PTR(char *, empty);
242c1e
 	char **const efault = empty + 1;
242c1e
 	*empty = NULL;
242c1e
 
242c1e
-	execve(FILENAME, empty, empty);
242c1e
+	call_execve(FILENAME, empty, empty);
242c1e
 	printf("execve(\"%s\", []"
242c1e
 #if VERBOSE
242c1e
 	       ", []"
242c1e
 #else
242c1e
 	       ", %p /* 0 vars */"
242c1e
 #endif
242c1e
-	       ") = -1 ENOENT (%m)\n", Q_FILENAME
242c1e
+	       ") = %s\n", Q_FILENAME
242c1e
 #if !VERBOSE
242c1e
 	       , empty
242c1e
 #endif
242c1e
-	       );
242c1e
+	       , errstr);
242c1e
 
242c1e
 	char *const str_a = tail_alloc(DEFAULT_STRLEN + 2);
242c1e
 	fill_memory_ex(str_a, DEFAULT_STRLEN + 1, '0', 10);
242c1e
@@ -132,7 +142,7 @@ main(void)
242c1e
 	}
242c1e
 	a[i] = b[i] = NULL;
242c1e
 
242c1e
-	execve(FILENAME, a, b);
242c1e
+	call_execve(FILENAME, a, b);
242c1e
 	printf("execve(\"%s\", [\"%.*s\"...", Q_FILENAME, DEFAULT_STRLEN, a[0]);
242c1e
 	for (i = 1; i < DEFAULT_STRLEN; ++i)
242c1e
 		printf(", \"%s\"", a[i]);
242c1e
@@ -149,9 +159,9 @@ main(void)
242c1e
 #else
242c1e
 	printf("], %p /* %u vars */", b, DEFAULT_STRLEN + 1);
242c1e
 #endif
242c1e
-	printf(") = -1 ENOENT (%m)\n");
242c1e
+	printf(") = %s\n", errstr);
242c1e
 
242c1e
-	execve(FILENAME, a + 1, b + 1);
242c1e
+	call_execve(FILENAME, a + 1, b + 1);
242c1e
 	printf("execve(\"%s\", [\"%s\"", Q_FILENAME, a[1]);
242c1e
 	for (i = 2; i <= DEFAULT_STRLEN; ++i)
242c1e
 		printf(", \"%s\"", a[i]);
242c1e
@@ -163,15 +173,15 @@ main(void)
242c1e
 #else
242c1e
 	printf("], %p /* %d vars */", b + 1, DEFAULT_STRLEN);
242c1e
 #endif
242c1e
-	printf(") = -1 ENOENT (%m)\n");
242c1e
+	printf(") = %s\n", errstr);
242c1e
 
242c1e
-	execve(FILENAME, (char **) tail_argv[ARRAY_SIZE(q_argv)], efault);
242c1e
-	printf("execve(\"%s\", NULL, %p) = -1 ENOENT (%m)\n",
242c1e
-	       Q_FILENAME, efault);
242c1e
+	call_execve(FILENAME, (char **) tail_argv[ARRAY_SIZE(q_argv)], efault);
242c1e
+	printf("execve(\"%s\", NULL, %p) = %s\n",
242c1e
+	       Q_FILENAME, efault, errstr);
242c1e
 
242c1e
-	execve(FILENAME, efault, NULL);
242c1e
-	printf("execve(\"%s\", %p, NULL) = -1 ENOENT (%m)\n",
242c1e
-	       Q_FILENAME, efault);
242c1e
+	call_execve(FILENAME, efault, NULL);
242c1e
+	printf("execve(\"%s\", %p, NULL) = %s\n",
242c1e
+	       Q_FILENAME, efault, errstr);
242c1e
 
242c1e
 	leave_and_remove_subdir();
242c1e
 
242c1e
diff --git a/tests-mx32/execve.c b/tests-mx32/execve.c
242c1e
index 2f6ae52..961d284 100644
242c1e
--- a/tests-mx32/execve.c
242c1e
+++ b/tests-mx32/execve.c
242c1e
@@ -12,6 +12,16 @@
242c1e
 #include <stdio.h>
242c1e
 #include <unistd.h>
242c1e
 
242c1e
+static const char *errstr;
242c1e
+
242c1e
+static int
242c1e
+call_execve(const char *pathname, char *const *argv, char *const *envp)
242c1e
+{
242c1e
+	int rc = execve(pathname, argv, envp);
242c1e
+	errstr = sprintrc(rc);
242c1e
+	return rc;
242c1e
+}
242c1e
+
242c1e
 #define FILENAME "test.execve\nfilename"
242c1e
 #define Q_FILENAME "test.execve\\nfilename"
242c1e
 
242c1e
@@ -43,7 +53,7 @@ main(void)
242c1e
 	char ** const tail_argv = tail_memdup(argv, sizeof(argv));
242c1e
 	char ** const tail_envp = tail_memdup(envp, sizeof(envp));
242c1e
 
242c1e
-	execve(FILENAME, tail_argv, tail_envp);
242c1e
+	call_execve(FILENAME, tail_argv, tail_envp);
242c1e
 	printf("execve(\"%s\""
242c1e
 	       ", [\"%s\", \"%s\", \"%s\", %p, %p, %p, ... /* %p */]"
242c1e
 #if VERBOSE
242c1e
@@ -51,7 +61,7 @@ main(void)
242c1e
 #else
242c1e
 	       ", %p /* 5 vars, unterminated */"
242c1e
 #endif
242c1e
-	       ") = -1 ENOENT (%m)\n",
242c1e
+	       ") = %s\n",
242c1e
 	       Q_FILENAME, q_argv[0], q_argv[1], q_argv[2],
242c1e
 	       argv[3], argv[4], argv[5], (char *) tail_argv + sizeof(argv)
242c1e
 #if VERBOSE
242c1e
@@ -60,60 +70,60 @@ main(void)
242c1e
 #else
242c1e
 	       , tail_envp
242c1e
 #endif
242c1e
-	       );
242c1e
+	       , errstr);
242c1e
 
242c1e
 	tail_argv[ARRAY_SIZE(q_argv)] = NULL;
242c1e
 	tail_envp[ARRAY_SIZE(q_envp)] = NULL;
242c1e
 	(void) q_envp;	/* workaround for clang bug #33068 */
242c1e
 
242c1e
-	execve(FILENAME, tail_argv, tail_envp);
242c1e
+	call_execve(FILENAME, tail_argv, tail_envp);
242c1e
 	printf("execve(\"%s\", [\"%s\", \"%s\", \"%s\"]"
242c1e
 #if VERBOSE
242c1e
 	       ", [\"%s\", \"%s\"]"
242c1e
 #else
242c1e
 	       ", %p /* 2 vars */"
242c1e
 #endif
242c1e
-	       ") = -1 ENOENT (%m)\n",
242c1e
+	       ") = %s\n",
242c1e
 	       Q_FILENAME, q_argv[0], q_argv[1], q_argv[2]
242c1e
 #if VERBOSE
242c1e
 	       , q_envp[0], q_envp[1]
242c1e
 #else
242c1e
 	       , tail_envp
242c1e
 #endif
242c1e
-	       );
242c1e
+	       , errstr);
242c1e
 
242c1e
-	execve(FILENAME, tail_argv + 2, tail_envp + 1);
242c1e
+	call_execve(FILENAME, tail_argv + 2, tail_envp + 1);
242c1e
 	printf("execve(\"%s\", [\"%s\"]"
242c1e
 #if VERBOSE
242c1e
 	       ", [\"%s\"]"
242c1e
 #else
242c1e
 	       ", %p /* 1 var */"
242c1e
 #endif
242c1e
-	       ") = -1 ENOENT (%m)\n",
242c1e
+	       ") = %s\n",
242c1e
 	       Q_FILENAME, q_argv[2]
242c1e
 #if VERBOSE
242c1e
 	       , q_envp[1]
242c1e
 #else
242c1e
 	       , tail_envp + 1
242c1e
 #endif
242c1e
-	       );
242c1e
+	       , errstr);
242c1e
 
242c1e
 	TAIL_ALLOC_OBJECT_CONST_PTR(char *, empty);
242c1e
 	char **const efault = empty + 1;
242c1e
 	*empty = NULL;
242c1e
 
242c1e
-	execve(FILENAME, empty, empty);
242c1e
+	call_execve(FILENAME, empty, empty);
242c1e
 	printf("execve(\"%s\", []"
242c1e
 #if VERBOSE
242c1e
 	       ", []"
242c1e
 #else
242c1e
 	       ", %p /* 0 vars */"
242c1e
 #endif
242c1e
-	       ") = -1 ENOENT (%m)\n", Q_FILENAME
242c1e
+	       ") = %s\n", Q_FILENAME
242c1e
 #if !VERBOSE
242c1e
 	       , empty
242c1e
 #endif
242c1e
-	       );
242c1e
+	       , errstr);
242c1e
 
242c1e
 	char *const str_a = tail_alloc(DEFAULT_STRLEN + 2);
242c1e
 	fill_memory_ex(str_a, DEFAULT_STRLEN + 1, '0', 10);
242c1e
@@ -132,7 +142,7 @@ main(void)
242c1e
 	}
242c1e
 	a[i] = b[i] = NULL;
242c1e
 
242c1e
-	execve(FILENAME, a, b);
242c1e
+	call_execve(FILENAME, a, b);
242c1e
 	printf("execve(\"%s\", [\"%.*s\"...", Q_FILENAME, DEFAULT_STRLEN, a[0]);
242c1e
 	for (i = 1; i < DEFAULT_STRLEN; ++i)
242c1e
 		printf(", \"%s\"", a[i]);
242c1e
@@ -149,9 +159,9 @@ main(void)
242c1e
 #else
242c1e
 	printf("], %p /* %u vars */", b, DEFAULT_STRLEN + 1);
242c1e
 #endif
242c1e
-	printf(") = -1 ENOENT (%m)\n");
242c1e
+	printf(") = %s\n", errstr);
242c1e
 
242c1e
-	execve(FILENAME, a + 1, b + 1);
242c1e
+	call_execve(FILENAME, a + 1, b + 1);
242c1e
 	printf("execve(\"%s\", [\"%s\"", Q_FILENAME, a[1]);
242c1e
 	for (i = 2; i <= DEFAULT_STRLEN; ++i)
242c1e
 		printf(", \"%s\"", a[i]);
242c1e
@@ -163,15 +173,15 @@ main(void)
242c1e
 #else
242c1e
 	printf("], %p /* %d vars */", b + 1, DEFAULT_STRLEN);
242c1e
 #endif
242c1e
-	printf(") = -1 ENOENT (%m)\n");
242c1e
+	printf(") = %s\n", errstr);
242c1e
 
242c1e
-	execve(FILENAME, (char **) tail_argv[ARRAY_SIZE(q_argv)], efault);
242c1e
-	printf("execve(\"%s\", NULL, %p) = -1 ENOENT (%m)\n",
242c1e
-	       Q_FILENAME, efault);
242c1e
+	call_execve(FILENAME, (char **) tail_argv[ARRAY_SIZE(q_argv)], efault);
242c1e
+	printf("execve(\"%s\", NULL, %p) = %s\n",
242c1e
+	       Q_FILENAME, efault, errstr);
242c1e
 
242c1e
-	execve(FILENAME, efault, NULL);
242c1e
-	printf("execve(\"%s\", %p, NULL) = -1 ENOENT (%m)\n",
242c1e
-	       Q_FILENAME, efault);
242c1e
+	call_execve(FILENAME, efault, NULL);
242c1e
+	printf("execve(\"%s\", %p, NULL) = %s\n",
242c1e
+	       Q_FILENAME, efault, errstr);
242c1e
 
242c1e
 	leave_and_remove_subdir();
242c1e
 
242c1e
-- 
242c1e
2.1.4
242c1e