xref: /aosp_15_r20/external/strace/tests/execve.c (revision cf84ac9a129d8ea9952db616b4e9b904c4bdde56)
1*cf84ac9aSAndroid Build Coastguard Worker /*
2*cf84ac9aSAndroid Build Coastguard Worker  * This file is part of execve strace test.
3*cf84ac9aSAndroid Build Coastguard Worker  *
4*cf84ac9aSAndroid Build Coastguard Worker  * Copyright (c) 2015-2016 Dmitry V. Levin <[email protected]>
5*cf84ac9aSAndroid Build Coastguard Worker  * Copyright (c) 2015-2018 The strace developers.
6*cf84ac9aSAndroid Build Coastguard Worker  * All rights reserved.
7*cf84ac9aSAndroid Build Coastguard Worker  *
8*cf84ac9aSAndroid Build Coastguard Worker  * Redistribution and use in source and binary forms, with or without
9*cf84ac9aSAndroid Build Coastguard Worker  * modification, are permitted provided that the following conditions
10*cf84ac9aSAndroid Build Coastguard Worker  * are met:
11*cf84ac9aSAndroid Build Coastguard Worker  * 1. Redistributions of source code must retain the above copyright
12*cf84ac9aSAndroid Build Coastguard Worker  *    notice, this list of conditions and the following disclaimer.
13*cf84ac9aSAndroid Build Coastguard Worker  * 2. Redistributions in binary form must reproduce the above copyright
14*cf84ac9aSAndroid Build Coastguard Worker  *    notice, this list of conditions and the following disclaimer in the
15*cf84ac9aSAndroid Build Coastguard Worker  *    documentation and/or other materials provided with the distribution.
16*cf84ac9aSAndroid Build Coastguard Worker  * 3. The name of the author may not be used to endorse or promote products
17*cf84ac9aSAndroid Build Coastguard Worker  *    derived from this software without specific prior written permission.
18*cf84ac9aSAndroid Build Coastguard Worker  *
19*cf84ac9aSAndroid Build Coastguard Worker  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
20*cf84ac9aSAndroid Build Coastguard Worker  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
21*cf84ac9aSAndroid Build Coastguard Worker  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
22*cf84ac9aSAndroid Build Coastguard Worker  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
23*cf84ac9aSAndroid Build Coastguard Worker  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
24*cf84ac9aSAndroid Build Coastguard Worker  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25*cf84ac9aSAndroid Build Coastguard Worker  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26*cf84ac9aSAndroid Build Coastguard Worker  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27*cf84ac9aSAndroid Build Coastguard Worker  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
28*cf84ac9aSAndroid Build Coastguard Worker  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29*cf84ac9aSAndroid Build Coastguard Worker  */
30*cf84ac9aSAndroid Build Coastguard Worker 
31*cf84ac9aSAndroid Build Coastguard Worker #include "tests.h"
32*cf84ac9aSAndroid Build Coastguard Worker #include <stdio.h>
33*cf84ac9aSAndroid Build Coastguard Worker #include <unistd.h>
34*cf84ac9aSAndroid Build Coastguard Worker 
35*cf84ac9aSAndroid Build Coastguard Worker #define FILENAME "test.execve\nfilename"
36*cf84ac9aSAndroid Build Coastguard Worker #define Q_FILENAME "test.execve\\nfilename"
37*cf84ac9aSAndroid Build Coastguard Worker 
38*cf84ac9aSAndroid Build Coastguard Worker static const char * const argv[] = {
39*cf84ac9aSAndroid Build Coastguard Worker 	FILENAME, "first", "second", (const char *) -1L,
40*cf84ac9aSAndroid Build Coastguard Worker 	(const char *) -2L, (const char *) -3L
41*cf84ac9aSAndroid Build Coastguard Worker };
42*cf84ac9aSAndroid Build Coastguard Worker static const char * const q_argv[] = {
43*cf84ac9aSAndroid Build Coastguard Worker 	Q_FILENAME, "first", "second"
44*cf84ac9aSAndroid Build Coastguard Worker };
45*cf84ac9aSAndroid Build Coastguard Worker 
46*cf84ac9aSAndroid Build Coastguard Worker static const char * const envp[] = {
47*cf84ac9aSAndroid Build Coastguard Worker 	"foobar=1", "foo\nbar=2", (const char *) -1L,
48*cf84ac9aSAndroid Build Coastguard Worker 	(const char *) -2L, (const char *) -3L
49*cf84ac9aSAndroid Build Coastguard Worker };
50*cf84ac9aSAndroid Build Coastguard Worker static const char * const q_envp[] = {
51*cf84ac9aSAndroid Build Coastguard Worker 	"foobar=1", "foo\\nbar=2"
52*cf84ac9aSAndroid Build Coastguard Worker };
53*cf84ac9aSAndroid Build Coastguard Worker 
54*cf84ac9aSAndroid Build Coastguard Worker int
main(void)55*cf84ac9aSAndroid Build Coastguard Worker main(void)
56*cf84ac9aSAndroid Build Coastguard Worker {
57*cf84ac9aSAndroid Build Coastguard Worker 	char ** const tail_argv = tail_memdup(argv, sizeof(argv));
58*cf84ac9aSAndroid Build Coastguard Worker 	char ** const tail_envp = tail_memdup(envp, sizeof(envp));
59*cf84ac9aSAndroid Build Coastguard Worker 
60*cf84ac9aSAndroid Build Coastguard Worker 	execve(FILENAME, tail_argv, tail_envp);
61*cf84ac9aSAndroid Build Coastguard Worker 	printf("execve(\"%s\""
62*cf84ac9aSAndroid Build Coastguard Worker 	       ", [\"%s\", \"%s\", \"%s\", %p, %p, %p, ... /* %p */]"
63*cf84ac9aSAndroid Build Coastguard Worker #if VERBOSE
64*cf84ac9aSAndroid Build Coastguard Worker 	       ", [\"%s\", \"%s\", %p, %p, %p, ... /* %p */]"
65*cf84ac9aSAndroid Build Coastguard Worker #else
66*cf84ac9aSAndroid Build Coastguard Worker 	       ", %p /* 5 vars, unterminated */"
67*cf84ac9aSAndroid Build Coastguard Worker #endif
68*cf84ac9aSAndroid Build Coastguard Worker 	       ") = -1 ENOENT (%m)\n",
69*cf84ac9aSAndroid Build Coastguard Worker 	       Q_FILENAME, q_argv[0], q_argv[1], q_argv[2],
70*cf84ac9aSAndroid Build Coastguard Worker 	       argv[3], argv[4], argv[5], (char *) tail_argv + sizeof(argv)
71*cf84ac9aSAndroid Build Coastguard Worker #if VERBOSE
72*cf84ac9aSAndroid Build Coastguard Worker 	       , q_envp[0], q_envp[1], envp[2], envp[3], envp[4],
73*cf84ac9aSAndroid Build Coastguard Worker 	       (char *) tail_envp + sizeof(envp)
74*cf84ac9aSAndroid Build Coastguard Worker #else
75*cf84ac9aSAndroid Build Coastguard Worker 	       , tail_envp
76*cf84ac9aSAndroid Build Coastguard Worker #endif
77*cf84ac9aSAndroid Build Coastguard Worker 	       );
78*cf84ac9aSAndroid Build Coastguard Worker 
79*cf84ac9aSAndroid Build Coastguard Worker 	tail_argv[ARRAY_SIZE(q_argv)] = NULL;
80*cf84ac9aSAndroid Build Coastguard Worker 	tail_envp[ARRAY_SIZE(q_envp)] = NULL;
81*cf84ac9aSAndroid Build Coastguard Worker 	(void) q_envp;	/* workaround for clang bug #33068 */
82*cf84ac9aSAndroid Build Coastguard Worker 
83*cf84ac9aSAndroid Build Coastguard Worker 	execve(FILENAME, tail_argv, tail_envp);
84*cf84ac9aSAndroid Build Coastguard Worker 	printf("execve(\"%s\", [\"%s\", \"%s\", \"%s\"]"
85*cf84ac9aSAndroid Build Coastguard Worker #if VERBOSE
86*cf84ac9aSAndroid Build Coastguard Worker 	       ", [\"%s\", \"%s\"]"
87*cf84ac9aSAndroid Build Coastguard Worker #else
88*cf84ac9aSAndroid Build Coastguard Worker 	       ", %p /* 2 vars */"
89*cf84ac9aSAndroid Build Coastguard Worker #endif
90*cf84ac9aSAndroid Build Coastguard Worker 	       ") = -1 ENOENT (%m)\n",
91*cf84ac9aSAndroid Build Coastguard Worker 	       Q_FILENAME, q_argv[0], q_argv[1], q_argv[2]
92*cf84ac9aSAndroid Build Coastguard Worker #if VERBOSE
93*cf84ac9aSAndroid Build Coastguard Worker 	       , q_envp[0], q_envp[1]
94*cf84ac9aSAndroid Build Coastguard Worker #else
95*cf84ac9aSAndroid Build Coastguard Worker 	       , tail_envp
96*cf84ac9aSAndroid Build Coastguard Worker #endif
97*cf84ac9aSAndroid Build Coastguard Worker 	       );
98*cf84ac9aSAndroid Build Coastguard Worker 
99*cf84ac9aSAndroid Build Coastguard Worker 	execve(FILENAME, tail_argv + 2, tail_envp + 1);
100*cf84ac9aSAndroid Build Coastguard Worker 	printf("execve(\"%s\", [\"%s\"]"
101*cf84ac9aSAndroid Build Coastguard Worker #if VERBOSE
102*cf84ac9aSAndroid Build Coastguard Worker 	       ", [\"%s\"]"
103*cf84ac9aSAndroid Build Coastguard Worker #else
104*cf84ac9aSAndroid Build Coastguard Worker 	       ", %p /* 1 var */"
105*cf84ac9aSAndroid Build Coastguard Worker #endif
106*cf84ac9aSAndroid Build Coastguard Worker 	       ") = -1 ENOENT (%m)\n",
107*cf84ac9aSAndroid Build Coastguard Worker 	       Q_FILENAME, q_argv[2]
108*cf84ac9aSAndroid Build Coastguard Worker #if VERBOSE
109*cf84ac9aSAndroid Build Coastguard Worker 	       , q_envp[1]
110*cf84ac9aSAndroid Build Coastguard Worker #else
111*cf84ac9aSAndroid Build Coastguard Worker 	       , tail_envp + 1
112*cf84ac9aSAndroid Build Coastguard Worker #endif
113*cf84ac9aSAndroid Build Coastguard Worker 	       );
114*cf84ac9aSAndroid Build Coastguard Worker 
115*cf84ac9aSAndroid Build Coastguard Worker 	TAIL_ALLOC_OBJECT_CONST_PTR(char *, empty);
116*cf84ac9aSAndroid Build Coastguard Worker 	char **const efault = empty + 1;
117*cf84ac9aSAndroid Build Coastguard Worker 	*empty = NULL;
118*cf84ac9aSAndroid Build Coastguard Worker 
119*cf84ac9aSAndroid Build Coastguard Worker 	execve(FILENAME, empty, empty);
120*cf84ac9aSAndroid Build Coastguard Worker 	printf("execve(\"%s\", []"
121*cf84ac9aSAndroid Build Coastguard Worker #if VERBOSE
122*cf84ac9aSAndroid Build Coastguard Worker 	       ", []"
123*cf84ac9aSAndroid Build Coastguard Worker #else
124*cf84ac9aSAndroid Build Coastguard Worker 	       ", %p /* 0 vars */"
125*cf84ac9aSAndroid Build Coastguard Worker #endif
126*cf84ac9aSAndroid Build Coastguard Worker 	       ") = -1 ENOENT (%m)\n", Q_FILENAME
127*cf84ac9aSAndroid Build Coastguard Worker #if !VERBOSE
128*cf84ac9aSAndroid Build Coastguard Worker 	       , empty
129*cf84ac9aSAndroid Build Coastguard Worker #endif
130*cf84ac9aSAndroid Build Coastguard Worker 	       );
131*cf84ac9aSAndroid Build Coastguard Worker 
132*cf84ac9aSAndroid Build Coastguard Worker 	char *const str_a = tail_alloc(DEFAULT_STRLEN + 2);
133*cf84ac9aSAndroid Build Coastguard Worker 	fill_memory_ex(str_a, DEFAULT_STRLEN + 1, '0', 10);
134*cf84ac9aSAndroid Build Coastguard Worker 	str_a[DEFAULT_STRLEN + 1] = '\0';
135*cf84ac9aSAndroid Build Coastguard Worker 
136*cf84ac9aSAndroid Build Coastguard Worker 	char *const str_b = tail_alloc(DEFAULT_STRLEN + 2);
137*cf84ac9aSAndroid Build Coastguard Worker 	fill_memory_ex(str_b, DEFAULT_STRLEN + 1, '_', 32);
138*cf84ac9aSAndroid Build Coastguard Worker 	str_b[DEFAULT_STRLEN + 1] = '\0';
139*cf84ac9aSAndroid Build Coastguard Worker 
140*cf84ac9aSAndroid Build Coastguard Worker 	char **const a = tail_alloc(sizeof(*a) * (DEFAULT_STRLEN + 2));
141*cf84ac9aSAndroid Build Coastguard Worker 	char **const b = tail_alloc(sizeof(*b) * (DEFAULT_STRLEN + 2));
142*cf84ac9aSAndroid Build Coastguard Worker 	unsigned int i;
143*cf84ac9aSAndroid Build Coastguard Worker 	for (i = 0; i <= DEFAULT_STRLEN; ++i) {
144*cf84ac9aSAndroid Build Coastguard Worker 		a[i] = &str_a[i];
145*cf84ac9aSAndroid Build Coastguard Worker 		b[i] = &str_b[i];
146*cf84ac9aSAndroid Build Coastguard Worker 	}
147*cf84ac9aSAndroid Build Coastguard Worker 	a[i] = b[i] = NULL;
148*cf84ac9aSAndroid Build Coastguard Worker 
149*cf84ac9aSAndroid Build Coastguard Worker 	execve(FILENAME, a, b);
150*cf84ac9aSAndroid Build Coastguard Worker 	printf("execve(\"%s\", [\"%.*s\"...", Q_FILENAME, DEFAULT_STRLEN, a[0]);
151*cf84ac9aSAndroid Build Coastguard Worker 	for (i = 1; i < DEFAULT_STRLEN; ++i)
152*cf84ac9aSAndroid Build Coastguard Worker 		printf(", \"%s\"", a[i]);
153*cf84ac9aSAndroid Build Coastguard Worker #if VERBOSE
154*cf84ac9aSAndroid Build Coastguard Worker 	printf(", \"%s\"", a[i]);
155*cf84ac9aSAndroid Build Coastguard Worker #else
156*cf84ac9aSAndroid Build Coastguard Worker 	printf(", ...");
157*cf84ac9aSAndroid Build Coastguard Worker #endif
158*cf84ac9aSAndroid Build Coastguard Worker #if VERBOSE
159*cf84ac9aSAndroid Build Coastguard Worker 	printf("], [\"%.*s\"...", DEFAULT_STRLEN, b[0]);
160*cf84ac9aSAndroid Build Coastguard Worker 	for (i = 1; i <= DEFAULT_STRLEN; ++i)
161*cf84ac9aSAndroid Build Coastguard Worker 		printf(", \"%s\"", b[i]);
162*cf84ac9aSAndroid Build Coastguard Worker 	printf("]");
163*cf84ac9aSAndroid Build Coastguard Worker #else
164*cf84ac9aSAndroid Build Coastguard Worker 	printf("], %p /* %u vars */", b, DEFAULT_STRLEN + 1);
165*cf84ac9aSAndroid Build Coastguard Worker #endif
166*cf84ac9aSAndroid Build Coastguard Worker 	printf(") = -1 ENOENT (%m)\n");
167*cf84ac9aSAndroid Build Coastguard Worker 
168*cf84ac9aSAndroid Build Coastguard Worker 	execve(FILENAME, a + 1, b + 1);
169*cf84ac9aSAndroid Build Coastguard Worker 	printf("execve(\"%s\", [\"%s\"", Q_FILENAME, a[1]);
170*cf84ac9aSAndroid Build Coastguard Worker 	for (i = 2; i <= DEFAULT_STRLEN; ++i)
171*cf84ac9aSAndroid Build Coastguard Worker 		printf(", \"%s\"", a[i]);
172*cf84ac9aSAndroid Build Coastguard Worker #if VERBOSE
173*cf84ac9aSAndroid Build Coastguard Worker 	printf("], [\"%s\"", b[1]);
174*cf84ac9aSAndroid Build Coastguard Worker 	for (i = 2; i <= DEFAULT_STRLEN; ++i)
175*cf84ac9aSAndroid Build Coastguard Worker 		printf(", \"%s\"", b[i]);
176*cf84ac9aSAndroid Build Coastguard Worker 	printf("]");
177*cf84ac9aSAndroid Build Coastguard Worker #else
178*cf84ac9aSAndroid Build Coastguard Worker 	printf("], %p /* %d vars */", b + 1, DEFAULT_STRLEN);
179*cf84ac9aSAndroid Build Coastguard Worker #endif
180*cf84ac9aSAndroid Build Coastguard Worker 	printf(") = -1 ENOENT (%m)\n");
181*cf84ac9aSAndroid Build Coastguard Worker 
182*cf84ac9aSAndroid Build Coastguard Worker 	execve(FILENAME, (char **) tail_argv[ARRAY_SIZE(q_argv)], efault);
183*cf84ac9aSAndroid Build Coastguard Worker 	printf("execve(\"%s\", NULL, %p) = -1 ENOENT (%m)\n",
184*cf84ac9aSAndroid Build Coastguard Worker 	       Q_FILENAME, efault);
185*cf84ac9aSAndroid Build Coastguard Worker 
186*cf84ac9aSAndroid Build Coastguard Worker 	execve(FILENAME, efault, NULL);
187*cf84ac9aSAndroid Build Coastguard Worker 	printf("execve(\"%s\", %p, NULL) = -1 ENOENT (%m)\n",
188*cf84ac9aSAndroid Build Coastguard Worker 	       Q_FILENAME, efault);
189*cf84ac9aSAndroid Build Coastguard Worker 
190*cf84ac9aSAndroid Build Coastguard Worker 	return 0;
191*cf84ac9aSAndroid Build Coastguard Worker }
192