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) 1996-1999 Wichert Akkerman <wichert (at) cistron.nl> 6 * Copyright (c) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation 7 * Linux for s390 port by D.J. Barrow 8 * <barrow_dj (at) mail.yahoo.com,djbarrow (at) de.ibm.com> 9 * All rights reserved. 10 * 11 * Redistribution and use in source and binary forms, with or without 12 * modification, are permitted provided that the following conditions 13 * are met: 14 * 1. Redistributions of source code must retain the above copyright 15 * notice, this list of conditions and the following disclaimer. 16 * 2. Redistributions in binary form must reproduce the above copyright 17 * notice, this list of conditions and the following disclaimer in the 18 * documentation and/or other materials provided with the distribution. 19 * 3. The name of the author may not be used to endorse or promote products 20 * derived from this software without specific prior written permission. 21 * 22 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 23 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 24 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 25 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 26 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 27 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 28 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 29 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 30 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 31 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32 */ 33 34 #include "defs.h" 35 #include <sys/param.h> 36 #include <fcntl.h> 37 #include <stdarg.h> 38 #ifdef HAVE_SYS_XATTR_H 39 # include <sys/xattr.h> 40 #endif 41 #include <sys/uio.h> 42 43 #include "regs.h" 44 #include "ptrace.h" 45 46 int 47 string_to_uint(const char *str) 48 { 49 char *error; 50 long value; 51 52 if (!*str) 53 return -1; 54 errno = 0; 55 value = strtol(str, &error, 10); 56 if (errno || *error || value < 0 || (long)(int)value != value) 57 return -1; 58 return (int)value; 59 } 60 61 int 62 tv_nz(const struct timeval *a) 63 { 64 return a->tv_sec || a->tv_usec; 65 } 66 67 int 68 tv_cmp(const struct timeval *a, const struct timeval *b) 69 { 70 if (a->tv_sec < b->tv_sec 71 || (a->tv_sec == b->tv_sec && a->tv_usec < b->tv_usec)) 72 return -1; 73 if (a->tv_sec > b->tv_sec 74 || (a->tv_sec == b->tv_sec && a->tv_usec > b->tv_usec)) 75 return 1; 76 return 0; 77 } 78 79 double 80 tv_float(const struct timeval *tv) 81 { 82 return tv->tv_sec + tv->tv_usec/1000000.0; 83 } 84 85 void 86 tv_add(struct timeval *tv, const struct timeval *a, const struct timeval *b) 87 { 88 tv->tv_sec = a->tv_sec + b->tv_sec; 89 tv->tv_usec = a->tv_usec + b->tv_usec; 90 if (tv->tv_usec >= 1000000) { 91 tv->tv_sec++; 92 tv->tv_usec -= 1000000; 93 } 94 } 95 96 void 97 tv_sub(struct timeval *tv, const struct timeval *a, const struct timeval *b) 98 { 99 tv->tv_sec = a->tv_sec - b->tv_sec; 100 tv->tv_usec = a->tv_usec - b->tv_usec; 101 if (((long) tv->tv_usec) < 0) { 102 tv->tv_sec--; 103 tv->tv_usec += 1000000; 104 } 105 } 106 107 void 108 tv_div(struct timeval *tv, const struct timeval *a, int n) 109 { 110 tv->tv_usec = (a->tv_sec % n * 1000000 + a->tv_usec + n / 2) / n; 111 tv->tv_sec = a->tv_sec / n + tv->tv_usec / 1000000; 112 tv->tv_usec %= 1000000; 113 } 114 115 void 116 tv_mul(struct timeval *tv, const struct timeval *a, int n) 117 { 118 tv->tv_usec = a->tv_usec * n; 119 tv->tv_sec = a->tv_sec * n + tv->tv_usec / 1000000; 120 tv->tv_usec %= 1000000; 121 } 122 123 const char * 124 xlookup(const struct xlat *xlat, const unsigned int val) 125 { 126 for (; xlat->str != NULL; xlat++) 127 if (xlat->val == val) 128 return xlat->str; 129 return NULL; 130 } 131 132 static int 133 xlat_bsearch_compare(const void *a, const void *b) 134 { 135 const unsigned int val1 = (const unsigned long) a; 136 const unsigned int val2 = ((const struct xlat *) b)->val; 137 return (val1 > val2) ? 1 : (val1 < val2) ? -1 : 0; 138 } 139 140 const char * 141 xlat_search(const struct xlat *xlat, const size_t nmemb, const unsigned int val) 142 { 143 const struct xlat *e = 144 bsearch((const void*) (const unsigned long) val, 145 xlat, nmemb, sizeof(*xlat), xlat_bsearch_compare); 146 147 return e ? e->str : NULL; 148 } 149 150 #if !defined HAVE_STPCPY 151 char * 152 stpcpy(char *dst, const char *src) 153 { 154 while ((*dst = *src++) != '\0') 155 dst++; 156 return dst; 157 } 158 #endif 159 160 /* Find a next bit which is set. 161 * Starts testing at cur_bit. 162 * Returns -1 if no more bits are set. 163 * 164 * We never touch bytes we don't need to. 165 * On big-endian, array is assumed to consist of 166 * current_wordsize wide words: for example, is current_wordsize is 4, 167 * the bytes are walked in 3,2,1,0, 7,6,5,4, 11,10,9,8 ... sequence. 168 * On little-endian machines, word size is immaterial. 169 */ 170 int 171 next_set_bit(const void *bit_array, unsigned cur_bit, unsigned size_bits) 172 { 173 const unsigned endian = 1; 174 int little_endian = *(char*)&endian; 175 176 const uint8_t *array = bit_array; 177 unsigned pos = cur_bit / 8; 178 unsigned pos_xor_mask = little_endian ? 0 : current_wordsize-1; 179 180 for (;;) { 181 uint8_t bitmask; 182 uint8_t cur_byte; 183 184 if (cur_bit >= size_bits) 185 return -1; 186 cur_byte = array[pos ^ pos_xor_mask]; 187 if (cur_byte == 0) { 188 cur_bit = (cur_bit + 8) & (-8); 189 pos++; 190 continue; 191 } 192 bitmask = 1 << (cur_bit & 7); 193 for (;;) { 194 if (cur_byte & bitmask) 195 return cur_bit; 196 cur_bit++; 197 if (cur_bit >= size_bits) 198 return -1; 199 bitmask <<= 1; 200 /* This check *can't be* optimized out: */ 201 if (bitmask == 0) 202 break; 203 } 204 pos++; 205 } 206 } 207 /* 208 * Print entry in struct xlat table, if there. 209 */ 210 void 211 printxvals(const unsigned int val, const char *dflt, const struct xlat *xlat, ...) 212 { 213 va_list args; 214 215 va_start(args, xlat); 216 for (; xlat; xlat = va_arg(args, const struct xlat *)) { 217 const char *str = xlookup(xlat, val); 218 219 if (str) { 220 tprints(str); 221 va_end(args); 222 return; 223 } 224 } 225 /* No hits -- print raw # instead. */ 226 tprintf("%#x /* %s */", val, dflt); 227 228 va_end(args); 229 } 230 231 /* 232 * Fetch 64bit argument at position arg_no and 233 * return the index of the next argument. 234 */ 235 int 236 getllval(struct tcb *tcp, unsigned long long *val, int arg_no) 237 { 238 #if SIZEOF_LONG > 4 && SIZEOF_LONG == SIZEOF_LONG_LONG 239 # if SUPPORTED_PERSONALITIES > 1 240 # ifdef X86_64 241 if (current_personality != 1) { 242 # else 243 if (current_wordsize > 4) { 244 # endif 245 # endif 246 *val = tcp->u_arg[arg_no]; 247 arg_no++; 248 # if SUPPORTED_PERSONALITIES > 1 249 } else { 250 # if defined(AARCH64) || defined(POWERPC64) 251 /* Align arg_no to the next even number. */ 252 arg_no = (arg_no + 1) & 0xe; 253 # endif /* AARCH64 || POWERPC64 */ 254 *val = LONG_LONG(tcp->u_arg[arg_no], tcp->u_arg[arg_no + 1]); 255 arg_no += 2; 256 } 257 # endif /* SUPPORTED_PERSONALITIES > 1 */ 258 #elif SIZEOF_LONG > 4 259 # error Unsupported configuration: SIZEOF_LONG > 4 && SIZEOF_LONG_LONG > SIZEOF_LONG 260 #elif defined LINUX_MIPSN32 261 *val = tcp->ext_arg[arg_no]; 262 arg_no++; 263 #elif defined X32 264 if (current_personality == 0) { 265 *val = tcp->ext_arg[arg_no]; 266 arg_no++; 267 } else { 268 *val = LONG_LONG(tcp->u_arg[arg_no], tcp->u_arg[arg_no + 1]); 269 arg_no += 2; 270 } 271 #else 272 # if defined __ARM_EABI__ || \ 273 defined LINUX_MIPSO32 || \ 274 defined POWERPC || \ 275 defined XTENSA 276 /* Align arg_no to the next even number. */ 277 arg_no = (arg_no + 1) & 0xe; 278 # endif 279 *val = LONG_LONG(tcp->u_arg[arg_no], tcp->u_arg[arg_no + 1]); 280 arg_no += 2; 281 #endif 282 283 return arg_no; 284 } 285 286 /* 287 * Print 64bit argument at position arg_no and 288 * return the index of the next argument. 289 */ 290 int 291 printllval(struct tcb *tcp, const char *format, int arg_no) 292 { 293 unsigned long long val = 0; 294 295 arg_no = getllval(tcp, &val, arg_no); 296 tprintf(format, val); 297 return arg_no; 298 } 299 300 /* 301 * Interpret `xlat' as an array of flags 302 * print the entries whose bits are on in `flags' 303 * return # of flags printed. 304 */ 305 void 306 addflags(const struct xlat *xlat, int flags) 307 { 308 for (; xlat->str; xlat++) { 309 if (xlat->val && (flags & xlat->val) == xlat->val) { 310 tprintf("|%s", xlat->str); 311 flags &= ~xlat->val; 312 } 313 } 314 if (flags) { 315 tprintf("|%#x", flags); 316 } 317 } 318 319 /* 320 * Interpret `xlat' as an array of flags. 321 * Print to static string the entries whose bits are on in `flags' 322 * Return static string. 323 */ 324 const char * 325 sprintflags(const char *prefix, const struct xlat *xlat, int flags) 326 { 327 static char outstr[1024]; 328 char *outptr; 329 int found = 0; 330 331 outptr = stpcpy(outstr, prefix); 332 333 if (flags == 0 && xlat->val == 0 && xlat->str) { 334 strcpy(outptr, xlat->str); 335 return outstr; 336 } 337 338 for (; xlat->str; xlat++) { 339 if (xlat->val && (flags & xlat->val) == xlat->val) { 340 if (found) 341 *outptr++ = '|'; 342 outptr = stpcpy(outptr, xlat->str); 343 found = 1; 344 flags &= ~xlat->val; 345 if (!flags) 346 break; 347 } 348 } 349 if (flags) { 350 if (found) 351 *outptr++ = '|'; 352 outptr += sprintf(outptr, "%#x", flags); 353 } 354 355 return outstr; 356 } 357 358 int 359 printflags(const struct xlat *xlat, int flags, const char *dflt) 360 { 361 int n; 362 const char *sep; 363 364 if (flags == 0 && xlat->val == 0 && xlat->str) { 365 tprints(xlat->str); 366 return 1; 367 } 368 369 sep = ""; 370 for (n = 0; xlat->str; xlat++) { 371 if (xlat->val && (flags & xlat->val) == xlat->val) { 372 tprintf("%s%s", sep, xlat->str); 373 flags &= ~xlat->val; 374 sep = "|"; 375 n++; 376 } 377 } 378 379 if (n) { 380 if (flags) { 381 tprintf("%s%#x", sep, flags); 382 n++; 383 } 384 } else { 385 if (flags) { 386 tprintf("%#x", flags); 387 if (dflt) 388 tprintf(" /* %s */", dflt); 389 } else { 390 if (dflt) 391 tprints("0"); 392 } 393 } 394 395 return n; 396 } 397 398 void 399 printaddr(const long addr) 400 { 401 if (!addr) 402 tprints("NULL"); 403 else 404 tprintf("%#lx", addr); 405 } 406 407 #define DEF_PRINTNUM(name, type) \ 408 bool \ 409 printnum_ ## name(struct tcb *tcp, const long addr, const char *fmt) \ 410 { \ 411 type num; \ 412 if (umove_or_printaddr(tcp, addr, &num)) \ 413 return false; \ 414 tprints("["); \ 415 tprintf(fmt, num); \ 416 tprints("]"); \ 417 return true; \ 418 } 419 420 #define DEF_PRINTPAIR(name, type) \ 421 bool \ 422 printpair_ ## name(struct tcb *tcp, const long addr, const char *fmt) \ 423 { \ 424 type pair[2]; \ 425 if (umove_or_printaddr(tcp, addr, &pair)) \ 426 return false; \ 427 tprints("["); \ 428 tprintf(fmt, pair[0]); \ 429 tprints(", "); \ 430 tprintf(fmt, pair[1]); \ 431 tprints("]"); \ 432 return true; \ 433 } 434 435 DEF_PRINTNUM(int, int) 436 DEF_PRINTPAIR(int, int) 437 DEF_PRINTNUM(short, short) 438 DEF_PRINTNUM(int64, uint64_t) 439 DEF_PRINTPAIR(int64, uint64_t) 440 441 #if SUPPORTED_PERSONALITIES > 1 && SIZEOF_LONG > 4 442 bool 443 printnum_long_int(struct tcb *tcp, const long addr, 444 const char *fmt_long, const char *fmt_int) 445 { 446 if (current_wordsize > sizeof(int)) { 447 return printnum_int64(tcp, addr, fmt_long); 448 } else { 449 return printnum_int(tcp, addr, fmt_int); 450 } 451 } 452 #endif 453 454 const char * 455 sprinttime(time_t t) 456 { 457 struct tm *tmp; 458 static char buf[sizeof(int) * 3 * 6]; 459 460 if (t == 0) { 461 strcpy(buf, "0"); 462 return buf; 463 } 464 tmp = localtime(&t); 465 if (tmp) 466 snprintf(buf, sizeof buf, "%02d/%02d/%02d-%02d:%02d:%02d", 467 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday, 468 tmp->tm_hour, tmp->tm_min, tmp->tm_sec); 469 else 470 snprintf(buf, sizeof buf, "%lu", (unsigned long) t); 471 472 return buf; 473 } 474 475 static char * 476 getfdproto(struct tcb *tcp, int fd, char *buf, unsigned bufsize) 477 { 478 #ifdef HAVE_SYS_XATTR_H 479 ssize_t r; 480 char path[sizeof("/proc/%u/fd/%u") + 2 * sizeof(int)*3]; 481 482 if (fd < 0) 483 return NULL; 484 485 sprintf(path, "/proc/%u/fd/%u", tcp->pid, fd); 486 r = getxattr(path, "system.sockprotoname", buf, bufsize - 1); 487 if (r <= 0) 488 return NULL; 489 else { 490 /* 491 * This is a protection for the case when the kernel 492 * side does not append a null byte to the buffer. 493 */ 494 buf[r] = '\0'; 495 return buf; 496 } 497 #else 498 return NULL; 499 #endif 500 } 501 502 void 503 printfd(struct tcb *tcp, int fd) 504 { 505 char path[PATH_MAX + 1]; 506 if (show_fd_path && getfdpath(tcp, fd, path, sizeof(path)) >= 0) { 507 static const char socket_prefix[] = "socket:["; 508 const size_t socket_prefix_len = sizeof(socket_prefix) - 1; 509 const size_t path_len = strlen(path); 510 511 tprintf("%d<", fd); 512 if (show_fd_path > 1 && 513 strncmp(path, socket_prefix, socket_prefix_len) == 0 && 514 path[path_len - 1] == ']') { 515 unsigned long inodenr; 516 #define PROTO_NAME_LEN 32 517 char proto_buf[PROTO_NAME_LEN]; 518 const char *proto = 519 getfdproto(tcp, fd, proto_buf, PROTO_NAME_LEN); 520 inodenr = strtoul(path + socket_prefix_len, NULL, 10); 521 if (!print_sockaddr_by_inode(inodenr, proto)) { 522 if (proto) 523 tprintf("%s:[%lu]", proto, inodenr); 524 else 525 tprints(path); 526 } 527 } else { 528 print_quoted_string(path, path_len, 529 QUOTE_OMIT_LEADING_TRAILING_QUOTES); 530 } 531 tprints(">"); 532 } else 533 tprintf("%d", fd); 534 } 535 536 /* 537 * Quote string `instr' of length `size' 538 * Write up to (3 + `size' * 4) bytes to `outstr' buffer. 539 * 540 * If QUOTE_0_TERMINATED `style' flag is set, 541 * treat `instr' as a NUL-terminated string, 542 * checking up to (`size' + 1) bytes of `instr'. 543 * 544 * If QUOTE_OMIT_LEADING_TRAILING_QUOTES `style' flag is set, 545 * do not add leading and trailing quoting symbols. 546 * 547 * Returns 0 if QUOTE_0_TERMINATED is set and NUL was seen, 1 otherwise. 548 * Note that if QUOTE_0_TERMINATED is not set, always returns 1. 549 */ 550 static int 551 string_quote(const char *instr, char *outstr, const unsigned int size, 552 const unsigned int style) 553 { 554 const unsigned char *ustr = (const unsigned char *) instr; 555 char *s = outstr; 556 unsigned int i; 557 int usehex, c, eol; 558 559 if (style & QUOTE_0_TERMINATED) 560 eol = '\0'; 561 else 562 eol = 0x100; /* this can never match a char */ 563 564 usehex = 0; 565 if (xflag > 1) 566 usehex = 1; 567 else if (xflag) { 568 /* Check for presence of symbol which require 569 to hex-quote the whole string. */ 570 for (i = 0; i < size; ++i) { 571 c = ustr[i]; 572 /* Check for NUL-terminated string. */ 573 if (c == eol) 574 break; 575 576 /* Force hex unless c is printable or whitespace */ 577 if (c > 0x7e) { 578 usehex = 1; 579 break; 580 } 581 /* In ASCII isspace is only these chars: "\t\n\v\f\r". 582 * They happen to have ASCII codes 9,10,11,12,13. 583 */ 584 if (c < ' ' && (unsigned)(c - 9) >= 5) { 585 usehex = 1; 586 break; 587 } 588 } 589 } 590 591 if (!(style & QUOTE_OMIT_LEADING_TRAILING_QUOTES)) 592 *s++ = '\"'; 593 594 if (usehex) { 595 /* Hex-quote the whole string. */ 596 for (i = 0; i < size; ++i) { 597 c = ustr[i]; 598 /* Check for NUL-terminated string. */ 599 if (c == eol) 600 goto asciz_ended; 601 *s++ = '\\'; 602 *s++ = 'x'; 603 *s++ = "0123456789abcdef"[c >> 4]; 604 *s++ = "0123456789abcdef"[c & 0xf]; 605 } 606 } else { 607 for (i = 0; i < size; ++i) { 608 c = ustr[i]; 609 /* Check for NUL-terminated string. */ 610 if (c == eol) 611 goto asciz_ended; 612 switch (c) { 613 case '\"': case '\\': 614 *s++ = '\\'; 615 *s++ = c; 616 break; 617 case '\f': 618 *s++ = '\\'; 619 *s++ = 'f'; 620 break; 621 case '\n': 622 *s++ = '\\'; 623 *s++ = 'n'; 624 break; 625 case '\r': 626 *s++ = '\\'; 627 *s++ = 'r'; 628 break; 629 case '\t': 630 *s++ = '\\'; 631 *s++ = 't'; 632 break; 633 case '\v': 634 *s++ = '\\'; 635 *s++ = 'v'; 636 break; 637 default: 638 if (c >= ' ' && c <= 0x7e) 639 *s++ = c; 640 else { 641 /* Print \octal */ 642 *s++ = '\\'; 643 if (i + 1 < size 644 && ustr[i + 1] >= '0' 645 && ustr[i + 1] <= '9' 646 ) { 647 /* Print \ooo */ 648 *s++ = '0' + (c >> 6); 649 *s++ = '0' + ((c >> 3) & 0x7); 650 } else { 651 /* Print \[[o]o]o */ 652 if ((c >> 3) != 0) { 653 if ((c >> 6) != 0) 654 *s++ = '0' + (c >> 6); 655 *s++ = '0' + ((c >> 3) & 0x7); 656 } 657 } 658 *s++ = '0' + (c & 0x7); 659 } 660 break; 661 } 662 } 663 } 664 665 if (!(style & QUOTE_OMIT_LEADING_TRAILING_QUOTES)) 666 *s++ = '\"'; 667 *s = '\0'; 668 669 /* Return zero if we printed entire ASCIZ string (didn't truncate it) */ 670 if (style & QUOTE_0_TERMINATED && ustr[i] == '\0') { 671 /* We didn't see NUL yet (otherwise we'd jump to 'asciz_ended') 672 * but next char is NUL. 673 */ 674 return 0; 675 } 676 677 return 1; 678 679 asciz_ended: 680 if (!(style & QUOTE_OMIT_LEADING_TRAILING_QUOTES)) 681 *s++ = '\"'; 682 *s = '\0'; 683 /* Return zero: we printed entire ASCIZ string (didn't truncate it) */ 684 return 0; 685 } 686 687 #ifndef ALLOCA_CUTOFF 688 # define ALLOCA_CUTOFF 4032 689 #endif 690 #define use_alloca(n) ((n) <= ALLOCA_CUTOFF) 691 692 /* 693 * Quote string `str' of length `size' and print the result. 694 * 695 * If QUOTE_0_TERMINATED `style' flag is set, 696 * treat `str' as a NUL-terminated string and 697 * quote at most (`size' - 1) bytes. 698 * 699 * If QUOTE_OMIT_LEADING_TRAILING_QUOTES `style' flag is set, 700 * do not add leading and trailing quoting symbols. 701 * 702 * Returns 0 if QUOTE_0_TERMINATED is set and NUL was seen, 1 otherwise. 703 * Note that if QUOTE_0_TERMINATED is not set, always returns 1. 704 */ 705 int 706 print_quoted_string(const char *str, unsigned int size, 707 const unsigned int style) 708 { 709 char *buf; 710 char *outstr; 711 unsigned int alloc_size; 712 int rc; 713 714 if (size && style & QUOTE_0_TERMINATED) 715 --size; 716 717 alloc_size = 4 * size; 718 if (alloc_size / 4 != size) { 719 error_msg("Out of memory"); 720 tprints("???"); 721 return -1; 722 } 723 alloc_size += 1 + (style & QUOTE_OMIT_LEADING_TRAILING_QUOTES ? 0 : 2); 724 725 if (use_alloca(alloc_size)) { 726 outstr = alloca(alloc_size); 727 buf = NULL; 728 } else { 729 outstr = buf = malloc(alloc_size); 730 if (!buf) { 731 error_msg("Out of memory"); 732 tprints("???"); 733 return -1; 734 } 735 } 736 737 rc = string_quote(str, outstr, size, style); 738 tprints(outstr); 739 740 free(buf); 741 return rc; 742 } 743 744 /* 745 * Print path string specified by address `addr' and length `n'. 746 * If path length exceeds `n', append `...' to the output. 747 */ 748 void 749 printpathn(struct tcb *tcp, long addr, unsigned int n) 750 { 751 char path[PATH_MAX + 1]; 752 int nul_seen; 753 754 if (!addr) { 755 tprints("NULL"); 756 return; 757 } 758 759 /* Cap path length to the path buffer size */ 760 if (n > sizeof path - 1) 761 n = sizeof path - 1; 762 763 /* Fetch one byte more to find out whether path length > n. */ 764 nul_seen = umovestr(tcp, addr, n + 1, path); 765 if (nul_seen < 0) 766 tprintf("%#lx", addr); 767 else { 768 path[n++] = '\0'; 769 print_quoted_string(path, n, QUOTE_0_TERMINATED); 770 if (!nul_seen) 771 tprints("..."); 772 } 773 } 774 775 void 776 printpath(struct tcb *tcp, long addr) 777 { 778 /* Size must correspond to char path[] size in printpathn */ 779 printpathn(tcp, addr, PATH_MAX); 780 } 781 782 /* 783 * Print string specified by address `addr' and length `len'. 784 * If `len' < 0, treat the string as a NUL-terminated string. 785 * If string length exceeds `max_strlen', append `...' to the output. 786 */ 787 void 788 printstr(struct tcb *tcp, long addr, long len) 789 { 790 static char *str = NULL; 791 static char *outstr; 792 unsigned int size; 793 unsigned int style; 794 int ellipsis; 795 796 if (!addr) { 797 tprints("NULL"); 798 return; 799 } 800 /* Allocate static buffers if they are not allocated yet. */ 801 if (!str) { 802 unsigned int outstr_size = 4 * max_strlen + /*for quotes and NUL:*/ 3; 803 804 if (outstr_size / 4 != max_strlen) 805 die_out_of_memory(); 806 str = xmalloc(max_strlen + 1); 807 outstr = xmalloc(outstr_size); 808 } 809 810 size = max_strlen; 811 if (len == -1) { 812 /* 813 * Treat as a NUL-terminated string: fetch one byte more 814 * because string_quote may look one byte ahead. 815 */ 816 if (umovestr(tcp, addr, size + 1, str) < 0) { 817 tprintf("%#lx", addr); 818 return; 819 } 820 style = QUOTE_0_TERMINATED; 821 } 822 else { 823 if (size > (unsigned long)len) 824 size = (unsigned long)len; 825 if (umoven(tcp, addr, size, str) < 0) { 826 tprintf("%#lx", addr); 827 return; 828 } 829 style = 0; 830 } 831 832 /* If string_quote didn't see NUL and (it was supposed to be ASCIZ str 833 * or we were requested to print more than -s NUM chars)... 834 */ 835 ellipsis = (string_quote(str, outstr, size, style) && 836 (len < 0 || (unsigned long) len > max_strlen)); 837 838 tprints(outstr); 839 if (ellipsis) 840 tprints("..."); 841 } 842 843 void 844 dumpiov(struct tcb *tcp, int len, long addr) 845 { 846 #if SUPPORTED_PERSONALITIES > 1 847 union { 848 struct { u_int32_t base; u_int32_t len; } *iov32; 849 struct { u_int64_t base; u_int64_t len; } *iov64; 850 } iovu; 851 #define iov iovu.iov64 852 #define sizeof_iov \ 853 (current_wordsize == 4 ? sizeof(*iovu.iov32) : sizeof(*iovu.iov64)) 854 #define iov_iov_base(i) \ 855 (current_wordsize == 4 ? (uint64_t) iovu.iov32[i].base : iovu.iov64[i].base) 856 #define iov_iov_len(i) \ 857 (current_wordsize == 4 ? (uint64_t) iovu.iov32[i].len : iovu.iov64[i].len) 858 #else 859 struct iovec *iov; 860 #define sizeof_iov sizeof(*iov) 861 #define iov_iov_base(i) iov[i].iov_base 862 #define iov_iov_len(i) iov[i].iov_len 863 #endif 864 int i; 865 unsigned size; 866 867 size = sizeof_iov * len; 868 /* Assuming no sane program has millions of iovs */ 869 if ((unsigned)len > 1024*1024 /* insane or negative size? */ 870 || (iov = malloc(size)) == NULL) { 871 error_msg("Out of memory"); 872 return; 873 } 874 if (umoven(tcp, addr, size, iov) >= 0) { 875 for (i = 0; i < len; i++) { 876 /* include the buffer number to make it easy to 877 * match up the trace with the source */ 878 tprintf(" * %lu bytes in buffer %d\n", 879 (unsigned long)iov_iov_len(i), i); 880 dumpstr(tcp, (long) iov_iov_base(i), 881 iov_iov_len(i)); 882 } 883 } 884 free(iov); 885 #undef sizeof_iov 886 #undef iov_iov_base 887 #undef iov_iov_len 888 #undef iov 889 } 890 891 void 892 dumpstr(struct tcb *tcp, long addr, int len) 893 { 894 static int strsize = -1; 895 static unsigned char *str; 896 897 char outbuf[ 898 ( 899 (sizeof( 900 "xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx " 901 "1234567890123456") + /*in case I'm off by few:*/ 4) 902 /*align to 8 to make memset easier:*/ + 7) & -8 903 ]; 904 const unsigned char *src; 905 int i; 906 907 memset(outbuf, ' ', sizeof(outbuf)); 908 909 if (strsize < len + 16) { 910 free(str); 911 str = malloc(len + 16); 912 if (!str) { 913 strsize = -1; 914 error_msg("Out of memory"); 915 return; 916 } 917 strsize = len + 16; 918 } 919 920 if (umoven(tcp, addr, len, str) < 0) 921 return; 922 923 /* Space-pad to 16 bytes */ 924 i = len; 925 while (i & 0xf) 926 str[i++] = ' '; 927 928 i = 0; 929 src = str; 930 while (i < len) { 931 char *dst = outbuf; 932 /* Hex dump */ 933 do { 934 if (i < len) { 935 *dst++ = "0123456789abcdef"[*src >> 4]; 936 *dst++ = "0123456789abcdef"[*src & 0xf]; 937 } 938 else { 939 *dst++ = ' '; 940 *dst++ = ' '; 941 } 942 dst++; /* space is there by memset */ 943 i++; 944 if ((i & 7) == 0) 945 dst++; /* space is there by memset */ 946 src++; 947 } while (i & 0xf); 948 /* ASCII dump */ 949 i -= 16; 950 src -= 16; 951 do { 952 if (*src >= ' ' && *src < 0x7f) 953 *dst++ = *src; 954 else 955 *dst++ = '.'; 956 src++; 957 } while (++i & 0xf); 958 *dst = '\0'; 959 tprintf(" | %05x %s |\n", i - 16, outbuf); 960 } 961 } 962 963 #ifdef HAVE_PROCESS_VM_READV 964 /* C library supports this, but the kernel might not. */ 965 static bool process_vm_readv_not_supported = 0; 966 #else 967 968 /* Need to do this since process_vm_readv() is not yet available in libc. 969 * When libc is be updated, only "static bool process_vm_readv_not_supported" 970 * line should remain. 971 */ 972 #if !defined(__NR_process_vm_readv) 973 # if defined(I386) 974 # define __NR_process_vm_readv 347 975 # elif defined(X86_64) 976 # define __NR_process_vm_readv 310 977 # elif defined(POWERPC) 978 # define __NR_process_vm_readv 351 979 # endif 980 #endif 981 982 #if defined(__NR_process_vm_readv) 983 static bool process_vm_readv_not_supported = 0; 984 /* Have to avoid duplicating with the C library headers. */ 985 static ssize_t strace_process_vm_readv(pid_t pid, 986 const struct iovec *lvec, 987 unsigned long liovcnt, 988 const struct iovec *rvec, 989 unsigned long riovcnt, 990 unsigned long flags) 991 { 992 return syscall(__NR_process_vm_readv, (long)pid, lvec, liovcnt, rvec, riovcnt, flags); 993 } 994 #define process_vm_readv strace_process_vm_readv 995 #else 996 static bool process_vm_readv_not_supported = 1; 997 # define process_vm_readv(...) (errno = ENOSYS, -1) 998 #endif 999 1000 #endif /* end of hack */ 1001 1002 static ssize_t 1003 vm_read_mem(pid_t pid, void *laddr, long raddr, size_t len) 1004 { 1005 const struct iovec local = { 1006 .iov_base = laddr, 1007 .iov_len = len 1008 }; 1009 const struct iovec remote = { 1010 .iov_base = (void *) raddr, 1011 .iov_len = len 1012 }; 1013 1014 return process_vm_readv(pid, &local, 1, &remote, 1, 0); 1015 } 1016 1017 /* 1018 * move `len' bytes of data from process `pid' 1019 * at address `addr' to our space at `our_addr' 1020 */ 1021 int 1022 umoven(struct tcb *tcp, long addr, unsigned int len, void *our_addr) 1023 { 1024 char *laddr = our_addr; 1025 int pid = tcp->pid; 1026 unsigned int n, m, nread; 1027 union { 1028 long val; 1029 char x[sizeof(long)]; 1030 } u; 1031 1032 #if SUPPORTED_PERSONALITIES > 1 && SIZEOF_LONG > 4 1033 if (current_wordsize < sizeof(addr)) 1034 addr &= (1ul << 8 * current_wordsize) - 1; 1035 #endif 1036 1037 if (!process_vm_readv_not_supported) { 1038 int r = vm_read_mem(pid, laddr, addr, len); 1039 if ((unsigned int) r == len) 1040 return 0; 1041 if (r >= 0) { 1042 error_msg("umoven: short read (%u < %u) @0x%lx", 1043 (unsigned int) r, len, addr); 1044 return -1; 1045 } 1046 switch (errno) { 1047 case ENOSYS: 1048 process_vm_readv_not_supported = 1; 1049 break; 1050 case EPERM: 1051 /* operation not permitted, try PTRACE_PEEKDATA */ 1052 break; 1053 case ESRCH: 1054 /* the process is gone */ 1055 return -1; 1056 case EFAULT: case EIO: 1057 /* address space is inaccessible */ 1058 return -1; 1059 default: 1060 /* all the rest is strange and should be reported */ 1061 perror_msg("process_vm_readv"); 1062 return -1; 1063 } 1064 } 1065 1066 nread = 0; 1067 if (addr & (sizeof(long) - 1)) { 1068 /* addr not a multiple of sizeof(long) */ 1069 n = addr & (sizeof(long) - 1); /* residue */ 1070 addr &= -sizeof(long); /* aligned address */ 1071 errno = 0; 1072 u.val = ptrace(PTRACE_PEEKDATA, pid, (char *) addr, 0); 1073 switch (errno) { 1074 case 0: 1075 break; 1076 case ESRCH: case EINVAL: 1077 /* these could be seen if the process is gone */ 1078 return -1; 1079 case EFAULT: case EIO: case EPERM: 1080 /* address space is inaccessible */ 1081 return -1; 1082 default: 1083 /* all the rest is strange and should be reported */ 1084 perror_msg("umoven: PTRACE_PEEKDATA pid:%d @0x%lx", 1085 pid, addr); 1086 return -1; 1087 } 1088 m = MIN(sizeof(long) - n, len); 1089 memcpy(laddr, &u.x[n], m); 1090 addr += sizeof(long); 1091 laddr += m; 1092 nread += m; 1093 len -= m; 1094 } 1095 while (len) { 1096 errno = 0; 1097 u.val = ptrace(PTRACE_PEEKDATA, pid, (char *) addr, 0); 1098 switch (errno) { 1099 case 0: 1100 break; 1101 case ESRCH: case EINVAL: 1102 /* these could be seen if the process is gone */ 1103 return -1; 1104 case EFAULT: case EIO: case EPERM: 1105 /* address space is inaccessible */ 1106 if (nread) { 1107 perror_msg("umoven: short read (%u < %u) @0x%lx", 1108 nread, nread + len, addr - nread); 1109 } 1110 return -1; 1111 default: 1112 /* all the rest is strange and should be reported */ 1113 perror_msg("umoven: PTRACE_PEEKDATA pid:%d @0x%lx", 1114 pid, addr); 1115 return -1; 1116 } 1117 m = MIN(sizeof(long), len); 1118 memcpy(laddr, u.x, m); 1119 addr += sizeof(long); 1120 laddr += m; 1121 nread += m; 1122 len -= m; 1123 } 1124 1125 return 0; 1126 } 1127 1128 int 1129 umoven_or_printaddr(struct tcb *tcp, const long addr, const unsigned int len, 1130 void *our_addr) 1131 { 1132 if (!addr) { 1133 tprints("NULL"); 1134 return -1; 1135 } 1136 if (!verbose(tcp) || (exiting(tcp) && syserror(tcp)) || 1137 umoven(tcp, addr, len, our_addr) < 0) { 1138 tprintf("%#lx", addr); 1139 return -1; 1140 } 1141 return 0; 1142 } 1143 1144 int 1145 umove_ulong_or_printaddr(struct tcb *tcp, const long addr, unsigned long *ptr) 1146 { 1147 if (current_wordsize < sizeof(*ptr)) { 1148 uint32_t val32; 1149 int r = umove_or_printaddr(tcp, addr, &val32); 1150 if (!r) 1151 *ptr = (unsigned long) val32; 1152 return r; 1153 } 1154 return umove_or_printaddr(tcp, addr, ptr); 1155 } 1156 1157 int 1158 umove_ulong_array_or_printaddr(struct tcb *tcp, const long addr, 1159 unsigned long *ptr, size_t n) 1160 { 1161 if (current_wordsize < sizeof(*ptr)) { 1162 uint32_t ptr32[n]; 1163 int r = umove_or_printaddr(tcp, addr, &ptr32); 1164 if (!r) { 1165 size_t i; 1166 1167 for (i = 0; i < n; ++i) 1168 ptr[i] = (unsigned long) ptr32[i]; 1169 } 1170 return r; 1171 } 1172 return umoven_or_printaddr(tcp, addr, n * sizeof(*ptr), ptr); 1173 } 1174 1175 /* 1176 * Like `umove' but make the additional effort of looking 1177 * for a terminating zero byte. 1178 * 1179 * Returns < 0 on error, > 0 if NUL was seen, 1180 * (TODO if useful: return count of bytes including NUL), 1181 * else 0 if len bytes were read but no NUL byte seen. 1182 * 1183 * Note: there is no guarantee we won't overwrite some bytes 1184 * in laddr[] _after_ terminating NUL (but, of course, 1185 * we never write past laddr[len-1]). 1186 */ 1187 int 1188 umovestr(struct tcb *tcp, long addr, unsigned int len, char *laddr) 1189 { 1190 #if SIZEOF_LONG == 4 1191 const unsigned long x01010101 = 0x01010101ul; 1192 const unsigned long x80808080 = 0x80808080ul; 1193 #elif SIZEOF_LONG == 8 1194 const unsigned long x01010101 = 0x0101010101010101ul; 1195 const unsigned long x80808080 = 0x8080808080808080ul; 1196 #else 1197 # error SIZEOF_LONG > 8 1198 #endif 1199 1200 int pid = tcp->pid; 1201 unsigned int n, m, nread; 1202 union { 1203 unsigned long val; 1204 char x[sizeof(long)]; 1205 } u; 1206 1207 #if SUPPORTED_PERSONALITIES > 1 && SIZEOF_LONG > 4 1208 if (current_wordsize < sizeof(addr)) 1209 addr &= (1ul << 8 * current_wordsize) - 1; 1210 #endif 1211 1212 nread = 0; 1213 if (!process_vm_readv_not_supported) { 1214 const size_t page_size = get_pagesize(); 1215 const size_t page_mask = page_size - 1; 1216 1217 while (len > 0) { 1218 unsigned int chunk_len; 1219 unsigned int end_in_page; 1220 1221 /* 1222 * Don't cross pages, otherwise we can get EFAULT 1223 * and fail to notice that terminating NUL lies 1224 * in the existing (first) page. 1225 */ 1226 chunk_len = len > page_size ? page_size : len; 1227 end_in_page = (addr + chunk_len) & page_mask; 1228 if (chunk_len > end_in_page) /* crosses to the next page */ 1229 chunk_len -= end_in_page; 1230 1231 int r = vm_read_mem(pid, laddr, addr, chunk_len); 1232 if (r > 0) { 1233 if (memchr(laddr, '\0', r)) 1234 return 1; 1235 addr += r; 1236 laddr += r; 1237 nread += r; 1238 len -= r; 1239 continue; 1240 } 1241 switch (errno) { 1242 case ENOSYS: 1243 process_vm_readv_not_supported = 1; 1244 goto vm_readv_didnt_work; 1245 case ESRCH: 1246 /* the process is gone */ 1247 return -1; 1248 case EPERM: 1249 /* operation not permitted, try PTRACE_PEEKDATA */ 1250 if (!nread) 1251 goto vm_readv_didnt_work; 1252 /* fall through */ 1253 case EFAULT: case EIO: 1254 /* address space is inaccessible */ 1255 if (nread) { 1256 perror_msg("umovestr: short read (%d < %d) @0x%lx", 1257 nread, nread + len, addr - nread); 1258 } 1259 return -1; 1260 default: 1261 /* all the rest is strange and should be reported */ 1262 perror_msg("process_vm_readv"); 1263 return -1; 1264 } 1265 } 1266 return 0; 1267 } 1268 vm_readv_didnt_work: 1269 1270 if (addr & (sizeof(long) - 1)) { 1271 /* addr not a multiple of sizeof(long) */ 1272 n = addr & (sizeof(long) - 1); /* residue */ 1273 addr &= -sizeof(long); /* aligned address */ 1274 errno = 0; 1275 u.val = ptrace(PTRACE_PEEKDATA, pid, (char *)addr, 0); 1276 switch (errno) { 1277 case 0: 1278 break; 1279 case ESRCH: case EINVAL: 1280 /* these could be seen if the process is gone */ 1281 return -1; 1282 case EFAULT: case EIO: case EPERM: 1283 /* address space is inaccessible */ 1284 return -1; 1285 default: 1286 /* all the rest is strange and should be reported */ 1287 perror_msg("umovestr: PTRACE_PEEKDATA pid:%d @0x%lx", 1288 pid, addr); 1289 return -1; 1290 } 1291 m = MIN(sizeof(long) - n, len); 1292 memcpy(laddr, &u.x[n], m); 1293 while (n & (sizeof(long) - 1)) 1294 if (u.x[n++] == '\0') 1295 return 1; 1296 addr += sizeof(long); 1297 laddr += m; 1298 nread += m; 1299 len -= m; 1300 } 1301 1302 while (len) { 1303 errno = 0; 1304 u.val = ptrace(PTRACE_PEEKDATA, pid, (char *)addr, 0); 1305 switch (errno) { 1306 case 0: 1307 break; 1308 case ESRCH: case EINVAL: 1309 /* these could be seen if the process is gone */ 1310 return -1; 1311 case EFAULT: case EIO: case EPERM: 1312 /* address space is inaccessible */ 1313 if (nread) { 1314 perror_msg("umovestr: short read (%d < %d) @0x%lx", 1315 nread, nread + len, addr - nread); 1316 } 1317 return -1; 1318 default: 1319 /* all the rest is strange and should be reported */ 1320 perror_msg("umovestr: PTRACE_PEEKDATA pid:%d @0x%lx", 1321 pid, addr); 1322 return -1; 1323 } 1324 m = MIN(sizeof(long), len); 1325 memcpy(laddr, u.x, m); 1326 /* "If a NUL char exists in this word" */ 1327 if ((u.val - x01010101) & ~u.val & x80808080) 1328 return 1; 1329 addr += sizeof(long); 1330 laddr += m; 1331 nread += m; 1332 len -= m; 1333 } 1334 return 0; 1335 } 1336 1337 int 1338 upeek(int pid, long off, long *res) 1339 { 1340 long val; 1341 1342 errno = 0; 1343 val = ptrace(PTRACE_PEEKUSER, (pid_t)pid, (char *) off, 0); 1344 if (val == -1 && errno) { 1345 if (errno != ESRCH) { 1346 perror_msg("upeek: PTRACE_PEEKUSER pid:%d @0x%lx)", pid, off); 1347 } 1348 return -1; 1349 } 1350 *res = val; 1351 return 0; 1352 } 1353