1*cf84ac9aSAndroid Build Coastguard Worker /*
2*cf84ac9aSAndroid Build Coastguard Worker * Copyright (c) 1991, 1992 Paul Kranenburg <[email protected]>
3*cf84ac9aSAndroid Build Coastguard Worker * Copyright (c) 1993 Branko Lankester <[email protected]>
4*cf84ac9aSAndroid Build Coastguard Worker * Copyright (c) 1993-1996 Rick Sladkey <[email protected]>
5*cf84ac9aSAndroid Build Coastguard Worker * Copyright (c) 1996-1999 Wichert Akkerman <[email protected]>
6*cf84ac9aSAndroid Build Coastguard Worker * Copyright (c) 2007 Roland McGrath <[email protected]>
7*cf84ac9aSAndroid Build Coastguard Worker * Copyright (c) 2011-2012 Denys Vlasenko <[email protected]>
8*cf84ac9aSAndroid Build Coastguard Worker * Copyright (c) 2010-2015 Dmitry V. Levin <[email protected]>
9*cf84ac9aSAndroid Build Coastguard Worker * Copyright (c) 2014-2018 The strace developers.
10*cf84ac9aSAndroid Build Coastguard Worker * All rights reserved.
11*cf84ac9aSAndroid Build Coastguard Worker *
12*cf84ac9aSAndroid Build Coastguard Worker * Redistribution and use in source and binary forms, with or without
13*cf84ac9aSAndroid Build Coastguard Worker * modification, are permitted provided that the following conditions
14*cf84ac9aSAndroid Build Coastguard Worker * are met:
15*cf84ac9aSAndroid Build Coastguard Worker * 1. Redistributions of source code must retain the above copyright
16*cf84ac9aSAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer.
17*cf84ac9aSAndroid Build Coastguard Worker * 2. Redistributions in binary form must reproduce the above copyright
18*cf84ac9aSAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer in the
19*cf84ac9aSAndroid Build Coastguard Worker * documentation and/or other materials provided with the distribution.
20*cf84ac9aSAndroid Build Coastguard Worker * 3. The name of the author may not be used to endorse or promote products
21*cf84ac9aSAndroid Build Coastguard Worker * derived from this software without specific prior written permission.
22*cf84ac9aSAndroid Build Coastguard Worker *
23*cf84ac9aSAndroid Build Coastguard Worker * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
24*cf84ac9aSAndroid Build Coastguard Worker * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
25*cf84ac9aSAndroid Build Coastguard Worker * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
26*cf84ac9aSAndroid Build Coastguard Worker * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
27*cf84ac9aSAndroid Build Coastguard Worker * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
28*cf84ac9aSAndroid Build Coastguard Worker * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
29*cf84ac9aSAndroid Build Coastguard Worker * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
30*cf84ac9aSAndroid Build Coastguard Worker * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31*cf84ac9aSAndroid Build Coastguard Worker * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
32*cf84ac9aSAndroid Build Coastguard Worker * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33*cf84ac9aSAndroid Build Coastguard Worker */
34*cf84ac9aSAndroid Build Coastguard Worker
35*cf84ac9aSAndroid Build Coastguard Worker #include "defs.h"
36*cf84ac9aSAndroid Build Coastguard Worker
37*cf84ac9aSAndroid Build Coastguard Worker static void
printargv(struct tcb * const tcp,kernel_ulong_t addr)38*cf84ac9aSAndroid Build Coastguard Worker printargv(struct tcb *const tcp, kernel_ulong_t addr)
39*cf84ac9aSAndroid Build Coastguard Worker {
40*cf84ac9aSAndroid Build Coastguard Worker if (!addr || !verbose(tcp)) {
41*cf84ac9aSAndroid Build Coastguard Worker printaddr(addr);
42*cf84ac9aSAndroid Build Coastguard Worker return;
43*cf84ac9aSAndroid Build Coastguard Worker }
44*cf84ac9aSAndroid Build Coastguard Worker
45*cf84ac9aSAndroid Build Coastguard Worker const char *const start_sep = "[";
46*cf84ac9aSAndroid Build Coastguard Worker const char *sep = start_sep;
47*cf84ac9aSAndroid Build Coastguard Worker const unsigned int wordsize = current_wordsize;
48*cf84ac9aSAndroid Build Coastguard Worker unsigned int n;
49*cf84ac9aSAndroid Build Coastguard Worker
50*cf84ac9aSAndroid Build Coastguard Worker for (n = 0; addr; sep = ", ", addr += wordsize, ++n) {
51*cf84ac9aSAndroid Build Coastguard Worker union {
52*cf84ac9aSAndroid Build Coastguard Worker unsigned int p32;
53*cf84ac9aSAndroid Build Coastguard Worker kernel_ulong_t p64;
54*cf84ac9aSAndroid Build Coastguard Worker char data[sizeof(kernel_ulong_t)];
55*cf84ac9aSAndroid Build Coastguard Worker } cp;
56*cf84ac9aSAndroid Build Coastguard Worker
57*cf84ac9aSAndroid Build Coastguard Worker if (umoven(tcp, addr, wordsize, cp.data)) {
58*cf84ac9aSAndroid Build Coastguard Worker if (sep == start_sep)
59*cf84ac9aSAndroid Build Coastguard Worker printaddr(addr);
60*cf84ac9aSAndroid Build Coastguard Worker else {
61*cf84ac9aSAndroid Build Coastguard Worker tprints(", ...");
62*cf84ac9aSAndroid Build Coastguard Worker printaddr_comment(addr);
63*cf84ac9aSAndroid Build Coastguard Worker tprints("]");
64*cf84ac9aSAndroid Build Coastguard Worker }
65*cf84ac9aSAndroid Build Coastguard Worker return;
66*cf84ac9aSAndroid Build Coastguard Worker }
67*cf84ac9aSAndroid Build Coastguard Worker if (!(wordsize < sizeof(cp.p64) ? cp.p32 : cp.p64)) {
68*cf84ac9aSAndroid Build Coastguard Worker if (sep == start_sep)
69*cf84ac9aSAndroid Build Coastguard Worker tprints(start_sep);
70*cf84ac9aSAndroid Build Coastguard Worker break;
71*cf84ac9aSAndroid Build Coastguard Worker }
72*cf84ac9aSAndroid Build Coastguard Worker if (abbrev(tcp) && n >= max_strlen) {
73*cf84ac9aSAndroid Build Coastguard Worker tprintf("%s...", sep);
74*cf84ac9aSAndroid Build Coastguard Worker break;
75*cf84ac9aSAndroid Build Coastguard Worker }
76*cf84ac9aSAndroid Build Coastguard Worker tprints(sep);
77*cf84ac9aSAndroid Build Coastguard Worker printstr(tcp, wordsize < sizeof(cp.p64) ? cp.p32 : cp.p64);
78*cf84ac9aSAndroid Build Coastguard Worker }
79*cf84ac9aSAndroid Build Coastguard Worker tprints("]");
80*cf84ac9aSAndroid Build Coastguard Worker }
81*cf84ac9aSAndroid Build Coastguard Worker
82*cf84ac9aSAndroid Build Coastguard Worker static void
printargc(struct tcb * const tcp,kernel_ulong_t addr)83*cf84ac9aSAndroid Build Coastguard Worker printargc(struct tcb *const tcp, kernel_ulong_t addr)
84*cf84ac9aSAndroid Build Coastguard Worker {
85*cf84ac9aSAndroid Build Coastguard Worker printaddr(addr);
86*cf84ac9aSAndroid Build Coastguard Worker
87*cf84ac9aSAndroid Build Coastguard Worker if (!addr || !verbose(tcp))
88*cf84ac9aSAndroid Build Coastguard Worker return;
89*cf84ac9aSAndroid Build Coastguard Worker
90*cf84ac9aSAndroid Build Coastguard Worker bool unterminated = false;
91*cf84ac9aSAndroid Build Coastguard Worker unsigned int count = 0;
92*cf84ac9aSAndroid Build Coastguard Worker char *cp = NULL;
93*cf84ac9aSAndroid Build Coastguard Worker
94*cf84ac9aSAndroid Build Coastguard Worker for (; addr; addr += current_wordsize, ++count) {
95*cf84ac9aSAndroid Build Coastguard Worker if (umoven(tcp, addr, current_wordsize, &cp)) {
96*cf84ac9aSAndroid Build Coastguard Worker if (!count)
97*cf84ac9aSAndroid Build Coastguard Worker return;
98*cf84ac9aSAndroid Build Coastguard Worker
99*cf84ac9aSAndroid Build Coastguard Worker unterminated = true;
100*cf84ac9aSAndroid Build Coastguard Worker break;
101*cf84ac9aSAndroid Build Coastguard Worker }
102*cf84ac9aSAndroid Build Coastguard Worker if (!cp)
103*cf84ac9aSAndroid Build Coastguard Worker break;
104*cf84ac9aSAndroid Build Coastguard Worker }
105*cf84ac9aSAndroid Build Coastguard Worker tprintf_comment("%u var%s%s",
106*cf84ac9aSAndroid Build Coastguard Worker count, count == 1 ? "" : "s",
107*cf84ac9aSAndroid Build Coastguard Worker unterminated ? ", unterminated" : "");
108*cf84ac9aSAndroid Build Coastguard Worker }
109*cf84ac9aSAndroid Build Coastguard Worker
110*cf84ac9aSAndroid Build Coastguard Worker static void
decode_execve(struct tcb * tcp,const unsigned int index)111*cf84ac9aSAndroid Build Coastguard Worker decode_execve(struct tcb *tcp, const unsigned int index)
112*cf84ac9aSAndroid Build Coastguard Worker {
113*cf84ac9aSAndroid Build Coastguard Worker printpath(tcp, tcp->u_arg[index + 0]);
114*cf84ac9aSAndroid Build Coastguard Worker tprints(", ");
115*cf84ac9aSAndroid Build Coastguard Worker
116*cf84ac9aSAndroid Build Coastguard Worker printargv(tcp, tcp->u_arg[index + 1]);
117*cf84ac9aSAndroid Build Coastguard Worker tprints(", ");
118*cf84ac9aSAndroid Build Coastguard Worker
119*cf84ac9aSAndroid Build Coastguard Worker (abbrev(tcp) ? printargc : printargv) (tcp, tcp->u_arg[index + 2]);
120*cf84ac9aSAndroid Build Coastguard Worker }
121*cf84ac9aSAndroid Build Coastguard Worker
SYS_FUNC(execve)122*cf84ac9aSAndroid Build Coastguard Worker SYS_FUNC(execve)
123*cf84ac9aSAndroid Build Coastguard Worker {
124*cf84ac9aSAndroid Build Coastguard Worker decode_execve(tcp, 0);
125*cf84ac9aSAndroid Build Coastguard Worker
126*cf84ac9aSAndroid Build Coastguard Worker return RVAL_DECODED;
127*cf84ac9aSAndroid Build Coastguard Worker }
128*cf84ac9aSAndroid Build Coastguard Worker
SYS_FUNC(execveat)129*cf84ac9aSAndroid Build Coastguard Worker SYS_FUNC(execveat)
130*cf84ac9aSAndroid Build Coastguard Worker {
131*cf84ac9aSAndroid Build Coastguard Worker print_dirfd(tcp, tcp->u_arg[0]);
132*cf84ac9aSAndroid Build Coastguard Worker decode_execve(tcp, 1);
133*cf84ac9aSAndroid Build Coastguard Worker tprints(", ");
134*cf84ac9aSAndroid Build Coastguard Worker printflags(at_flags, tcp->u_arg[4], "AT_???");
135*cf84ac9aSAndroid Build Coastguard Worker
136*cf84ac9aSAndroid Build Coastguard Worker return RVAL_DECODED;
137*cf84ac9aSAndroid Build Coastguard Worker }
138*cf84ac9aSAndroid Build Coastguard Worker
139*cf84ac9aSAndroid Build Coastguard Worker #if defined(SPARC) || defined(SPARC64)
SYS_FUNC(execv)140*cf84ac9aSAndroid Build Coastguard Worker SYS_FUNC(execv)
141*cf84ac9aSAndroid Build Coastguard Worker {
142*cf84ac9aSAndroid Build Coastguard Worker printpath(tcp, tcp->u_arg[0]);
143*cf84ac9aSAndroid Build Coastguard Worker tprints(", ");
144*cf84ac9aSAndroid Build Coastguard Worker printargv(tcp, tcp->u_arg[1]);
145*cf84ac9aSAndroid Build Coastguard Worker
146*cf84ac9aSAndroid Build Coastguard Worker return RVAL_DECODED;
147*cf84ac9aSAndroid Build Coastguard Worker }
148*cf84ac9aSAndroid Build Coastguard Worker #endif /* SPARC || SPARC64 */
149