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