1 /* 2 * Copyright (c) 1991, 1992 Paul Kranenburg <pk (at) cs.few.eur.nl> 3 * Copyright (c) 1993 Branko Lankester <branko (at) hacktic.nl> 4 * Copyright (c) 1993, 1994, 1995, 1996 Rick Sladkey <jrs (at) world.std.com> 5 * Copyright (c) 2001-2018 The strace developers. 6 * All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 1. Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 3. The name of the author may not be used to endorse or promote products 17 * derived from this software without specific prior written permission. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 20 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 21 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 22 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 23 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 24 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 28 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 */ 30 31 #ifndef STRACE_DEFS_H 32 #define STRACE_DEFS_H 33 34 #ifdef HAVE_CONFIG_H 35 # include "config.h" 36 #endif 37 38 #include <features.h> 39 #include <stdbool.h> 40 #include <stdint.h> 41 #include <inttypes.h> 42 #include <sys/types.h> 43 #include <stddef.h> 44 #include <unistd.h> 45 #include <stdlib.h> 46 #include <stdio.h> 47 /* Open-coding isprint(ch) et al proved more efficient than calling 48 * generalized libc interface. We don't *want* to do non-ASCII anyway. 49 */ 50 /* #include <ctype.h> */ 51 #include <string.h> 52 #include <errno.h> 53 #include <time.h> 54 #include <sys/time.h> 55 56 #include "arch_defs.h" 57 #include "error_prints.h" 58 #include "gcc_compat.h" 59 #include "kernel_types.h" 60 #include "macros.h" 61 #include "mpers_type.h" 62 #include "string_to_uint.h" 63 #include "sysent.h" 64 #include "xmalloc.h" 65 66 #ifndef HAVE_STRERROR 67 const char *strerror(int); 68 #endif 69 #ifndef HAVE_STPCPY 70 /* Some libc have stpcpy, some don't. Sigh... 71 * Roll our private implementation... 72 */ 73 #undef stpcpy 74 #define stpcpy strace_stpcpy 75 extern char *stpcpy(char *dst, const char *src); 76 #endif 77 78 /* Glibc has an efficient macro for sigemptyset 79 * (it just does one or two assignments of 0 to internal vector of longs). 80 */ 81 #if defined(__GLIBC__) && defined(__sigemptyset) && !defined(sigemptyset) 82 # define sigemptyset __sigemptyset 83 #endif 84 85 /* Configuration section */ 86 #ifndef DEFAULT_STRLEN 87 /* default maximum # of bytes printed in `printstr', change with -s switch */ 88 # define DEFAULT_STRLEN 32 89 #endif 90 #ifndef DEFAULT_ACOLUMN 91 # define DEFAULT_ACOLUMN 40 /* default alignment column for results */ 92 #endif 93 /* 94 * Maximum number of args to a syscall. 95 * 96 * Make sure that all entries in all syscallent.h files have nargs <= MAX_ARGS! 97 * linux/<ARCH>/syscallent*.h: 98 * all have nargs <= 6 except mips o32 which has nargs <= 7. 99 */ 100 #ifndef MAX_ARGS 101 # ifdef LINUX_MIPSO32 102 # define MAX_ARGS 7 103 # else 104 # define MAX_ARGS 6 105 # endif 106 #endif 107 /* default sorting method for call profiling */ 108 #ifndef DEFAULT_SORTBY 109 # define DEFAULT_SORTBY "time" 110 #endif 111 /* 112 * Experimental code using PTRACE_SEIZE can be enabled here. 113 * This needs Linux kernel 3.4.x or later to work. 114 */ 115 #define USE_SEIZE 1 116 /* To force NOMMU build, set to 1 */ 117 #define NOMMU_SYSTEM 0 118 119 #ifndef ERESTARTSYS 120 # define ERESTARTSYS 512 121 #endif 122 #ifndef ERESTARTNOINTR 123 # define ERESTARTNOINTR 513 124 #endif 125 #ifndef ERESTARTNOHAND 126 # define ERESTARTNOHAND 514 127 #endif 128 #ifndef ERESTART_RESTARTBLOCK 129 # define ERESTART_RESTARTBLOCK 516 130 #endif 131 132 #define PERSONALITY0_WORDSIZE SIZEOF_LONG 133 #define PERSONALITY0_KLONGSIZE SIZEOF_KERNEL_LONG_T 134 #define PERSONALITY0_INCLUDE_PRINTERS_DECLS "native_printer_decls.h" 135 #define PERSONALITY0_INCLUDE_PRINTERS_DEFS "native_printer_defs.h" 136 137 #if SUPPORTED_PERSONALITIES > 1 138 # define PERSONALITY1_WORDSIZE 4 139 # define PERSONALITY1_KLONGSIZE PERSONALITY1_WORDSIZE 140 #endif 141 142 #if SUPPORTED_PERSONALITIES > 2 143 # define PERSONALITY2_WORDSIZE 4 144 # define PERSONALITY2_KLONGSIZE PERSONALITY0_KLONGSIZE 145 #endif 146 147 #if SUPPORTED_PERSONALITIES > 1 && defined HAVE_M32_MPERS 148 # define PERSONALITY1_INCLUDE_PRINTERS_DECLS "m32_printer_decls.h" 149 # define PERSONALITY1_INCLUDE_PRINTERS_DEFS "m32_printer_defs.h" 150 # define PERSONALITY1_INCLUDE_FUNCS "m32_funcs.h" 151 # define MPERS_m32_IOCTL_MACROS "ioctl_redefs1.h" 152 # define HAVE_PERSONALITY_1_MPERS 1 153 #else 154 # define PERSONALITY1_INCLUDE_PRINTERS_DECLS "native_printer_decls.h" 155 # define PERSONALITY1_INCLUDE_PRINTERS_DEFS "native_printer_defs.h" 156 # define PERSONALITY1_INCLUDE_FUNCS "empty.h" 157 # define HAVE_PERSONALITY_1_MPERS 0 158 #endif 159 160 #if SUPPORTED_PERSONALITIES > 2 && defined HAVE_MX32_MPERS 161 # define PERSONALITY2_INCLUDE_FUNCS "mx32_funcs.h" 162 # define PERSONALITY2_INCLUDE_PRINTERS_DECLS "mx32_printer_decls.h" 163 # define PERSONALITY2_INCLUDE_PRINTERS_DEFS "mx32_printer_defs.h" 164 # define MPERS_mx32_IOCTL_MACROS "ioctl_redefs2.h" 165 # define HAVE_PERSONALITY_2_MPERS 1 166 #else 167 # define PERSONALITY2_INCLUDE_PRINTERS_DECLS "native_printer_decls.h" 168 # define PERSONALITY2_INCLUDE_PRINTERS_DEFS "native_printer_defs.h" 169 # define PERSONALITY2_INCLUDE_FUNCS "empty.h" 170 # define HAVE_PERSONALITY_2_MPERS 0 171 #endif 172 173 typedef struct ioctlent { 174 const char *symbol; 175 unsigned int code; 176 } struct_ioctlent; 177 178 #define INJECT_F_SIGNAL 1 179 #define INJECT_F_RETVAL 2 180 181 struct inject_data { 182 uint16_t flags; 183 uint16_t signo; 184 kernel_long_t rval; 185 }; 186 187 struct inject_opts { 188 uint16_t first; 189 uint16_t step; 190 struct inject_data data; 191 }; 192 193 #define MAX_ERRNO_VALUE 4095 194 195 /* Trace Control Block */ 196 struct tcb { 197 int flags; /* See below for TCB_ values */ 198 int pid; /* If 0, this tcb is free */ 199 int qual_flg; /* qual_flags[scno] or DEFAULT_QUAL_FLAGS + RAW */ 200 unsigned long u_error; /* Error code */ 201 kernel_ulong_t scno; /* System call number */ 202 kernel_ulong_t u_arg[MAX_ARGS]; /* System call arguments */ 203 kernel_long_t u_rval; /* Return value */ 204 #if SUPPORTED_PERSONALITIES > 1 205 unsigned int currpers; /* Personality at the time of scno update */ 206 #endif 207 int sys_func_rval; /* Syscall entry parser's return value */ 208 int curcol; /* Output column for this process */ 209 FILE *outf; /* Output file for this process */ 210 const char *auxstr; /* Auxiliary info from syscall (see RVAL_STR) */ 211 void *_priv_data; /* Private data for syscall decoding functions */ 212 void (*_free_priv_data)(void *); /* Callback for freeing priv_data */ 213 const struct_sysent *s_ent; /* sysent[scno] or dummy struct for bad scno */ 214 const struct_sysent *s_prev_ent; /* for "resuming interrupted SYSCALL" msg */ 215 struct inject_opts *inject_vec[SUPPORTED_PERSONALITIES]; 216 struct timeval stime; /* System time usage as of last process wait */ 217 struct timeval dtime; /* Delta for system time usage */ 218 struct timeval etime; /* Syscall entry time */ 219 220 #ifdef USE_LIBUNWIND 221 struct UPT_info *libunwind_ui; 222 struct mmap_cache_t *mmap_cache; 223 unsigned int mmap_cache_size; 224 unsigned int mmap_cache_generation; 225 struct queue_t *queue; 226 #endif 227 }; 228 229 /* TCB flags */ 230 /* We have attached to this process, but did not see it stopping yet */ 231 #define TCB_STARTUP 0x01 232 #define TCB_IGNORE_ONE_SIGSTOP 0x02 /* Next SIGSTOP is to be ignored */ 233 /* 234 * Are we in system call entry or in syscall exit? 235 * 236 * This bit is set in syscall_entering_finish() and cleared in 237 * syscall_exiting_finish(). 238 * Other stops which are possible directly after syscall entry (death, ptrace 239 * event stop) are handled without calling syscall_{entering,exiting}_*(). 240 * 241 * Use entering(tcp) / exiting(tcp) to check this bit to make code more 242 * readable. 243 */ 244 #define TCB_INSYSCALL 0x04 245 #define TCB_ATTACHED 0x08 /* We attached to it already */ 246 #define TCB_REPRINT 0x10 /* We should reprint this syscall on exit */ 247 #define TCB_FILTERED 0x20 /* This system call has been filtered out */ 248 #define TCB_TAMPERED 0x40 /* A syscall has been tampered with */ 249 #define TCB_HIDE_LOG 0x80 /* We should hide everything (until execve) */ 250 #define TCB_SKIP_DETACH_ON_FIRST_EXEC 0x100 /* -b execve should skip detach on first execve */ 251 #define TCB_GRABBED 0x200 /* We grab the process and can catch it 252 * in the middle of a syscall */ 253 #define TCB_RECOVERING 0x400 /* We try to recover after detecting incorrect 254 * syscall entering/exiting state */ 255 256 /* qualifier flags */ 257 #define QUAL_TRACE 0x001 /* this system call should be traced */ 258 #define QUAL_ABBREV 0x002 /* abbreviate the structures of this syscall */ 259 #define QUAL_VERBOSE 0x004 /* decode the structures of this syscall */ 260 #define QUAL_RAW 0x008 /* print all args in hex for this syscall */ 261 #define QUAL_INJECT 0x010 /* tamper with this system call on purpose */ 262 263 #define DEFAULT_QUAL_FLAGS (QUAL_TRACE | QUAL_ABBREV | QUAL_VERBOSE) 264 265 #define entering(tcp) (!((tcp)->flags & TCB_INSYSCALL)) 266 #define exiting(tcp) ((tcp)->flags & TCB_INSYSCALL) 267 #define syserror(tcp) ((tcp)->u_error != 0) 268 #define traced(tcp) ((tcp)->qual_flg & QUAL_TRACE) 269 #define verbose(tcp) ((tcp)->qual_flg & QUAL_VERBOSE) 270 #define abbrev(tcp) ((tcp)->qual_flg & QUAL_ABBREV) 271 #define raw(tcp) ((tcp)->qual_flg & QUAL_RAW) 272 #define inject(tcp) ((tcp)->qual_flg & QUAL_INJECT) 273 #define filtered(tcp) ((tcp)->flags & TCB_FILTERED) 274 #define hide_log(tcp) ((tcp)->flags & TCB_HIDE_LOG) 275 #define syscall_tampered(tcp) ((tcp)->flags & TCB_TAMPERED) 276 #define recovering(tcp) ((tcp)->flags & TCB_RECOVERING) 277 278 #include "xlat.h" 279 280 extern const struct xlat addrfams[]; 281 extern const struct xlat arp_hardware_types[]; 282 extern const struct xlat at_flags[]; 283 extern const struct xlat clocknames[]; 284 extern const struct xlat dirent_types[]; 285 extern const struct xlat ethernet_protocols[]; 286 extern const struct xlat evdev_abs[]; 287 extern const struct xlat iffflags[]; 288 extern const struct xlat inet_protocols[]; 289 extern const struct xlat ip_type_of_services[]; 290 extern const struct xlat msg_flags[]; 291 extern const struct xlat netlink_protocols[]; 292 extern const struct xlat nl_route_types[]; 293 extern const struct xlat open_access_modes[]; 294 extern const struct xlat open_mode_flags[]; 295 extern const struct xlat resource_flags[]; 296 extern const struct xlat routing_scopes[]; 297 extern const struct xlat routing_table_ids[]; 298 extern const struct xlat routing_types[]; 299 extern const struct xlat seccomp_ret_action[]; 300 extern const struct xlat setns_types[]; 301 extern const struct xlat sg_io_info[]; 302 extern const struct xlat socketlayers[]; 303 extern const struct xlat socktypes[]; 304 extern const struct xlat tcp_state_flags[]; 305 extern const struct xlat tcp_states[]; 306 extern const struct xlat whence_codes[]; 307 308 /* Format of syscall return values */ 309 #define RVAL_DECIMAL 000 /* decimal format */ 310 #define RVAL_HEX 001 /* hex format */ 311 #define RVAL_OCTAL 002 /* octal format */ 312 #define RVAL_UDECIMAL 003 /* unsigned decimal format */ 313 #define RVAL_FD 010 /* file descriptor */ 314 #define RVAL_MASK 013 /* mask for these values */ 315 316 #define RVAL_STR 020 /* Print `auxstr' field after return val */ 317 #define RVAL_NONE 040 /* Print nothing */ 318 319 #define RVAL_DECODED 0100 /* syscall decoding finished */ 320 #define RVAL_IOCTL_DECODED 0200 /* ioctl sub-parser successfully decoded 321 the argument */ 322 #define RVAL_PRINT_ERR_VAL 0400 /* Print decoded error code along with 323 syscall return value. Needed for modify_ldt 324 that for some reason decides to return 325 an error with higher bits set to 0. */ 326 327 #define IOCTL_NUMBER_UNKNOWN 0 328 #define IOCTL_NUMBER_HANDLED 1 329 #define IOCTL_NUMBER_STOP_LOOKUP 010 330 331 #define indirect_ipccall(tcp) (tcp->s_ent->sys_flags & TRACE_INDIRECT_SUBCALL) 332 333 enum sock_proto { 334 SOCK_PROTO_UNKNOWN, 335 SOCK_PROTO_UNIX, 336 SOCK_PROTO_TCP, 337 SOCK_PROTO_UDP, 338 SOCK_PROTO_TCPv6, 339 SOCK_PROTO_UDPv6, 340 SOCK_PROTO_NETLINK 341 }; 342 extern enum sock_proto get_proto_by_name(const char *); 343 344 enum iov_decode { 345 IOV_DECODE_ADDR, 346 IOV_DECODE_STR, 347 IOV_DECODE_NETLINK 348 }; 349 350 typedef enum { 351 CFLAG_NONE = 0, 352 CFLAG_ONLY_STATS, 353 CFLAG_BOTH 354 } cflag_t; 355 extern cflag_t cflag; 356 extern bool Tflag; 357 extern bool iflag; 358 extern bool count_wallclock; 359 extern unsigned int qflag; 360 extern bool not_failing_only; 361 extern unsigned int show_fd_path; 362 /* are we filtering traces based on paths? */ 363 extern struct path_set { 364 const char **paths_selected; 365 size_t num_selected; 366 size_t size; 367 } global_path_set; 368 #define tracing_paths (global_path_set.num_selected != 0) 369 extern unsigned xflag; 370 extern unsigned followfork; 371 #ifdef USE_LIBUNWIND 372 /* if this is true do the stack trace for every system call */ 373 extern bool stack_trace_enabled; 374 #endif 375 extern unsigned ptrace_setoptions; 376 extern unsigned max_strlen; 377 extern unsigned os_release; 378 #undef KERNEL_VERSION 379 #define KERNEL_VERSION(a, b, c) (((a) << 16) + ((b) << 8) + (c)) 380 381 extern int read_int_from_file(struct tcb *, const char *, int *); 382 383 extern void set_sortby(const char *); 384 extern void set_overhead(int); 385 extern void print_pc(struct tcb *); 386 387 extern int syscall_entering_decode(struct tcb *); 388 extern int syscall_entering_trace(struct tcb *, unsigned int *); 389 extern void syscall_entering_finish(struct tcb *, int); 390 391 extern int syscall_exiting_decode(struct tcb *, struct timeval *); 392 extern int syscall_exiting_trace(struct tcb *, struct timeval, int); 393 extern void syscall_exiting_finish(struct tcb *); 394 395 extern void count_syscall(struct tcb *, const struct timeval *); 396 extern void call_summary(FILE *); 397 398 extern void clear_regs(struct tcb *tcp); 399 extern int get_scno(struct tcb *); 400 extern kernel_ulong_t get_rt_sigframe_addr(struct tcb *); 401 402 /** 403 * Convert a (shuffled) syscall number to the corresponding syscall name. 404 * 405 * @param scno Syscall number. 406 * @return String literal corresponding to the syscall number in case latter 407 * is valid; NULL otherwise. 408 */ 409 extern const char *syscall_name(kernel_ulong_t scno); 410 /** 411 * Convert a syscall name to the corresponding (shuffled) syscall number. 412 * 413 * @param s Syscall name. 414 * @param p Personality. 415 * @param start From which position in syscall entry table resume the search. 416 * @return Shuffled syscall number (ready to use against sysent_vec) 417 * if syscall name is found; -1 otherwise. 418 */ 419 extern kernel_long_t scno_by_name(const char *s, unsigned p, 420 kernel_long_t start); 421 /** 422 * Shuffle syscall numbers so that we don't have huge gaps in syscall table. 423 * The shuffling should be an involution: shuffle_scno(shuffle_scno(n)) == n. 424 * 425 * @param scno Raw or shuffled syscall number. 426 * @return Shuffled or raw syscall number, respectively. 427 */ 428 extern kernel_ulong_t shuffle_scno(kernel_ulong_t scno); 429 extern const char *err_name(unsigned long err); 430 431 extern bool is_erestart(struct tcb *); 432 extern void temporarily_clear_syserror(struct tcb *); 433 extern void restore_cleared_syserror(struct tcb *); 434 435 extern void *get_tcb_priv_data(const struct tcb *); 436 extern int set_tcb_priv_data(struct tcb *, void *priv_data, 437 void (*free_priv_data)(void *)); 438 extern void free_tcb_priv_data(struct tcb *); 439 440 static inline unsigned long get_tcb_priv_ulong(const struct tcb *tcp) 441 { 442 return (unsigned long) get_tcb_priv_data(tcp); 443 } 444 445 static inline int set_tcb_priv_ulong(struct tcb *tcp, unsigned long val) 446 { 447 return set_tcb_priv_data(tcp, (void *) val, 0); 448 } 449 450 extern int 451 umoven(struct tcb *, kernel_ulong_t addr, unsigned int len, void *laddr); 452 #define umove(pid, addr, objp) \ 453 umoven((pid), (addr), sizeof(*(objp)), (void *) (objp)) 454 455 extern int 456 umoven_or_printaddr(struct tcb *, kernel_ulong_t addr, 457 unsigned int len, void *laddr); 458 #define umove_or_printaddr(pid, addr, objp) \ 459 umoven_or_printaddr((pid), (addr), sizeof(*(objp)), (void *) (objp)) 460 461 extern int 462 umoven_or_printaddr_ignore_syserror(struct tcb *, kernel_ulong_t addr, 463 unsigned int len, void *laddr); 464 465 extern int 466 umovestr(struct tcb *, kernel_ulong_t addr, unsigned int len, char *laddr); 467 468 extern int upeek(struct tcb *tcp, unsigned long, kernel_ulong_t *); 469 extern int upoke(struct tcb *tcp, unsigned long, kernel_ulong_t); 470 471 extern bool 472 print_array(struct tcb *, 473 kernel_ulong_t start_addr, 474 size_t nmemb, 475 void *elem_buf, 476 size_t elem_size, 477 int (*umoven_func)(struct tcb *, 478 kernel_ulong_t, 479 unsigned int, 480 void *), 481 bool (*print_func)(struct tcb *, 482 void *elem_buf, 483 size_t elem_size, 484 void *opaque_data), 485 void *opaque_data); 486 487 #if HAVE_ARCH_GETRVAL2 488 extern long getrval2(struct tcb *); 489 #endif 490 491 extern const char *signame(const int); 492 extern void pathtrace_select_set(const char *, struct path_set *); 493 extern bool pathtrace_match_set(struct tcb *, struct path_set *); 494 #define pathtrace_select(tcp) \ 495 pathtrace_select_set(tcp, &global_path_set) 496 #define pathtrace_match(tcp) \ 497 pathtrace_match_set(tcp, &global_path_set) 498 extern int getfdpath(struct tcb *, int, char *, unsigned); 499 extern unsigned long getfdinode(struct tcb *, int); 500 extern enum sock_proto getfdproto(struct tcb *, int); 501 502 extern const char *xlookup(const struct xlat *, const uint64_t); 503 extern const char *xlat_search(const struct xlat *, const size_t, const uint64_t); 504 505 struct dyxlat; 506 struct dyxlat *dyxlat_alloc(size_t nmemb); 507 void dyxlat_free(struct dyxlat *); 508 const struct xlat *dyxlat_get(const struct dyxlat *); 509 void dyxlat_add_pair(struct dyxlat *, uint64_t val, const char *str, size_t len); 510 511 const struct xlat *genl_families_xlat(struct tcb *tcp); 512 513 extern unsigned long get_pagesize(void); 514 extern int next_set_bit(const void *bit_array, unsigned cur_bit, unsigned size_bits); 515 516 /* 517 * Returns STR if it does not start with PREFIX, 518 * or a pointer to the first char in STR after PREFIX. 519 * The length of PREFIX is specified by PREFIX_LEN. 520 */ 521 static inline const char * 522 str_strip_prefix_len(const char *str, const char *prefix, size_t prefix_len) 523 { 524 return strncmp(str, prefix, prefix_len) ? str : str + prefix_len; 525 } 526 527 #define STR_STRIP_PREFIX(str, prefix) \ 528 str_strip_prefix_len((str), (prefix), sizeof(prefix) - 1) 529 530 #define QUOTE_0_TERMINATED 0x01 531 #define QUOTE_OMIT_LEADING_TRAILING_QUOTES 0x02 532 #define QUOTE_OMIT_TRAILING_0 0x08 533 #define QUOTE_FORCE_HEX 0x10 534 #define QUOTE_EMIT_COMMENT 0x20 535 536 extern int string_quote(const char *, char *, unsigned int, unsigned int); 537 extern int print_quoted_string(const char *, unsigned int, unsigned int); 538 extern int print_quoted_cstring(const char *, unsigned int); 539 540 /* a refers to the lower numbered u_arg, 541 * b refers to the higher numbered u_arg 542 */ 543 #ifdef WORDS_BIGENDIAN 544 # define ULONG_LONG(a, b) \ 545 ((unsigned long long)(unsigned)(b) | ((unsigned long long)(a)<<32)) 546 #else 547 # define ULONG_LONG(a, b) \ 548 ((unsigned long long)(unsigned)(a) | ((unsigned long long)(b)<<32)) 549 #endif 550 extern int getllval(struct tcb *, unsigned long long *, int); 551 extern int printllval(struct tcb *, const char *, int) 552 ATTRIBUTE_FORMAT((printf, 2, 0)); 553 554 extern void printaddr(kernel_ulong_t addr); 555 extern int printxvals(const uint64_t, const char *, const struct xlat *, ...) 556 ATTRIBUTE_SENTINEL; 557 extern int printxval_searchn(const struct xlat *xlat, size_t xlat_size, 558 uint64_t val, const char *dflt); 559 #define printxval_search(xlat__, val__, dflt__) \ 560 printxval_searchn(xlat__, ARRAY_SIZE(xlat__), val__, dflt__) 561 extern int sprintxval(char *buf, size_t size, const struct xlat *, 562 unsigned int val, const char *dflt); 563 extern int printargs(struct tcb *); 564 extern int printargs_u(struct tcb *); 565 extern int printargs_d(struct tcb *); 566 567 extern void addflags(const struct xlat *, uint64_t); 568 extern int printflags_ex(uint64_t, const char *, const struct xlat *, ...) 569 ATTRIBUTE_SENTINEL; 570 extern const char *sprintflags(const char *, const struct xlat *, uint64_t); 571 extern const char *sprinttime(long long sec); 572 extern const char *sprinttime_nsec(long long sec, unsigned long long nsec); 573 extern const char *sprinttime_usec(long long sec, unsigned long long usec); 574 extern void print_symbolic_mode_t(unsigned int); 575 extern void print_numeric_umode_t(unsigned short); 576 extern void print_numeric_long_umask(unsigned long); 577 extern void print_dev_t(unsigned long long dev); 578 extern void print_abnormal_hi(kernel_ulong_t); 579 580 extern kernel_ulong_t * 581 fetch_indirect_syscall_args(struct tcb *, kernel_ulong_t addr, unsigned int n_args); 582 583 extern void 584 dumpiov_in_msghdr(struct tcb *, kernel_ulong_t addr, kernel_ulong_t data_size); 585 586 extern void 587 dumpiov_in_mmsghdr(struct tcb *, kernel_ulong_t addr); 588 589 extern void 590 dumpiov_upto(struct tcb *, int len, kernel_ulong_t addr, kernel_ulong_t data_size); 591 592 extern void 593 dumpstr(struct tcb *, kernel_ulong_t addr, int len); 594 595 extern int 596 printstr_ex(struct tcb *, kernel_ulong_t addr, kernel_ulong_t len, 597 unsigned int user_style); 598 599 extern int 600 printpathn(struct tcb *, kernel_ulong_t addr, unsigned int n); 601 602 extern int 603 printpath(struct tcb *, kernel_ulong_t addr); 604 605 #define TIMESPEC_TEXT_BUFSIZE \ 606 (sizeof(long long) * 3 * 2 + sizeof("{tv_sec=-, tv_nsec=}")) 607 extern void printfd(struct tcb *, int); 608 extern void print_sockaddr(const void *sa, int len); 609 extern bool 610 print_inet_addr(int af, const void *addr, unsigned int len, const char *var_name); 611 extern bool 612 decode_inet_addr(struct tcb *, kernel_ulong_t addr, 613 unsigned int len, int family, const char *var_name); 614 extern const char *get_sockaddr_by_inode(struct tcb *, int fd, unsigned long inode); 615 extern bool print_sockaddr_by_inode(struct tcb *, int fd, unsigned long inode); 616 extern void print_dirfd(struct tcb *, int); 617 618 extern int 619 decode_sockaddr(struct tcb *, kernel_ulong_t addr, int addrlen); 620 621 extern void printuid(const char *, const unsigned int); 622 623 extern void 624 print_sigset_addr_len(struct tcb *, kernel_ulong_t addr, kernel_ulong_t len); 625 extern void 626 print_sigset_addr(struct tcb *, kernel_ulong_t addr); 627 628 extern const char *sprintsigmask_n(const char *, const void *, unsigned int); 629 #define tprintsigmask_addr(prefix, mask) \ 630 tprints(sprintsigmask_n((prefix), (mask), sizeof(mask))) 631 extern void printsignal(int); 632 633 extern void 634 tprint_iov_upto(struct tcb *, kernel_ulong_t len, kernel_ulong_t addr, 635 enum iov_decode, kernel_ulong_t data_size); 636 637 extern void 638 decode_netlink(struct tcb *, int fd, kernel_ulong_t addr, kernel_ulong_t len); 639 640 extern void tprint_open_modes(unsigned int); 641 extern const char *sprint_open_modes(unsigned int); 642 643 extern void 644 decode_seccomp_fprog(struct tcb *, kernel_ulong_t addr); 645 646 extern void 647 print_seccomp_fprog(struct tcb *, kernel_ulong_t addr, unsigned short len); 648 649 extern void 650 decode_sock_fprog(struct tcb *, kernel_ulong_t addr); 651 652 extern void 653 print_sock_fprog(struct tcb *, kernel_ulong_t addr, unsigned short len); 654 655 struct strace_stat; 656 extern void print_struct_stat(struct tcb *, const struct strace_stat *const st); 657 658 struct strace_statfs; 659 struct strace_keyctl_kdf_params; 660 661 extern void 662 print_struct_statfs(struct tcb *, kernel_ulong_t addr); 663 664 extern void 665 print_struct_statfs64(struct tcb *, kernel_ulong_t addr, kernel_ulong_t size); 666 667 extern void print_ifindex(unsigned int); 668 669 extern void qualify(const char *); 670 extern unsigned int qual_flags(const unsigned int); 671 672 #define DECL_IOCTL(name) \ 673 extern int \ 674 name ## _ioctl(struct tcb *, unsigned int request, kernel_ulong_t arg) \ 675 /* End of DECL_IOCTL definition. */ 676 677 DECL_IOCTL(dm); 678 DECL_IOCTL(file); 679 DECL_IOCTL(fs_x); 680 DECL_IOCTL(kvm); 681 DECL_IOCTL(nsfs); 682 DECL_IOCTL(ptp); 683 DECL_IOCTL(scsi); 684 DECL_IOCTL(term); 685 DECL_IOCTL(ubi); 686 DECL_IOCTL(uffdio); 687 #undef DECL_IOCTL 688 689 extern int decode_sg_io_v4(struct tcb *, const kernel_ulong_t arg); 690 691 struct nlmsghdr; 692 693 typedef bool (*netlink_decoder_t)(struct tcb *, const struct nlmsghdr *, 694 kernel_ulong_t addr, unsigned int len); 695 696 #define DECL_NETLINK(name) \ 697 extern bool \ 698 decode_netlink_ ## name(struct tcb *, const struct nlmsghdr *, \ 699 kernel_ulong_t addr, unsigned int len) \ 700 /* End of DECL_NETLINK definition. */ 701 702 DECL_NETLINK(crypto); 703 DECL_NETLINK(route); 704 DECL_NETLINK(selinux); 705 DECL_NETLINK(sock_diag); 706 707 extern int tv_nz(const struct timeval *); 708 extern int tv_cmp(const struct timeval *, const struct timeval *); 709 extern double tv_float(const struct timeval *); 710 extern void tv_add(struct timeval *, const struct timeval *, const struct timeval *); 711 extern void tv_sub(struct timeval *, const struct timeval *, const struct timeval *); 712 extern void tv_mul(struct timeval *, const struct timeval *, int); 713 extern void tv_div(struct timeval *, const struct timeval *, int); 714 715 #ifdef USE_LIBUNWIND 716 extern void unwind_init(void); 717 extern void unwind_tcb_init(struct tcb *); 718 extern void unwind_tcb_fin(struct tcb *); 719 extern void unwind_cache_invalidate(struct tcb *); 720 extern void unwind_print_stacktrace(struct tcb *); 721 extern void unwind_capture_stacktrace(struct tcb *); 722 #endif 723 724 static inline int 725 printstrn(struct tcb *tcp, kernel_ulong_t addr, kernel_ulong_t len) 726 { 727 return printstr_ex(tcp, addr, len, 0); 728 } 729 730 static inline int 731 printstr(struct tcb *tcp, kernel_ulong_t addr) 732 { 733 return printstr_ex(tcp, addr, -1, QUOTE_0_TERMINATED); 734 } 735 736 static inline int 737 printflags64(const struct xlat *x, uint64_t flags, const char *dflt) 738 { 739 return printflags_ex(flags, dflt, x, NULL); 740 } 741 742 static inline int 743 printflags(const struct xlat *x, unsigned int flags, const char *dflt) 744 { 745 return printflags64(x, flags, dflt); 746 } 747 748 static inline int 749 printxval64(const struct xlat *x, const uint64_t val, const char *dflt) 750 { 751 return printxvals(val, dflt, x, NULL); 752 } 753 754 static inline int 755 printxval(const struct xlat *x, const unsigned int val, const char *dflt) 756 { 757 return printxvals(val, dflt, x, NULL); 758 } 759 760 static inline void 761 tprint_iov(struct tcb *tcp, kernel_ulong_t len, kernel_ulong_t addr, 762 enum iov_decode decode_iov) 763 { 764 tprint_iov_upto(tcp, len, addr, decode_iov, -1); 765 } 766 767 #ifdef ALPHA 768 typedef struct { 769 int tv_sec, tv_usec; 770 } timeval32_t; 771 772 extern void print_timeval32_t(const timeval32_t *); 773 extern void printrusage32(struct tcb *, kernel_ulong_t); 774 extern const char *sprint_timeval32(struct tcb *, kernel_ulong_t addr); 775 extern void print_timeval32(struct tcb *, kernel_ulong_t addr); 776 extern void print_timeval32_utimes(struct tcb *, kernel_ulong_t addr); 777 extern void print_itimerval32(struct tcb *, kernel_ulong_t addr); 778 #endif 779 780 #ifdef HAVE_STRUCT_USER_DESC 781 /** 782 * Filter what to print from the point of view of the get_thread_area syscall. 783 * Kernel copies only entry_number field at first and then tries to write the 784 * whole structure. 785 */ 786 enum user_desc_print_filter { 787 /* Print the "entering" part of struct user_desc - entry_number. */ 788 USER_DESC_ENTERING = 1, 789 /* Print the "exiting" part of the structure. */ 790 USER_DESC_EXITING = 2, 791 USER_DESC_BOTH = USER_DESC_ENTERING | USER_DESC_EXITING, 792 }; 793 794 extern void print_user_desc(struct tcb *, kernel_ulong_t addr, 795 enum user_desc_print_filter filter); 796 #endif 797 798 /* Strace log generation machinery. 799 * 800 * printing_tcp: tcb which has incomplete line being printed right now. 801 * NULL if last line has been completed ('\n'-terminated). 802 * printleader(tcp) examines it, finishes incomplete line if needed, 803 * the sets it to tcp. 804 * line_ended() clears printing_tcp and resets ->curcol = 0. 805 * tcp->curcol == 0 check is also used to detect completeness 806 * of last line, since in -ff mode just checking printing_tcp for NULL 807 * is not enough. 808 * 809 * If you change this code, test log generation in both -f and -ff modes 810 * using: 811 * strace -oLOG -f[f] test/threaded_execve 812 * strace -oLOG -f[f] test/sigkill_rain 813 * strace -oLOG -f[f] -p "`pidof web_browser`" 814 */ 815 extern struct tcb *printing_tcp; 816 extern void printleader(struct tcb *); 817 extern void line_ended(void); 818 extern void tabto(void); 819 extern void tprintf(const char *fmt, ...) ATTRIBUTE_FORMAT((printf, 1, 2)); 820 extern void tprints(const char *str); 821 extern void tprintf_comment(const char *fmt, ...) ATTRIBUTE_FORMAT((printf, 1, 2)); 822 extern void tprints_comment(const char *str); 823 824 #if SUPPORTED_PERSONALITIES > 1 825 extern void set_personality(unsigned int personality); 826 extern unsigned current_personality; 827 #else 828 # define set_personality(personality) ((void)0) 829 # define current_personality 0 830 #endif 831 832 #if SUPPORTED_PERSONALITIES == 1 833 # define current_wordsize PERSONALITY0_WORDSIZE 834 # define current_klongsize PERSONALITY0_KLONGSIZE 835 #else 836 # if SUPPORTED_PERSONALITIES == 2 && PERSONALITY0_WORDSIZE == PERSONALITY1_WORDSIZE 837 # define current_wordsize PERSONALITY0_WORDSIZE 838 # else 839 extern unsigned current_wordsize; 840 # endif 841 # if SUPPORTED_PERSONALITIES == 2 && PERSONALITY0_KLONGSIZE == PERSONALITY1_KLONGSIZE 842 # define current_klongsize PERSONALITY0_KLONGSIZE 843 # else 844 extern unsigned current_klongsize; 845 # endif 846 #endif 847 848 #if SIZEOF_KERNEL_LONG_T > 4 \ 849 && (SIZEOF_LONG < SIZEOF_KERNEL_LONG_T || !defined(current_wordsize)) 850 # define ANY_WORDSIZE_LESS_THAN_KERNEL_LONG 1 851 #else 852 # define ANY_WORDSIZE_LESS_THAN_KERNEL_LONG 0 853 #endif 854 855 #define DECL_PRINTNUM(name) \ 856 extern bool \ 857 printnum_ ## name(struct tcb *, kernel_ulong_t addr, const char *fmt) \ 858 ATTRIBUTE_FORMAT((printf, 3, 0)) \ 859 /* End of DECL_PRINTNUM definition. */ 860 861 DECL_PRINTNUM(short); 862 DECL_PRINTNUM(int); 863 DECL_PRINTNUM(int64); 864 #undef DECL_PRINTNUM 865 866 #define DECL_PRINTNUM_ADDR(name) \ 867 extern bool \ 868 printnum_addr_ ## name(struct tcb *, kernel_ulong_t addr) \ 869 /* End of DECL_PRINTNUM_ADDR definition. */ 870 871 DECL_PRINTNUM_ADDR(int); 872 DECL_PRINTNUM_ADDR(int64); 873 #undef DECL_PRINTNUM_ADDR 874 875 #ifndef current_wordsize 876 extern bool 877 printnum_long_int(struct tcb *, kernel_ulong_t addr, 878 const char *fmt_long, const char *fmt_int) 879 ATTRIBUTE_FORMAT((printf, 3, 0)) 880 ATTRIBUTE_FORMAT((printf, 4, 0)); 881 extern bool printnum_addr_long_int(struct tcb *, kernel_ulong_t addr); 882 # define printnum_slong(tcp, addr) \ 883 printnum_long_int((tcp), (addr), "%" PRId64, "%d") 884 # define printnum_ulong(tcp, addr) \ 885 printnum_long_int((tcp), (addr), "%" PRIu64, "%u") 886 # define printnum_ptr(tcp, addr) \ 887 printnum_addr_long_int((tcp), (addr)) 888 #elif current_wordsize > 4 889 # define printnum_slong(tcp, addr) \ 890 printnum_int64((tcp), (addr), "%" PRId64) 891 # define printnum_ulong(tcp, addr) \ 892 printnum_int64((tcp), (addr), "%" PRIu64) 893 # define printnum_ptr(tcp, addr) \ 894 printnum_addr_int64((tcp), (addr)) 895 #else /* current_wordsize == 4 */ 896 # define printnum_slong(tcp, addr) \ 897 printnum_int((tcp), (addr), "%d") 898 # define printnum_ulong(tcp, addr) \ 899 printnum_int((tcp), (addr), "%u") 900 # define printnum_ptr(tcp, addr) \ 901 printnum_addr_int((tcp), (addr)) 902 #endif 903 904 #ifndef current_klongsize 905 extern bool printnum_addr_klong_int(struct tcb *, kernel_ulong_t addr); 906 # define printnum_kptr(tcp, addr) \ 907 printnum_addr_klong_int((tcp), (addr)) 908 #elif current_klongsize > 4 909 # define printnum_kptr(tcp, addr) \ 910 printnum_addr_int64((tcp), (addr)) 911 #else /* current_klongsize == 4 */ 912 # define printnum_kptr(tcp, addr) \ 913 printnum_addr_int((tcp), (addr)) 914 #endif 915 916 #define DECL_PRINTPAIR(name) \ 917 extern bool \ 918 printpair_ ## name(struct tcb *, kernel_ulong_t addr, const char *fmt) \ 919 ATTRIBUTE_FORMAT((printf, 3, 0)) \ 920 /* End of DECL_PRINTPAIR definition. */ 921 922 DECL_PRINTPAIR(int); 923 DECL_PRINTPAIR(int64); 924 #undef DECL_PRINTPAIR 925 926 static inline kernel_long_t 927 truncate_klong_to_current_wordsize(const kernel_long_t v) 928 { 929 #if ANY_WORDSIZE_LESS_THAN_KERNEL_LONG 930 if (current_wordsize < sizeof(v)) { 931 return (int) v; 932 } else 933 #endif 934 { 935 return v; 936 } 937 } 938 939 static inline kernel_ulong_t 940 truncate_kulong_to_current_wordsize(const kernel_ulong_t v) 941 { 942 #if ANY_WORDSIZE_LESS_THAN_KERNEL_LONG 943 if (current_wordsize < sizeof(v)) { 944 return (unsigned int) v; 945 } else 946 #endif 947 { 948 return v; 949 } 950 } 951 952 /* 953 * Cast a pointer or a pointer-sized integer to kernel_ulong_t. 954 */ 955 #define ptr_to_kulong(v) ((kernel_ulong_t) (unsigned long) (v)) 956 957 /* 958 * Zero-extend a signed integer type to unsigned long long. 959 */ 960 #define zero_extend_signed_to_ull(v) \ 961 (sizeof(v) == sizeof(char) ? (unsigned long long) (unsigned char) (v) : \ 962 sizeof(v) == sizeof(short) ? (unsigned long long) (unsigned short) (v) : \ 963 sizeof(v) == sizeof(int) ? (unsigned long long) (unsigned int) (v) : \ 964 sizeof(v) == sizeof(long) ? (unsigned long long) (unsigned long) (v) : \ 965 (unsigned long long) (v)) 966 967 /* 968 * Sign-extend an unsigned integer type to long long. 969 */ 970 #define sign_extend_unsigned_to_ll(v) \ 971 (sizeof(v) == sizeof(char) ? (long long) (char) (v) : \ 972 sizeof(v) == sizeof(short) ? (long long) (short) (v) : \ 973 sizeof(v) == sizeof(int) ? (long long) (int) (v) : \ 974 sizeof(v) == sizeof(long) ? (long long) (long) (v) : \ 975 (long long) (v)) 976 977 extern const struct_sysent sysent0[]; 978 extern const char *const errnoent0[]; 979 extern const char *const signalent0[]; 980 extern const struct_ioctlent ioctlent0[]; 981 982 extern const char *const personality_names[]; 983 984 #if SUPPORTED_PERSONALITIES > 1 985 extern const struct_sysent *sysent; 986 extern const char *const *errnoent; 987 extern const char *const *signalent; 988 extern const struct_ioctlent *ioctlent; 989 #else 990 # define sysent sysent0 991 # define errnoent errnoent0 992 # define signalent signalent0 993 # define ioctlent ioctlent0 994 #endif 995 996 extern unsigned nsyscalls; 997 extern unsigned nerrnos; 998 extern unsigned nsignals; 999 extern unsigned nioctlents; 1000 1001 extern const unsigned int nsyscall_vec[SUPPORTED_PERSONALITIES]; 1002 extern const struct_sysent *const sysent_vec[SUPPORTED_PERSONALITIES]; 1003 extern struct inject_opts *inject_vec[SUPPORTED_PERSONALITIES]; 1004 1005 #ifdef IN_MPERS_BOOTSTRAP 1006 /* Transform multi-line MPERS_PRINTER_DECL statements to one-liners. */ 1007 # define MPERS_PRINTER_DECL(type, name, ...) MPERS_PRINTER_DECL(type, name, __VA_ARGS__) 1008 #else /* !IN_MPERS_BOOTSTRAP */ 1009 # if SUPPORTED_PERSONALITIES > 1 1010 # include "printers.h" 1011 # else 1012 # include "native_printer_decls.h" 1013 # endif 1014 # define MPERS_PRINTER_DECL(type, name, ...) type MPERS_FUNC_NAME(name)(__VA_ARGS__) 1015 #endif /* !IN_MPERS_BOOTSTRAP */ 1016 1017 /* Checks that sysent[scno] is not out of range. */ 1018 static inline bool 1019 scno_in_range(kernel_ulong_t scno) 1020 { 1021 return scno < nsyscalls; 1022 } 1023 1024 /* 1025 * Checks whether scno is not out of range, 1026 * its corresponding sysent[scno].sys_func is non-NULL, 1027 * and its sysent[scno].sys_flags has no TRACE_INDIRECT_SUBCALL flag set. 1028 */ 1029 static inline bool 1030 scno_is_valid(kernel_ulong_t scno) 1031 { 1032 return scno_in_range(scno) 1033 && sysent[scno].sys_func 1034 && !(sysent[scno].sys_flags & TRACE_INDIRECT_SUBCALL); 1035 } 1036 1037 #define MPERS_FUNC_NAME__(prefix, name) prefix ## name 1038 #define MPERS_FUNC_NAME_(prefix, name) MPERS_FUNC_NAME__(prefix, name) 1039 #define MPERS_FUNC_NAME(name) MPERS_FUNC_NAME_(MPERS_PREFIX, name) 1040 1041 #define SYS_FUNC_NAME(syscall_name) MPERS_FUNC_NAME(syscall_name) 1042 1043 #define SYS_FUNC(syscall_name) int SYS_FUNC_NAME(sys_ ## syscall_name)(struct tcb *tcp) 1044 1045 #endif /* !STRACE_DEFS_H */ 1046