]> granicus.if.org Git - strace/blob - syscall.c
Update TCP_* constants
[strace] / syscall.c
1 /*
2  * Copyright (c) 1991, 1992 Paul Kranenburg <pk@cs.few.eur.nl>
3  * Copyright (c) 1993 Branko Lankester <branko@hacktic.nl>
4  * Copyright (c) 1993, 1994, 1995, 1996 Rick Sladkey <jrs@world.std.com>
5  * Copyright (c) 1996-1999 Wichert Akkerman <wichert@cistron.nl>
6  * Copyright (c) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation
7  *                     Linux for s390 port by D.J. Barrow
8  *                    <barrow_dj@mail.yahoo.com,djbarrow@de.ibm.com>
9  * Copyright (c) 1999-2017 The strace developers.
10  * All rights reserved.
11  *
12  * Redistribution and use in source and binary forms, with or without
13  * modification, are permitted provided that the following conditions
14  * are met:
15  * 1. Redistributions of source code must retain the above copyright
16  *    notice, this list of conditions and the following disclaimer.
17  * 2. Redistributions in binary form must reproduce the above copyright
18  *    notice, this list of conditions and the following disclaimer in the
19  *    documentation and/or other materials provided with the distribution.
20  * 3. The name of the author may not be used to endorse or promote products
21  *    derived from this software without specific prior written permission.
22  *
23  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
24  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
25  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
26  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
27  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
28  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
29  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
30  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
32  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33  */
34
35 #include "defs.h"
36 #include "native_defs.h"
37 #include "nsig.h"
38 #include "number_set.h"
39 #include <sys/param.h>
40
41 /* for struct iovec */
42 #include <sys/uio.h>
43
44 /* for __X32_SYSCALL_BIT */
45 #include <asm/unistd.h>
46
47 #include "regs.h"
48 #include "ptrace.h"
49
50 #if defined(SPARC64)
51 # undef PTRACE_GETREGS
52 # define PTRACE_GETREGS PTRACE_GETREGS64
53 # undef PTRACE_SETREGS
54 # define PTRACE_SETREGS PTRACE_SETREGS64
55 #endif
56
57 #if defined SPARC64
58 # include <asm/psrcompat.h>
59 #elif defined SPARC
60 # include <asm/psr.h>
61 #endif
62
63 #ifdef IA64
64 # include <asm/rse.h>
65 #endif
66
67 #ifndef NT_PRSTATUS
68 # define NT_PRSTATUS 1
69 #endif
70
71 #include "syscall.h"
72
73 /* Define these shorthand notations to simplify the syscallent files. */
74 #include "sysent_shorthand_defs.h"
75
76 #define SEN(syscall_name) SEN_ ## syscall_name, SYS_FUNC_NAME(sys_ ## syscall_name)
77
78 const struct_sysent sysent0[] = {
79 #include "syscallent.h"
80 };
81
82 #if SUPPORTED_PERSONALITIES > 1
83 # include PERSONALITY1_INCLUDE_FUNCS
84 static const struct_sysent sysent1[] = {
85 # include "syscallent1.h"
86 };
87 #endif
88
89 #if SUPPORTED_PERSONALITIES > 2
90 # include PERSONALITY2_INCLUDE_FUNCS
91 static const struct_sysent sysent2[] = {
92 # include "syscallent2.h"
93 };
94 #endif
95
96 /* Now undef them since short defines cause wicked namespace pollution. */
97 #include "sysent_shorthand_undefs.h"
98
99 /*
100  * `ioctlent[012].h' files are automatically generated by the auxiliary
101  * program `ioctlsort', such that the list is sorted by the `code' field.
102  * This has the side-effect of resolving the _IO.. macros into
103  * plain integers, eliminating the need to include here everything
104  * in "/usr/include".
105  */
106
107 const char *const errnoent0[] = {
108 #include "errnoent.h"
109 };
110 const char *const signalent0[] = {
111 #include "signalent.h"
112 };
113 const struct_ioctlent ioctlent0[] = {
114 #include "ioctlent0.h"
115 };
116
117 #if SUPPORTED_PERSONALITIES > 1
118 static const char *const errnoent1[] = {
119 # include "errnoent1.h"
120 };
121 static const char *const signalent1[] = {
122 # include "signalent1.h"
123 };
124 static const struct_ioctlent ioctlent1[] = {
125 # include "ioctlent1.h"
126 };
127 # include PERSONALITY0_INCLUDE_PRINTERS_DECLS
128 static const struct_printers printers0 = {
129 # include PERSONALITY0_INCLUDE_PRINTERS_DEFS
130 };
131 # include PERSONALITY1_INCLUDE_PRINTERS_DECLS
132 static const struct_printers printers1 = {
133 # include PERSONALITY1_INCLUDE_PRINTERS_DEFS
134 };
135 #endif
136
137 #if SUPPORTED_PERSONALITIES > 2
138 static const char *const errnoent2[] = {
139 # include "errnoent2.h"
140 };
141 static const char *const signalent2[] = {
142 # include "signalent2.h"
143 };
144 static const struct_ioctlent ioctlent2[] = {
145 # include "ioctlent2.h"
146 };
147 # include PERSONALITY2_INCLUDE_PRINTERS_DECLS
148 static const struct_printers printers2 = {
149 # include PERSONALITY2_INCLUDE_PRINTERS_DEFS
150 };
151 #endif
152
153 enum {
154         nsyscalls0 = ARRAY_SIZE(sysent0)
155 #if SUPPORTED_PERSONALITIES > 1
156         , nsyscalls1 = ARRAY_SIZE(sysent1)
157 # if SUPPORTED_PERSONALITIES > 2
158         , nsyscalls2 = ARRAY_SIZE(sysent2)
159 # endif
160 #endif
161 };
162
163 enum {
164         nerrnos0 = ARRAY_SIZE(errnoent0)
165 #if SUPPORTED_PERSONALITIES > 1
166         , nerrnos1 = ARRAY_SIZE(errnoent1)
167 # if SUPPORTED_PERSONALITIES > 2
168         , nerrnos2 = ARRAY_SIZE(errnoent2)
169 # endif
170 #endif
171 };
172
173 enum {
174         nsignals0 = ARRAY_SIZE(signalent0)
175 #if SUPPORTED_PERSONALITIES > 1
176         , nsignals1 = ARRAY_SIZE(signalent1)
177 # if SUPPORTED_PERSONALITIES > 2
178         , nsignals2 = ARRAY_SIZE(signalent2)
179 # endif
180 #endif
181 };
182
183 enum {
184         nioctlents0 = ARRAY_SIZE(ioctlent0)
185 #if SUPPORTED_PERSONALITIES > 1
186         , nioctlents1 = ARRAY_SIZE(ioctlent1)
187 # if SUPPORTED_PERSONALITIES > 2
188         , nioctlents2 = ARRAY_SIZE(ioctlent2)
189 # endif
190 #endif
191 };
192
193 #if SUPPORTED_PERSONALITIES > 1
194 const struct_sysent *sysent = sysent0;
195 const char *const *errnoent = errnoent0;
196 const char *const *signalent = signalent0;
197 const struct_ioctlent *ioctlent = ioctlent0;
198 const struct_printers *printers = &printers0;
199 #endif
200
201 unsigned nsyscalls = nsyscalls0;
202 unsigned nerrnos = nerrnos0;
203 unsigned nsignals = nsignals0;
204 unsigned nioctlents = nioctlents0;
205
206 const unsigned int nsyscall_vec[SUPPORTED_PERSONALITIES] = {
207         nsyscalls0,
208 #if SUPPORTED_PERSONALITIES > 1
209         nsyscalls1,
210 #endif
211 #if SUPPORTED_PERSONALITIES > 2
212         nsyscalls2,
213 #endif
214 };
215 const struct_sysent *const sysent_vec[SUPPORTED_PERSONALITIES] = {
216         sysent0,
217 #if SUPPORTED_PERSONALITIES > 1
218         sysent1,
219 #endif
220 #if SUPPORTED_PERSONALITIES > 2
221         sysent2,
222 #endif
223 };
224
225 #if SUPPORTED_PERSONALITIES > 1
226 unsigned current_personality;
227
228 # ifndef current_wordsize
229 unsigned current_wordsize;
230 static const int personality_wordsize[SUPPORTED_PERSONALITIES] = {
231         PERSONALITY0_WORDSIZE,
232         PERSONALITY1_WORDSIZE,
233 # if SUPPORTED_PERSONALITIES > 2
234         PERSONALITY2_WORDSIZE,
235 # endif
236 };
237 # endif
238
239 # ifndef current_klongsize
240 unsigned current_klongsize;
241 static const int personality_klongsize[SUPPORTED_PERSONALITIES] = {
242         PERSONALITY0_KLONGSIZE,
243         PERSONALITY1_KLONGSIZE,
244 #  if SUPPORTED_PERSONALITIES > 2
245         PERSONALITY2_KLONGSIZE,
246 #  endif
247 };
248 # endif
249
250 void
251 set_personality(int personality)
252 {
253         nsyscalls = nsyscall_vec[personality];
254         sysent = sysent_vec[personality];
255
256         switch (personality) {
257         case 0:
258                 errnoent = errnoent0;
259                 nerrnos = nerrnos0;
260                 ioctlent = ioctlent0;
261                 nioctlents = nioctlents0;
262                 signalent = signalent0;
263                 nsignals = nsignals0;
264                 printers = &printers0;
265                 break;
266
267         case 1:
268                 errnoent = errnoent1;
269                 nerrnos = nerrnos1;
270                 ioctlent = ioctlent1;
271                 nioctlents = nioctlents1;
272                 signalent = signalent1;
273                 nsignals = nsignals1;
274                 printers = &printers1;
275                 break;
276
277 # if SUPPORTED_PERSONALITIES > 2
278         case 2:
279                 errnoent = errnoent2;
280                 nerrnos = nerrnos2;
281                 ioctlent = ioctlent2;
282                 nioctlents = nioctlents2;
283                 signalent = signalent2;
284                 nsignals = nsignals2;
285                 printers = &printers2;
286                 break;
287 # endif
288         }
289
290         current_personality = personality;
291 # ifndef current_wordsize
292         current_wordsize = personality_wordsize[personality];
293 # endif
294 # ifndef current_klongsize
295         current_klongsize = personality_klongsize[personality];
296 # endif
297 }
298
299 static void
300 update_personality(struct tcb *tcp, unsigned int personality)
301 {
302         if (personality == current_personality)
303                 return;
304         set_personality(personality);
305
306         if (personality == tcp->currpers)
307                 return;
308         tcp->currpers = personality;
309
310 # undef PERSONALITY_NAMES
311 # if defined X86_64
312 #  define PERSONALITY_NAMES {"64 bit", "32 bit", "x32"}
313 # elif defined X32
314 #  define PERSONALITY_NAMES {"x32", "32 bit"}
315 # elif SUPPORTED_PERSONALITIES == 2
316 #  define PERSONALITY_NAMES {"64 bit", "32 bit"}
317 # endif
318 # ifdef PERSONALITY_NAMES
319         if (!qflag) {
320                 static const char *const names[] = PERSONALITY_NAMES;
321                 error_msg("[ Process PID=%d runs in %s mode. ]",
322                           tcp->pid, names[personality]);
323         }
324 # endif
325 }
326 #endif
327
328 #ifdef SYS_socket_subcall
329 static void
330 decode_socket_subcall(struct tcb *tcp)
331 {
332         const int call = tcp->u_arg[0];
333
334         if (call < 1 || call >= SYS_socket_nsubcalls)
335                 return;
336
337         const kernel_ulong_t scno = SYS_socket_subcall + call;
338         const unsigned int nargs = sysent[scno].nargs;
339         uint64_t buf[nargs];
340
341         if (umoven(tcp, tcp->u_arg[1], nargs * current_wordsize, buf) < 0)
342                 return;
343
344         tcp->scno = scno;
345         tcp->qual_flg = qual_flags(scno);
346         tcp->s_ent = &sysent[scno];
347
348         unsigned int i;
349         for (i = 0; i < nargs; ++i)
350                 tcp->u_arg[i] = (sizeof(uint32_t) == current_wordsize)
351                                 ? ((uint32_t *) (void *) buf)[i] : buf[i];
352 }
353 #endif
354
355 #ifdef SYS_ipc_subcall
356 static void
357 decode_ipc_subcall(struct tcb *tcp)
358 {
359         unsigned int call = tcp->u_arg[0];
360         const unsigned int version = call >> 16;
361
362         if (version) {
363 # if defined S390 || defined S390X
364                 return;
365 # else
366 #  ifdef SPARC64
367                 if (current_wordsize == 8)
368                         return;
369 #  endif
370                 set_tcb_priv_ulong(tcp, version);
371                 call &= 0xffff;
372 # endif
373         }
374
375         switch (call) {
376                 case  1: case  2: case  3: case  4:
377                 case 11: case 12: case 13: case 14:
378                 case 21: case 22: case 23: case 24:
379                         break;
380                 default:
381                         return;
382         }
383
384         tcp->scno = SYS_ipc_subcall + call;
385         tcp->qual_flg = qual_flags(tcp->scno);
386         tcp->s_ent = &sysent[tcp->scno];
387
388         const unsigned int n = tcp->s_ent->nargs;
389         unsigned int i;
390         for (i = 0; i < n; i++)
391                 tcp->u_arg[i] = tcp->u_arg[i + 1];
392 }
393 #endif
394
395 #ifdef LINUX_MIPSO32
396 static void
397 decode_mips_subcall(struct tcb *tcp)
398 {
399         if (!scno_is_valid(tcp->u_arg[0]))
400                 return;
401         tcp->scno = tcp->u_arg[0];
402         tcp->qual_flg = qual_flags(tcp->scno);
403         tcp->s_ent = &sysent[tcp->scno];
404         memmove(&tcp->u_arg[0], &tcp->u_arg[1],
405                 sizeof(tcp->u_arg) - sizeof(tcp->u_arg[0]));
406         /*
407          * Fetching the last arg of 7-arg syscalls (fadvise64_64
408          * and sync_file_range) requires additional code,
409          * see linux/mips/get_syscall_args.c
410          */
411         if (tcp->s_ent->nargs == MAX_ARGS) {
412                 if (umoven(tcp,
413                            mips_REG_SP + MAX_ARGS * sizeof(tcp->u_arg[0]),
414                            sizeof(tcp->u_arg[0]),
415                            &tcp->u_arg[MAX_ARGS - 1]) < 0)
416                 tcp->u_arg[MAX_ARGS - 1] = 0;
417         }
418 }
419 #endif /* LINUX_MIPSO32 */
420
421 static void
422 dumpio(struct tcb *tcp)
423 {
424         if (syserror(tcp))
425                 return;
426
427         int fd = tcp->u_arg[0];
428         if (fd < 0)
429                 return;
430
431         if (is_number_in_set(fd, read_set)) {
432                 switch (tcp->s_ent->sen) {
433                 case SEN_read:
434                 case SEN_pread:
435                 case SEN_recv:
436                 case SEN_recvfrom:
437                 case SEN_mq_timedreceive:
438                         dumpstr(tcp, tcp->u_arg[1], tcp->u_rval);
439                         return;
440                 case SEN_readv:
441                 case SEN_preadv:
442                 case SEN_preadv2:
443                         dumpiov_upto(tcp, tcp->u_arg[2], tcp->u_arg[1],
444                                      tcp->u_rval);
445                         return;
446                 case SEN_recvmsg:
447                         dumpiov_in_msghdr(tcp, tcp->u_arg[1], tcp->u_rval);
448                         return;
449                 case SEN_recvmmsg:
450                         dumpiov_in_mmsghdr(tcp, tcp->u_arg[1]);
451                         return;
452                 }
453         }
454         if (is_number_in_set(fd, write_set)) {
455                 switch (tcp->s_ent->sen) {
456                 case SEN_write:
457                 case SEN_pwrite:
458                 case SEN_send:
459                 case SEN_sendto:
460                 case SEN_mq_timedsend:
461                         dumpstr(tcp, tcp->u_arg[1], tcp->u_arg[2]);
462                         break;
463                 case SEN_writev:
464                 case SEN_pwritev:
465                 case SEN_pwritev2:
466                 case SEN_vmsplice:
467                         dumpiov_upto(tcp, tcp->u_arg[2], tcp->u_arg[1], -1);
468                         break;
469                 case SEN_sendmsg:
470                         dumpiov_in_msghdr(tcp, tcp->u_arg[1], -1);
471                         break;
472                 case SEN_sendmmsg:
473                         dumpiov_in_mmsghdr(tcp, tcp->u_arg[1]);
474                         break;
475                 }
476         }
477 }
478
479 /*
480  * Shuffle syscall numbers so that we don't have huge gaps in syscall table.
481  * The shuffling should be an involution: shuffle_scno(shuffle_scno(n)) == n.
482  */
483 static kernel_ulong_t
484 shuffle_scno(kernel_ulong_t scno)
485 {
486 #if defined(ARM) || defined(AARCH64) /* So far only 32-bit ARM needs this */
487         if (scno < ARM_FIRST_SHUFFLED_SYSCALL)
488                 return scno;
489
490         /* __ARM_NR_cmpxchg? Swap with LAST_ORDINARY+1 */
491         if (scno == ARM_FIRST_SHUFFLED_SYSCALL)
492                 return 0x000ffff0;
493         if (scno == 0x000ffff0)
494                 return ARM_FIRST_SHUFFLED_SYSCALL;
495
496 # define ARM_SECOND_SHUFFLED_SYSCALL (ARM_FIRST_SHUFFLED_SYSCALL + 1)
497         /*
498          * Is it ARM specific syscall?
499          * Swap [0x000f0000, 0x000f0000 + LAST_SPECIAL] range
500          * with [SECOND_SHUFFLED, SECOND_SHUFFLED + LAST_SPECIAL] range.
501          */
502         if (scno >= 0x000f0000 &&
503             scno <= 0x000f0000 + ARM_LAST_SPECIAL_SYSCALL) {
504                 return scno - 0x000f0000 + ARM_SECOND_SHUFFLED_SYSCALL;
505         }
506         if (scno <= ARM_SECOND_SHUFFLED_SYSCALL + ARM_LAST_SPECIAL_SYSCALL) {
507                 return scno + 0x000f0000 - ARM_SECOND_SHUFFLED_SYSCALL;
508         }
509 #endif /* ARM || AARCH64 */
510
511         return scno;
512 }
513
514 const char *
515 err_name(unsigned long err)
516 {
517         if ((err < nerrnos) && errnoent[err])
518                 return errnoent[err];
519
520         return NULL;
521 }
522
523 static long get_regs_error;
524
525 void
526 clear_regs(void)
527 {
528         get_regs_error = -1;
529 }
530
531 static void get_regs(pid_t pid);
532 static int get_syscall_args(struct tcb *);
533 static int get_syscall_result(struct tcb *);
534 static int arch_get_scno(struct tcb *tcp);
535 static int arch_set_scno(struct tcb *, kernel_ulong_t);
536 static void get_error(struct tcb *, const bool);
537 static int arch_set_error(struct tcb *);
538 static int arch_set_success(struct tcb *);
539
540 struct inject_opts *inject_vec[SUPPORTED_PERSONALITIES];
541
542 static struct inject_opts *
543 tcb_inject_opts(struct tcb *tcp)
544 {
545         return (scno_in_range(tcp->scno) && tcp->inject_vec[current_personality])
546                ? &tcp->inject_vec[current_personality][tcp->scno] : NULL;
547 }
548
549
550 static long
551 tamper_with_syscall_entering(struct tcb *tcp, unsigned int *signo)
552 {
553         if (!tcp->inject_vec[current_personality]) {
554                 tcp->inject_vec[current_personality] =
555                         xcalloc(nsyscalls, sizeof(**inject_vec));
556                 memcpy(tcp->inject_vec[current_personality],
557                        inject_vec[current_personality],
558                        nsyscalls * sizeof(**inject_vec));
559         }
560
561         struct inject_opts *opts = tcb_inject_opts(tcp);
562
563         if (!opts || opts->first == 0)
564                 return 0;
565
566         --opts->first;
567
568         if (opts->first != 0)
569                 return 0;
570
571         opts->first = opts->step;
572
573         if (opts->data.flags & INJECT_F_SIGNAL)
574                 *signo = opts->data.signo;
575         if (opts->data.flags & INJECT_F_RETVAL && !arch_set_scno(tcp, -1))
576                 tcp->flags |= TCB_TAMPERED;
577
578         return 0;
579 }
580
581 static long
582 tamper_with_syscall_exiting(struct tcb *tcp)
583 {
584         struct inject_opts *opts = tcb_inject_opts(tcp);
585
586         if (!opts)
587                 return 0;
588
589         if (opts->data.rval >= 0) {
590                 kernel_long_t u_rval = tcp->u_rval;
591
592                 tcp->u_rval = opts->data.rval;
593                 if (arch_set_success(tcp)) {
594                         tcp->u_rval = u_rval;
595                 } else {
596                         tcp->u_error = 0;
597                 }
598         } else {
599                 unsigned long new_error = -opts->data.rval;
600
601                 if (new_error != tcp->u_error && new_error <= MAX_ERRNO_VALUE) {
602                         unsigned long u_error = tcp->u_error;
603
604                         tcp->u_error = new_error;
605                         if (arch_set_error(tcp)) {
606                                 tcp->u_error = u_error;
607                         }
608                 }
609         }
610
611         return 0;
612 }
613
614 /*
615  * Returns:
616  * 0: "ignore this ptrace stop", bail out silently.
617  * 1: ok, decoded; call
618  *    syscall_entering_finish(tcp, syscall_entering_trace(tcp, ...)).
619  * other: error; call syscall_entering_finish(tcp, res), where res is the value
620  *    returned.
621  */
622 int
623 syscall_entering_decode(struct tcb *tcp)
624 {
625         int res = get_scno(tcp);
626         if (res == 0)
627                 return res;
628         int scno_good = res;
629         if (res != 1 || (res = get_syscall_args(tcp)) != 1) {
630                 printleader(tcp);
631                 tprintf("%s(", scno_good == 1 ? tcp->s_ent->sys_name : "????");
632                 /*
633                  * " <unavailable>" will be added later by the code which
634                  * detects ptrace errors.
635                  */
636                 return res;
637         }
638
639 #ifdef LINUX_MIPSO32
640         if (SEN_syscall == tcp->s_ent->sen)
641                 decode_mips_subcall(tcp);
642 #endif
643
644 #if defined(SYS_socket_subcall) || defined(SYS_ipc_subcall)
645         switch (tcp->s_ent->sen) {
646 # ifdef SYS_socket_subcall
647                 case SEN_socketcall:
648                         decode_socket_subcall(tcp);
649                         break;
650 # endif
651 # ifdef SYS_ipc_subcall
652                 case SEN_ipc:
653                         decode_ipc_subcall(tcp);
654                         break;
655 # endif
656         }
657 #endif
658
659         return 1;
660 }
661
662 int
663 syscall_entering_trace(struct tcb *tcp, unsigned int *sig)
664 {
665         /* Restrain from fault injection while the trace executes strace code. */
666         if (hide_log(tcp)) {
667                 tcp->qual_flg &= ~QUAL_INJECT;
668         }
669
670         switch (tcp->s_ent->sen) {
671                 case SEN_execve:
672                 case SEN_execveat:
673 #if defined SPARC || defined SPARC64
674                 case SEN_execv:
675 #endif
676                         tcp->flags &= ~TCB_HIDE_LOG;
677                         break;
678         }
679
680         if (!traced(tcp) || (tracing_paths && !pathtrace_match(tcp))) {
681                 tcp->flags |= TCB_FILTERED;
682                 return 0;
683         }
684
685         tcp->flags &= ~TCB_FILTERED;
686
687         if (hide_log(tcp)) {
688                 return 0;
689         }
690
691         if (inject(tcp))
692                 tamper_with_syscall_entering(tcp, sig);
693
694         if (cflag == CFLAG_ONLY_STATS) {
695                 return 0;
696         }
697
698 #ifdef USE_LIBUNWIND
699         if (stack_trace_enabled) {
700                 if (tcp->s_ent->sys_flags & STACKTRACE_CAPTURE_ON_ENTER)
701                         unwind_capture_stacktrace(tcp);
702         }
703 #endif
704
705         printleader(tcp);
706         tprintf("%s(", tcp->s_ent->sys_name);
707         int res = raw(tcp) ? printargs(tcp) : tcp->s_ent->sys_func(tcp);
708         fflush(tcp->outf);
709         return res;
710 }
711
712 void
713 syscall_entering_finish(struct tcb *tcp, int res)
714 {
715         tcp->flags |= TCB_INSYSCALL;
716         tcp->sys_func_rval = res;
717         /* Measure the entrance time as late as possible to avoid errors. */
718         if ((Tflag || cflag) && !filtered(tcp))
719                 gettimeofday(&tcp->etime, NULL);
720 }
721
722 static bool
723 syscall_tampered(struct tcb *tcp)
724 {
725         return tcp->flags & TCB_TAMPERED;
726 }
727
728 /* Returns:
729  * 0: "bail out".
730  * 1: ok.
731  * -1: error in one of ptrace ops.
732  *
733  * If not 0, call syscall_exiting_trace(tcp, res), where res is the return
734  *    value. Anyway, call syscall_exiting_finish(tcp) then.
735  */
736 int
737 syscall_exiting_decode(struct tcb *tcp, struct timeval *ptv)
738 {
739         /* Measure the exit time as early as possible to avoid errors. */
740         if ((Tflag || cflag) && !(filtered(tcp) || hide_log(tcp)))
741                 gettimeofday(ptv, NULL);
742
743 #ifdef USE_LIBUNWIND
744         if (stack_trace_enabled) {
745                 if (tcp->s_ent->sys_flags & STACKTRACE_INVALIDATE_CACHE)
746                         unwind_cache_invalidate(tcp);
747         }
748 #endif
749
750         if (filtered(tcp) || hide_log(tcp))
751                 return 0;
752
753         get_regs(tcp->pid);
754 #if SUPPORTED_PERSONALITIES > 1
755         update_personality(tcp, tcp->currpers);
756 #endif
757         return get_regs_error ? -1 : get_syscall_result(tcp);
758 }
759
760 int
761 syscall_exiting_trace(struct tcb *tcp, struct timeval tv, int res)
762 {
763         if (syserror(tcp) && syscall_tampered(tcp))
764                 tamper_with_syscall_exiting(tcp);
765
766         if (cflag) {
767                 count_syscall(tcp, &tv);
768                 if (cflag == CFLAG_ONLY_STATS) {
769                         return 0;
770                 }
771         }
772
773         /* If not in -ff mode, and printing_tcp != tcp,
774          * then the log currently does not end with output
775          * of _our syscall entry_, but with something else.
776          * We need to say which syscall's return is this.
777          *
778          * Forced reprinting via TCB_REPRINT is used only by
779          * "strace -ff -oLOG test/threaded_execve" corner case.
780          * It's the only case when -ff mode needs reprinting.
781          */
782         if ((followfork < 2 && printing_tcp != tcp) || (tcp->flags & TCB_REPRINT)) {
783                 tcp->flags &= ~TCB_REPRINT;
784                 printleader(tcp);
785                 tprintf("<... %s resumed> ", tcp->s_ent->sys_name);
786         }
787         printing_tcp = tcp;
788
789         tcp->s_prev_ent = NULL;
790         if (res != 1) {
791                 /* There was error in one of prior ptrace ops */
792                 tprints(") ");
793                 tabto();
794                 tprints("= ? <unavailable>\n");
795                 line_ended();
796                 return res;
797         }
798         tcp->s_prev_ent = tcp->s_ent;
799
800         int sys_res = 0;
801         if (raw(tcp)) {
802                 /* sys_res = printargs(tcp); - but it's nop on sysexit */
803         } else {
804         /* FIXME: not_failing_only (IOW, option -z) is broken:
805          * failure of syscall is known only after syscall return.
806          * Thus we end up with something like this on, say, ENOENT:
807          *     open("does_not_exist", O_RDONLY <unfinished ...>
808          *     {next syscall decode}
809          * whereas the intended result is that open(...) line
810          * is not shown at all.
811          */
812                 if (not_failing_only && tcp->u_error)
813                         return 0;       /* ignore failed syscalls */
814                 if (tcp->sys_func_rval & RVAL_DECODED)
815                         sys_res = tcp->sys_func_rval;
816                 else
817                         sys_res = tcp->s_ent->sys_func(tcp);
818         }
819
820         tprints(") ");
821         tabto();
822         unsigned long u_error = tcp->u_error;
823
824         if (raw(tcp)) {
825                 if (u_error) {
826                         tprintf("= -1 (errno %lu)", u_error);
827                 } else {
828                         tprintf("= %#" PRI_klx, tcp->u_rval);
829                 }
830                 if (syscall_tampered(tcp))
831                         tprints(" (INJECTED)");
832         } else if (!(sys_res & RVAL_NONE) && u_error) {
833                 const char *u_error_str;
834
835                 switch (u_error) {
836                 /* Blocked signals do not interrupt any syscalls.
837                  * In this case syscalls don't return ERESTARTfoo codes.
838                  *
839                  * Deadly signals set to SIG_DFL interrupt syscalls
840                  * and kill the process regardless of which of the codes below
841                  * is returned by the interrupted syscall.
842                  * In some cases, kernel forces a kernel-generated deadly
843                  * signal to be unblocked and set to SIG_DFL (and thus cause
844                  * death) if it is blocked or SIG_IGNed: for example, SIGSEGV
845                  * or SIGILL. (The alternative is to leave process spinning
846                  * forever on the faulty instruction - not useful).
847                  *
848                  * SIG_IGNed signals and non-deadly signals set to SIG_DFL
849                  * (for example, SIGCHLD, SIGWINCH) interrupt syscalls,
850                  * but kernel will always restart them.
851                  */
852                 case ERESTARTSYS:
853                         /* Most common type of signal-interrupted syscall exit code.
854                          * The system call will be restarted with the same arguments
855                          * if SA_RESTART is set; otherwise, it will fail with EINTR.
856                          */
857                         tprints("= ? ERESTARTSYS (To be restarted if SA_RESTART is set)");
858                         break;
859                 case ERESTARTNOINTR:
860                         /* Rare. For example, fork() returns this if interrupted.
861                          * SA_RESTART is ignored (assumed set): the restart is unconditional.
862                          */
863                         tprints("= ? ERESTARTNOINTR (To be restarted)");
864                         break;
865                 case ERESTARTNOHAND:
866                         /* pause(), rt_sigsuspend() etc use this code.
867                          * SA_RESTART is ignored (assumed not set):
868                          * syscall won't restart (will return EINTR instead)
869                          * even after signal with SA_RESTART set. However,
870                          * after SIG_IGN or SIG_DFL signal it will restart
871                          * (thus the name "restart only if has no handler").
872                          */
873                         tprints("= ? ERESTARTNOHAND (To be restarted if no handler)");
874                         break;
875                 case ERESTART_RESTARTBLOCK:
876                         /* Syscalls like nanosleep(), poll() which can't be
877                          * restarted with their original arguments use this
878                          * code. Kernel will execute restart_syscall() instead,
879                          * which changes arguments before restarting syscall.
880                          * SA_RESTART is ignored (assumed not set) similarly
881                          * to ERESTARTNOHAND. (Kernel can't honor SA_RESTART
882                          * since restart data is saved in "restart block"
883                          * in task struct, and if signal handler uses a syscall
884                          * which in turn saves another such restart block,
885                          * old data is lost and restart becomes impossible)
886                          */
887                         tprints("= ? ERESTART_RESTARTBLOCK (Interrupted by signal)");
888                         break;
889                 default:
890                         u_error_str = err_name(u_error);
891                         if (u_error_str)
892                                 tprintf("= -1 %s (%s)",
893                                         u_error_str, strerror(u_error));
894                         else
895                                 tprintf("= -1 %lu (%s)",
896                                         u_error, strerror(u_error));
897                         break;
898                 }
899                 if (syscall_tampered(tcp))
900                         tprints(" (INJECTED)");
901                 if ((sys_res & RVAL_STR) && tcp->auxstr)
902                         tprintf(" (%s)", tcp->auxstr);
903         } else {
904                 if (sys_res & RVAL_NONE)
905                         tprints("= ?");
906                 else {
907                         switch (sys_res & RVAL_MASK) {
908                         case RVAL_HEX:
909 #if ANY_WORDSIZE_LESS_THAN_KERNEL_LONG
910                                 if (current_wordsize < sizeof(tcp->u_rval)) {
911                                         tprintf("= %#x",
912                                                 (unsigned int) tcp->u_rval);
913                                 } else
914 #endif
915                                 {
916                                         tprintf("= %#" PRI_klx, tcp->u_rval);
917                                 }
918                                 break;
919                         case RVAL_OCTAL:
920                                 tprints("= ");
921                                 print_numeric_long_umask(tcp->u_rval);
922                                 break;
923                         case RVAL_UDECIMAL:
924 #if ANY_WORDSIZE_LESS_THAN_KERNEL_LONG
925                                 if (current_wordsize < sizeof(tcp->u_rval)) {
926                                         tprintf("= %u",
927                                                 (unsigned int) tcp->u_rval);
928                                 } else
929 #endif
930                                 {
931                                         tprintf("= %" PRI_klu, tcp->u_rval);
932                                 }
933                                 break;
934                         case RVAL_DECIMAL:
935                                 tprintf("= %" PRI_kld, tcp->u_rval);
936                                 break;
937                         case RVAL_FD:
938                                 if (show_fd_path) {
939                                         tprints("= ");
940                                         printfd(tcp, tcp->u_rval);
941                                 } else
942                                         tprintf("= %" PRI_kld, tcp->u_rval);
943                                 break;
944                         default:
945                                 error_msg("invalid rval format");
946                                 break;
947                         }
948                 }
949                 if ((sys_res & RVAL_STR) && tcp->auxstr)
950                         tprintf(" (%s)", tcp->auxstr);
951                 if (syscall_tampered(tcp))
952                         tprints(" (INJECTED)");
953         }
954         if (Tflag) {
955                 tv_sub(&tv, &tv, &tcp->etime);
956                 tprintf(" <%ld.%06ld>",
957                         (long) tv.tv_sec, (long) tv.tv_usec);
958         }
959         tprints("\n");
960         dumpio(tcp);
961         line_ended();
962
963 #ifdef USE_LIBUNWIND
964         if (stack_trace_enabled)
965                 unwind_print_stacktrace(tcp);
966 #endif
967         return 0;
968 }
969
970 void
971 syscall_exiting_finish(struct tcb *tcp)
972 {
973         tcp->flags &= ~(TCB_INSYSCALL | TCB_TAMPERED);
974         tcp->sys_func_rval = 0;
975         free_tcb_priv_data(tcp);
976 }
977
978 bool
979 is_erestart(struct tcb *tcp)
980 {
981         switch (tcp->u_error) {
982                 case ERESTARTSYS:
983                 case ERESTARTNOINTR:
984                 case ERESTARTNOHAND:
985                 case ERESTART_RESTARTBLOCK:
986                         return true;
987                 default:
988                         return false;
989         }
990 }
991
992 static unsigned long saved_u_error;
993
994 void
995 temporarily_clear_syserror(struct tcb *tcp)
996 {
997         saved_u_error = tcp->u_error;
998         tcp->u_error = 0;
999 }
1000
1001 void
1002 restore_cleared_syserror(struct tcb *tcp)
1003 {
1004         tcp->u_error = saved_u_error;
1005 }
1006
1007 #include "arch_regs.c"
1008
1009 #ifdef HAVE_GETRVAL2
1010 # include "arch_getrval2.c"
1011 #endif
1012
1013 void
1014 print_pc(struct tcb *tcp)
1015 {
1016 #if defined ARCH_PC_REG
1017 # define ARCH_GET_PC 0
1018 #elif defined ARCH_PC_PEEK_ADDR
1019         kernel_ulong_t pc;
1020 # define ARCH_PC_REG pc
1021 # define ARCH_GET_PC upeek(tcp->pid, ARCH_PC_PEEK_ADDR, &pc)
1022 #else
1023 # error Neither ARCH_PC_REG nor ARCH_PC_PEEK_ADDR is defined
1024 #endif
1025         get_regs(tcp->pid);
1026         if (get_regs_error || ARCH_GET_PC)
1027                 tprints(current_wordsize == 4 ? "[????????] "
1028                                               : "[????????????????] ");
1029         else
1030                 tprintf(current_wordsize == 4
1031                         ? "[%08" PRI_klx "] " : "[%016" PRI_klx "] ",
1032                         (kernel_ulong_t) ARCH_PC_REG);
1033 }
1034
1035 #include "getregs_old.h"
1036
1037 #undef ptrace_getregset_or_getregs
1038 #undef ptrace_setregset_or_setregs
1039 #ifdef ARCH_REGS_FOR_GETREGSET
1040
1041 # define ptrace_getregset_or_getregs ptrace_getregset
1042 static long
1043 ptrace_getregset(pid_t pid)
1044 {
1045 # ifdef ARCH_IOVEC_FOR_GETREGSET
1046         /* variable iovec */
1047         ARCH_IOVEC_FOR_GETREGSET.iov_len = sizeof(ARCH_REGS_FOR_GETREGSET);
1048         return ptrace(PTRACE_GETREGSET, pid, NT_PRSTATUS,
1049                       &ARCH_IOVEC_FOR_GETREGSET);
1050 # else
1051         /* constant iovec */
1052         static struct iovec io = {
1053                 .iov_base = &ARCH_REGS_FOR_GETREGSET,
1054                 .iov_len = sizeof(ARCH_REGS_FOR_GETREGSET)
1055         };
1056         return ptrace(PTRACE_GETREGSET, pid, NT_PRSTATUS, &io);
1057
1058 # endif
1059 }
1060
1061 # ifndef HAVE_GETREGS_OLD
1062 #  define ptrace_setregset_or_setregs ptrace_setregset
1063 static int
1064 ptrace_setregset(pid_t pid)
1065 {
1066 #  ifdef ARCH_IOVEC_FOR_GETREGSET
1067         /* variable iovec */
1068         return ptrace(PTRACE_SETREGSET, pid, NT_PRSTATUS,
1069                       &ARCH_IOVEC_FOR_GETREGSET);
1070 #  else
1071         /* constant iovec */
1072         static struct iovec io = {
1073                 .iov_base = &ARCH_REGS_FOR_GETREGSET,
1074                 .iov_len = sizeof(ARCH_REGS_FOR_GETREGSET)
1075         };
1076         return ptrace(PTRACE_SETREGSET, pid, NT_PRSTATUS, &io);
1077 #  endif
1078 }
1079 # endif /* !HAVE_GETREGS_OLD */
1080
1081 #elif defined ARCH_REGS_FOR_GETREGS
1082
1083 # define ptrace_getregset_or_getregs ptrace_getregs
1084 static long
1085 ptrace_getregs(pid_t pid)
1086 {
1087 # if defined SPARC || defined SPARC64
1088         /* SPARC systems have the meaning of data and addr reversed */
1089         return ptrace(PTRACE_GETREGS, pid, (void *) &ARCH_REGS_FOR_GETREGS, 0);
1090 # else
1091         return ptrace(PTRACE_GETREGS, pid, NULL, &ARCH_REGS_FOR_GETREGS);
1092 # endif
1093 }
1094
1095 # ifndef HAVE_GETREGS_OLD
1096 #  define ptrace_setregset_or_setregs ptrace_setregs
1097 static int
1098 ptrace_setregs(pid_t pid)
1099 {
1100 #  if defined SPARC || defined SPARC64
1101         /* SPARC systems have the meaning of data and addr reversed */
1102         return ptrace(PTRACE_SETREGS, pid, (void *) &ARCH_REGS_FOR_GETREGS, 0);
1103 #  else
1104         return ptrace(PTRACE_SETREGS, pid, NULL, &ARCH_REGS_FOR_GETREGS);
1105 #  endif
1106 }
1107 # endif /* !HAVE_GETREGS_OLD */
1108
1109 #endif /* ARCH_REGS_FOR_GETREGSET || ARCH_REGS_FOR_GETREGS */
1110
1111 static void
1112 get_regs(pid_t pid)
1113 {
1114 #undef USE_GET_SYSCALL_RESULT_REGS
1115 #ifdef ptrace_getregset_or_getregs
1116
1117         if (get_regs_error != -1)
1118                 return;
1119
1120 # ifdef HAVE_GETREGS_OLD
1121         /*
1122          * Try PTRACE_GETREGSET/PTRACE_GETREGS first,
1123          * fallback to getregs_old.
1124          */
1125         static int use_getregs_old;
1126         if (use_getregs_old < 0) {
1127                 get_regs_error = ptrace_getregset_or_getregs(pid);
1128                 return;
1129         } else if (use_getregs_old == 0) {
1130                 get_regs_error = ptrace_getregset_or_getregs(pid);
1131                 if (get_regs_error >= 0) {
1132                         use_getregs_old = -1;
1133                         return;
1134                 }
1135                 if (errno == EPERM || errno == ESRCH)
1136                         return;
1137                 use_getregs_old = 1;
1138         }
1139         get_regs_error = getregs_old(pid);
1140 # else /* !HAVE_GETREGS_OLD */
1141         /* Assume that PTRACE_GETREGSET/PTRACE_GETREGS works. */
1142         get_regs_error = ptrace_getregset_or_getregs(pid);
1143 # endif /* !HAVE_GETREGS_OLD */
1144
1145 #else /* !ptrace_getregset_or_getregs */
1146
1147 # define USE_GET_SYSCALL_RESULT_REGS 1
1148 # warning get_regs is not implemented for this architecture yet
1149         get_regs_error = 0;
1150
1151 #endif /* !ptrace_getregset_or_getregs */
1152 }
1153
1154 #ifdef ptrace_setregset_or_setregs
1155 static int
1156 set_regs(pid_t pid)
1157 {
1158         return ptrace_setregset_or_setregs(pid);
1159 }
1160 #endif /* ptrace_setregset_or_setregs */
1161
1162 struct sysent_buf {
1163         struct tcb *tcp;
1164         struct_sysent ent;
1165         char buf[sizeof("syscall_%lu") + sizeof(kernel_ulong_t) * 3];
1166 };
1167
1168 static void
1169 free_sysent_buf(void *ptr)
1170 {
1171         struct sysent_buf *s = ptr;
1172         s->tcp->s_prev_ent = s->tcp->s_ent = NULL;
1173         free(ptr);
1174 }
1175
1176 /*
1177  * Returns:
1178  * 0: "ignore this ptrace stop", syscall_entering_decode() should return a "bail
1179  *    out silently" code.
1180  * 1: ok, continue in syscall_entering_decode().
1181  * other: error, syscall_entering_decode() should print error indicator
1182  *    ("????" etc) and return an appropriate code.
1183  */
1184 int
1185 get_scno(struct tcb *tcp)
1186 {
1187         get_regs(tcp->pid);
1188
1189         if (get_regs_error)
1190                 return -1;
1191
1192         int rc = arch_get_scno(tcp);
1193         if (rc != 1)
1194                 return rc;
1195
1196         if (scno_is_valid(tcp->scno)) {
1197                 tcp->s_ent = &sysent[tcp->scno];
1198                 tcp->qual_flg = qual_flags(tcp->scno);
1199         } else {
1200                 struct sysent_buf *s = xcalloc(1, sizeof(*s));
1201
1202                 s->tcp = tcp;
1203                 s->ent.nargs = MAX_ARGS;
1204                 s->ent.sen = SEN_printargs;
1205                 s->ent.sys_func = printargs;
1206                 s->ent.sys_name = s->buf;
1207                 sprintf(s->buf, "syscall_%" PRI_klu, shuffle_scno(tcp->scno));
1208
1209                 tcp->s_ent = &s->ent;
1210                 tcp->qual_flg = QUAL_RAW | DEFAULT_QUAL_FLAGS;
1211
1212                 set_tcb_priv_data(tcp, s, free_sysent_buf);
1213
1214                 if (debug_flag)
1215                         error_msg("pid %d invalid syscall %" PRI_kld,
1216                                   tcp->pid, tcp->scno);
1217         }
1218         return 1;
1219 }
1220
1221 #ifdef USE_GET_SYSCALL_RESULT_REGS
1222 static int get_syscall_result_regs(struct tcb *);
1223 #endif
1224
1225 /* Returns:
1226  * 1: ok, continue in syscall_exiting_trace().
1227  * -1: error, syscall_exiting_trace() should print error indicator
1228  *    ("????" etc) and bail out.
1229  */
1230 static int
1231 get_syscall_result(struct tcb *tcp)
1232 {
1233 #ifdef USE_GET_SYSCALL_RESULT_REGS
1234         if (get_syscall_result_regs(tcp))
1235                 return -1;
1236 #endif
1237         tcp->u_error = 0;
1238         get_error(tcp, !(tcp->s_ent->sys_flags & SYSCALL_NEVER_FAILS));
1239
1240         return 1;
1241 }
1242
1243 #include "get_scno.c"
1244 #include "set_scno.c"
1245 #include "get_syscall_args.c"
1246 #ifdef USE_GET_SYSCALL_RESULT_REGS
1247 # include "get_syscall_result.c"
1248 #endif
1249 #include "get_error.c"
1250 #include "set_error.c"
1251 #ifdef HAVE_GETREGS_OLD
1252 # include "getregs_old.c"
1253 #endif
1254
1255 const char *
1256 syscall_name(kernel_ulong_t scno)
1257 {
1258 #if defined X32_PERSONALITY_NUMBER && defined __X32_SYSCALL_BIT
1259         if (current_personality == X32_PERSONALITY_NUMBER)
1260                 scno &= ~__X32_SYSCALL_BIT;
1261 #endif
1262         return scno_is_valid(scno) ? sysent[scno].sys_name : NULL;
1263 }