1 /* elfcomm.c -- common code for ELF format file. 2 Copyright (C) 2010-2025 Free Software Foundation, Inc. 3 4 Originally developed by Eric Youngdale <eric (at) andante.jic.com> 5 Modifications by Nick Clifton <nickc (at) redhat.com> 6 7 This file is part of GNU Binutils. 8 9 This program is free software; you can redistribute it and/or modify 10 it under the terms of the GNU General Public License as published by 11 the Free Software Foundation; either version 3 of the License, or 12 (at your option) any later version. 13 14 This program is distributed in the hope that it will be useful, 15 but WITHOUT ANY WARRANTY; without even the implied warranty of 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 GNU General Public License for more details. 18 19 You should have received a copy of the GNU General Public License 20 along with this program; if not, write to the Free Software 21 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 22 02110-1301, USA. */ 23 24 /* Do not include bfd.h in this file. Functions in this file are used 25 by readelf.c and elfedit.c which define BFD64, and by objdump.c 26 which doesn't. */ 27 28 #include "sysdep.h" 29 #include "libiberty.h" 30 #include "bfd.h" 31 #include "filenames.h" 32 #include "aout/ar.h" 33 #include "elfcomm.h" 34 #include <assert.h> 35 36 extern char *program_name; 37 38 void 39 error (const char *message, ...) 40 { 41 va_list args; 42 43 /* Try to keep error messages in sync with the program's normal output. */ 44 fflush (stdout); 45 46 va_start (args, message); 47 fprintf (stderr, _("%s: Error: "), program_name); 48 vfprintf (stderr, message, args); 49 va_end (args); 50 } 51 52 void 53 warn (const char *message, ...) 54 { 55 va_list args; 56 57 /* Try to keep warning messages in sync with the program's normal output. */ 58 fflush (stdout); 59 60 va_start (args, message); 61 fprintf (stderr, _("%s: Warning: "), program_name); 62 vfprintf (stderr, message, args); 63 va_end (args); 64 } 65 66 void 67 inform (const char *message, ...) 68 { 69 va_list args; 70 71 /* Try to keep info messages in sync with the program's normal output. */ 72 fflush (stdout); 73 74 va_start (args, message); 75 fprintf (stderr, _("%s: Info: "), program_name); 76 vfprintf (stderr, message, args); 77 va_end (args); 78 } 79 80 void (*byte_put) (unsigned char *, uint64_t, unsigned int); 81 82 void 83 byte_put_little_endian (unsigned char *field, uint64_t value, unsigned int size) 84 { 85 if (size > sizeof (uint64_t)) 86 { 87 error (_("Unhandled data length: %d\n"), size); 88 abort (); 89 } 90 while (size--) 91 { 92 *field++ = value & 0xff; 93 value >>= 8; 94 } 95 } 96 97 void 98 byte_put_big_endian (unsigned char *field, uint64_t value, unsigned int size) 99 { 100 if (size > sizeof (uint64_t)) 101 { 102 error (_("Unhandled data length: %d\n"), size); 103 abort (); 104 } 105 while (size--) 106 { 107 field[size] = value & 0xff; 108 value >>= 8; 109 } 110 } 111 112 uint64_t (*byte_get) (const unsigned char *, unsigned int); 113 114 uint64_t 115 byte_get_little_endian (const unsigned char *field, unsigned int size) 116 { 117 switch (size) 118 { 119 case 1: 120 return *field; 121 122 case 2: 123 return ((uint64_t) field[0] 124 | ((uint64_t) field[1] << 8)); 125 126 case 3: 127 return ((uint64_t) field[0] 128 | ((uint64_t) field[1] << 8) 129 | ((uint64_t) field[2] << 16)); 130 131 case 4: 132 return ((uint64_t) field[0] 133 | ((uint64_t) field[1] << 8) 134 | ((uint64_t) field[2] << 16) 135 | ((uint64_t) field[3] << 24)); 136 137 case 5: 138 return ((uint64_t) field[0] 139 | ((uint64_t) field[1] << 8) 140 | ((uint64_t) field[2] << 16) 141 | ((uint64_t) field[3] << 24) 142 | ((uint64_t) field[4] << 32)); 143 144 case 6: 145 return ((uint64_t) field[0] 146 | ((uint64_t) field[1] << 8) 147 | ((uint64_t) field[2] << 16) 148 | ((uint64_t) field[3] << 24) 149 | ((uint64_t) field[4] << 32) 150 | ((uint64_t) field[5] << 40)); 151 152 case 7: 153 return ((uint64_t) field[0] 154 | ((uint64_t) field[1] << 8) 155 | ((uint64_t) field[2] << 16) 156 | ((uint64_t) field[3] << 24) 157 | ((uint64_t) field[4] << 32) 158 | ((uint64_t) field[5] << 40) 159 | ((uint64_t) field[6] << 48)); 160 161 case 8: 162 return ((uint64_t) field[0] 163 | ((uint64_t) field[1] << 8) 164 | ((uint64_t) field[2] << 16) 165 | ((uint64_t) field[3] << 24) 166 | ((uint64_t) field[4] << 32) 167 | ((uint64_t) field[5] << 40) 168 | ((uint64_t) field[6] << 48) 169 | ((uint64_t) field[7] << 56)); 170 171 default: 172 error (_("Unhandled data length: %d\n"), size); 173 abort (); 174 } 175 } 176 177 uint64_t 178 byte_get_big_endian (const unsigned char *field, unsigned int size) 179 { 180 switch (size) 181 { 182 case 1: 183 return *field; 184 185 case 2: 186 return ((uint64_t) field[1] 187 | ((uint64_t) field[0] << 8)); 188 189 case 3: 190 return ((uint64_t) field[2] 191 | ((uint64_t) field[1] << 8) 192 | ((uint64_t) field[0] << 16)); 193 194 case 4: 195 return ((uint64_t) field[3] 196 | ((uint64_t) field[2] << 8) 197 | ((uint64_t) field[1] << 16) 198 | ((uint64_t) field[0] << 24)); 199 200 case 5: 201 return ((uint64_t) field[4] 202 | ((uint64_t) field[3] << 8) 203 | ((uint64_t) field[2] << 16) 204 | ((uint64_t) field[1] << 24) 205 | ((uint64_t) field[0] << 32)); 206 207 case 6: 208 return ((uint64_t) field[5] 209 | ((uint64_t) field[4] << 8) 210 | ((uint64_t) field[3] << 16) 211 | ((uint64_t) field[2] << 24) 212 | ((uint64_t) field[1] << 32) 213 | ((uint64_t) field[0] << 40)); 214 215 case 7: 216 return ((uint64_t) field[6] 217 | ((uint64_t) field[5] << 8) 218 | ((uint64_t) field[4] << 16) 219 | ((uint64_t) field[3] << 24) 220 | ((uint64_t) field[2] << 32) 221 | ((uint64_t) field[1] << 40) 222 | ((uint64_t) field[0] << 48)); 223 224 case 8: 225 return ((uint64_t) field[7] 226 | ((uint64_t) field[6] << 8) 227 | ((uint64_t) field[5] << 16) 228 | ((uint64_t) field[4] << 24) 229 | ((uint64_t) field[3] << 32) 230 | ((uint64_t) field[2] << 40) 231 | ((uint64_t) field[1] << 48) 232 | ((uint64_t) field[0] << 56)); 233 234 default: 235 error (_("Unhandled data length: %d\n"), size); 236 abort (); 237 } 238 } 239 240 uint64_t 241 byte_get_signed (const unsigned char *field, unsigned int size) 242 { 243 uint64_t x = byte_get (field, size); 244 245 switch (size) 246 { 247 case 1: 248 return (x ^ 0x80) - 0x80; 249 case 2: 250 return (x ^ 0x8000) - 0x8000; 251 case 3: 252 return (x ^ 0x800000) - 0x800000; 253 case 4: 254 return (x ^ 0x80000000) - 0x80000000; 255 case 5: 256 case 6: 257 case 7: 258 case 8: 259 /* Reads of 5-, 6-, and 7-byte numbers are the result of 260 trying to read past the end of a buffer, and will therefore 261 not have meaningful values, so we don't try to deal with 262 the sign in these cases. */ 263 return x; 264 default: 265 abort (); 266 } 267 } 268 269 /* Return the path name for a proxy entry in a thin archive, adjusted 270 relative to the path name of the thin archive itself if necessary. 271 Always returns a pointer to malloc'ed memory. */ 272 273 char * 274 adjust_relative_path (const char *file_name, const char *name, 275 unsigned long name_len) 276 { 277 char * member_file_name; 278 const char * base_name = lbasename (file_name); 279 size_t amt; 280 281 /* This is a proxy entry for a thin archive member. 282 If the extended name table contains an absolute path 283 name, or if the archive is in the current directory, 284 use the path name as given. Otherwise, we need to 285 find the member relative to the directory where the 286 archive is located. */ 287 if (IS_ABSOLUTE_PATH (name) || base_name == file_name) 288 { 289 amt = name_len + 1; 290 if (amt == 0) 291 return NULL; 292 member_file_name = (char *) malloc (amt); 293 if (member_file_name == NULL) 294 { 295 error (_("Out of memory\n")); 296 return NULL; 297 } 298 memcpy (member_file_name, name, name_len); 299 member_file_name[name_len] = '\0'; 300 } 301 else 302 { 303 /* Concatenate the path components of the archive file name 304 to the relative path name from the extended name table. */ 305 size_t prefix_len = base_name - file_name; 306 307 amt = prefix_len + name_len + 1; 308 /* PR 17531: file: 2896dc8b 309 Catch wraparound. */ 310 if (amt < prefix_len || amt < name_len) 311 { 312 error (_("Abnormal length of thin archive member name: %lx\n"), 313 name_len); 314 return NULL; 315 } 316 317 member_file_name = (char *) malloc (amt); 318 if (member_file_name == NULL) 319 { 320 error (_("Out of memory\n")); 321 return NULL; 322 } 323 memcpy (member_file_name, file_name, prefix_len); 324 memcpy (member_file_name + prefix_len, name, name_len); 325 member_file_name[prefix_len + name_len] = '\0'; 326 } 327 return member_file_name; 328 } 329 330 /* Processes the archive index table and symbol table in ARCH. 331 Entries in the index table are SIZEOF_AR_INDEX bytes long. 332 Fills in ARCH->next_arhdr_offset and ARCH->arhdr. 333 If READ_SYMBOLS is true then fills in ARCH->index_num, ARCH->index_array, 334 ARCH->sym_size and ARCH->sym_table. 335 It is the caller's responsibility to free ARCH->index_array and 336 ARCH->sym_table. 337 Returns 1 upon success, 0 otherwise. 338 If failure occurs an error message is printed. */ 339 340 static int 341 process_archive_index_and_symbols (struct archive_info *arch, 342 unsigned int sizeof_ar_index, 343 int read_symbols) 344 { 345 size_t got; 346 unsigned long size; 347 char fmag_save; 348 349 fmag_save = arch->arhdr.ar_fmag[0]; 350 arch->arhdr.ar_fmag[0] = 0; 351 size = strtoul (arch->arhdr.ar_size, NULL, 10); 352 arch->arhdr.ar_fmag[0] = fmag_save; 353 /* PR 17531: file: 912bd7de. */ 354 if ((signed long) size < 0) 355 { 356 error (_("%s: invalid archive header size: %ld\n"), 357 arch->file_name, size); 358 return 0; 359 } 360 361 size = size + (size & 1); 362 363 arch->next_arhdr_offset += sizeof arch->arhdr + size; 364 365 if (! read_symbols) 366 { 367 if (fseek (arch->file, size, SEEK_CUR) != 0) 368 { 369 error (_("%s: failed to skip archive symbol table\n"), 370 arch->file_name); 371 return 0; 372 } 373 } 374 else 375 { 376 unsigned long i; 377 /* A buffer used to hold numbers read in from an archive index. 378 These are always SIZEOF_AR_INDEX bytes long and stored in 379 big-endian format. */ 380 unsigned char integer_buffer[sizeof arch->index_num]; 381 unsigned char * index_buffer; 382 383 assert (sizeof_ar_index <= sizeof integer_buffer); 384 385 /* Check the size of the archive index. */ 386 if (size < sizeof_ar_index) 387 { 388 error (_("%s: the archive index is empty\n"), arch->file_name); 389 return 0; 390 } 391 392 /* Read the number of entries in the archive index. */ 393 got = fread (integer_buffer, 1, sizeof_ar_index, arch->file); 394 if (got != sizeof_ar_index) 395 { 396 error (_("%s: failed to read archive index\n"), arch->file_name); 397 return 0; 398 } 399 400 arch->index_num = byte_get_big_endian (integer_buffer, sizeof_ar_index); 401 size -= sizeof_ar_index; 402 403 if (size < arch->index_num * sizeof_ar_index 404 /* PR 17531: file: 585515d1. */ 405 || size < arch->index_num) 406 { 407 error (_("%s: the archive index is supposed to have 0x%lx entries of %d bytes, but the size is only 0x%lx\n"), 408 arch->file_name, (long) arch->index_num, sizeof_ar_index, size); 409 return 0; 410 } 411 412 /* Read in the archive index. */ 413 index_buffer = (unsigned char *) 414 malloc (arch->index_num * sizeof_ar_index); 415 if (index_buffer == NULL) 416 { 417 error (_("Out of memory whilst trying to read archive symbol index\n")); 418 return 0; 419 } 420 421 got = fread (index_buffer, sizeof_ar_index, arch->index_num, arch->file); 422 if (got != arch->index_num) 423 { 424 free (index_buffer); 425 error (_("%s: failed to read archive index\n"), arch->file_name); 426 return 0; 427 } 428 429 size -= arch->index_num * sizeof_ar_index; 430 431 /* Convert the index numbers into the host's numeric format. */ 432 arch->index_array = (uint64_t *) 433 malloc (arch->index_num * sizeof (*arch->index_array)); 434 if (arch->index_array == NULL) 435 { 436 free (index_buffer); 437 error (_("Out of memory whilst trying to convert the archive symbol index\n")); 438 return 0; 439 } 440 441 for (i = 0; i < arch->index_num; i++) 442 arch->index_array[i] = 443 byte_get_big_endian ((unsigned char *) (index_buffer + (i * sizeof_ar_index)), 444 sizeof_ar_index); 445 free (index_buffer); 446 447 /* The remaining space in the header is taken up by the symbol table. */ 448 if (size < 1) 449 { 450 error (_("%s: the archive has an index but no symbols\n"), 451 arch->file_name); 452 return 0; 453 } 454 455 arch->sym_table = (char *) malloc (size); 456 if (arch->sym_table == NULL) 457 { 458 error (_("Out of memory whilst trying to read archive index symbol table\n")); 459 return 0; 460 } 461 462 arch->sym_size = size; 463 got = fread (arch->sym_table, 1, size, arch->file); 464 if (got != size) 465 { 466 error (_("%s: failed to read archive index symbol table\n"), 467 arch->file_name); 468 return 0; 469 } 470 } 471 472 /* Read the next archive header. */ 473 got = fread (&arch->arhdr, 1, sizeof arch->arhdr, arch->file); 474 if (got != sizeof arch->arhdr && got != 0) 475 { 476 error (_("%s: failed to read archive header following archive index\n"), 477 arch->file_name); 478 return 0; 479 } 480 481 return 1; 482 } 483 484 /* Read the symbol table and long-name table from an archive. */ 485 486 int 487 setup_archive (struct archive_info *arch, const char *file_name, 488 FILE *file, off_t file_size, 489 int is_thin_archive, int read_symbols) 490 { 491 size_t got; 492 493 arch->file_name = strdup (file_name); 494 arch->file = file; 495 arch->index_num = 0; 496 arch->index_array = NULL; 497 arch->sym_table = NULL; 498 arch->sym_size = 0; 499 arch->longnames = NULL; 500 arch->longnames_size = 0; 501 arch->nested_member_origin = 0; 502 arch->is_thin_archive = is_thin_archive; 503 arch->uses_64bit_indices = 0; 504 arch->next_arhdr_offset = SARMAG; 505 506 /* Read the first archive member header. */ 507 if (fseek (file, SARMAG, SEEK_SET) != 0) 508 { 509 error (_("%s: failed to seek to first archive header\n"), file_name); 510 return 1; 511 } 512 got = fread (&arch->arhdr, 1, sizeof arch->arhdr, file); 513 if (got != sizeof arch->arhdr) 514 { 515 if (got == 0) 516 return 0; 517 518 error (_("%s: failed to read archive header\n"), file_name); 519 return 1; 520 } 521 522 /* See if this is the archive symbol table. */ 523 if (startswith (arch->arhdr.ar_name, "/ ")) 524 { 525 if (! process_archive_index_and_symbols (arch, 4, read_symbols)) 526 return 1; 527 } 528 else if (startswith (arch->arhdr.ar_name, "/SYM64/ ")) 529 { 530 arch->uses_64bit_indices = 1; 531 if (! process_archive_index_and_symbols (arch, 8, read_symbols)) 532 return 1; 533 } 534 else if (read_symbols) 535 printf (_("%s has no archive index\n"), file_name); 536 537 if (startswith (arch->arhdr.ar_name, "// ")) 538 { 539 /* This is the archive string table holding long member names. */ 540 char fmag_save = arch->arhdr.ar_fmag[0]; 541 arch->arhdr.ar_fmag[0] = 0; 542 arch->longnames_size = strtoul (arch->arhdr.ar_size, NULL, 10); 543 arch->arhdr.ar_fmag[0] = fmag_save; 544 /* PR 17531: file: 01068045. */ 545 if (arch->longnames_size < 8) 546 { 547 error (_("%s: long name table is too small, (size = %" PRId64 ")\n"), 548 file_name, arch->longnames_size); 549 return 1; 550 } 551 /* PR 17531: file: 639d6a26. */ 552 if ((off_t) arch->longnames_size > file_size 553 || (signed long) arch->longnames_size < 0) 554 { 555 error (_("%s: long name table is too big, (size = %#" PRIx64 ")\n"), 556 file_name, arch->longnames_size); 557 return 1; 558 } 559 560 arch->next_arhdr_offset += sizeof arch->arhdr + arch->longnames_size; 561 562 /* Plus one to allow for a string terminator. */ 563 arch->longnames = (char *) malloc (arch->longnames_size + 1); 564 if (arch->longnames == NULL) 565 { 566 error (_("Out of memory reading long symbol names in archive\n")); 567 return 1; 568 } 569 570 if (fread (arch->longnames, arch->longnames_size, 1, file) != 1) 571 { 572 free (arch->longnames); 573 arch->longnames = NULL; 574 error (_("%s: failed to read long symbol name string table\n"), 575 file_name); 576 return 1; 577 } 578 579 if ((arch->longnames_size & 1) != 0) 580 getc (file); 581 582 arch->longnames[arch->longnames_size] = 0; 583 } 584 585 return 0; 586 } 587 588 /* Open and setup a nested archive, if not already open. */ 589 590 int 591 setup_nested_archive (struct archive_info *nested_arch, 592 const char *member_file_name) 593 { 594 FILE * member_file; 595 struct stat statbuf; 596 597 /* Have we already setup this archive? */ 598 if (nested_arch->file_name != NULL 599 && streq (nested_arch->file_name, member_file_name)) 600 return 0; 601 602 /* Close previous file and discard cached information. */ 603 if (nested_arch->file != NULL) 604 { 605 fclose (nested_arch->file); 606 nested_arch->file = NULL; 607 } 608 release_archive (nested_arch); 609 610 member_file = fopen (member_file_name, "rb"); 611 if (member_file == NULL) 612 return 1; 613 if (fstat (fileno (member_file), &statbuf) < 0) 614 return 1; 615 return setup_archive (nested_arch, member_file_name, member_file, 616 statbuf.st_size, 0, 0); 617 } 618 619 /* Release the memory used for the archive information. */ 620 621 void 622 release_archive (struct archive_info * arch) 623 { 624 free (arch->file_name); 625 free (arch->index_array); 626 free (arch->sym_table); 627 free (arch->longnames); 628 arch->file_name = NULL; 629 arch->index_array = NULL; 630 arch->sym_table = NULL; 631 arch->longnames = NULL; 632 } 633 634 /* Get the name of an archive member from the current archive header. 635 For simple names, this will modify the ar_name field of the current 636 archive header. For long names, it will return a pointer to the 637 longnames table. For nested archives, it will open the nested archive 638 and get the name recursively. NESTED_ARCH is a single-entry cache so 639 we don't keep rereading the same information from a nested archive. */ 640 641 char * 642 get_archive_member_name (struct archive_info *arch, 643 struct archive_info *nested_arch) 644 { 645 unsigned long j, k; 646 647 if (arch->arhdr.ar_name[0] == '/') 648 { 649 /* We have a long name. */ 650 char *endp; 651 char *member_file_name; 652 char *member_name; 653 char fmag_save; 654 655 if (arch->longnames == NULL || arch->longnames_size == 0) 656 { 657 error (_("Archive member uses long names, but no longname table found\n")); 658 return NULL; 659 } 660 661 arch->nested_member_origin = 0; 662 fmag_save = arch->arhdr.ar_fmag[0]; 663 arch->arhdr.ar_fmag[0] = 0; 664 k = j = strtoul (arch->arhdr.ar_name + 1, &endp, 10); 665 if (arch->is_thin_archive && endp != NULL && * endp == ':') 666 arch->nested_member_origin = strtoul (endp + 1, NULL, 10); 667 arch->arhdr.ar_fmag[0] = fmag_save; 668 669 if (j > arch->longnames_size) 670 { 671 error (_("Found long name index (%ld) beyond end of long name table\n"),j); 672 return NULL; 673 } 674 while ((j < arch->longnames_size) 675 && (arch->longnames[j] != '\n') 676 && (arch->longnames[j] != '\0')) 677 j++; 678 if (j > 0 && arch->longnames[j-1] == '/') 679 j--; 680 if (j > arch->longnames_size) 681 j = arch->longnames_size; 682 arch->longnames[j] = '\0'; 683 684 if (!arch->is_thin_archive || arch->nested_member_origin == 0) 685 return xstrdup (arch->longnames + k); 686 687 /* PR 17531: file: 2896dc8b. */ 688 if (k >= j) 689 { 690 error (_("Invalid Thin archive member name\n")); 691 return NULL; 692 } 693 694 /* This is a proxy for a member of a nested archive. 695 Find the name of the member in that archive. */ 696 member_file_name = adjust_relative_path (arch->file_name, 697 arch->longnames + k, j - k); 698 if (member_file_name != NULL 699 && setup_nested_archive (nested_arch, member_file_name) == 0) 700 { 701 member_name = get_archive_member_name_at (nested_arch, 702 arch->nested_member_origin, 703 NULL); 704 if (member_name != NULL) 705 { 706 free (member_file_name); 707 return member_name; 708 } 709 } 710 free (member_file_name); 711 712 /* Last resort: just return the name of the nested archive. */ 713 return xstrdup (arch->longnames + k); 714 } 715 716 /* We have a normal (short) name. */ 717 for (j = 0; j < sizeof (arch->arhdr.ar_name); j++) 718 if (arch->arhdr.ar_name[j] == '/') 719 { 720 arch->arhdr.ar_name[j] = '\0'; 721 return xstrdup (arch->arhdr.ar_name); 722 } 723 724 /* The full ar_name field is used. Don't rely on ar_date starting 725 with a zero byte. */ 726 { 727 char *name = xmalloc (sizeof (arch->arhdr.ar_name) + 1); 728 memcpy (name, arch->arhdr.ar_name, sizeof (arch->arhdr.ar_name)); 729 name[sizeof (arch->arhdr.ar_name)] = '\0'; 730 return name; 731 } 732 } 733 734 /* Get the name of an archive member at a given OFFSET within an archive 735 ARCH. */ 736 737 char * 738 get_archive_member_name_at (struct archive_info *arch, 739 unsigned long offset, 740 struct archive_info *nested_arch) 741 { 742 size_t got; 743 744 if (fseek (arch->file, offset, SEEK_SET) != 0) 745 { 746 error (_("%s: failed to seek to next file name\n"), arch->file_name); 747 return NULL; 748 } 749 got = fread (&arch->arhdr, 1, sizeof arch->arhdr, arch->file); 750 if (got != sizeof arch->arhdr) 751 { 752 error (_("%s: failed to read archive header\n"), arch->file_name); 753 return NULL; 754 } 755 if (memcmp (arch->arhdr.ar_fmag, ARFMAG, 2) != 0) 756 { 757 error (_("%s: did not find a valid archive header\n"), 758 arch->file_name); 759 return NULL; 760 } 761 762 return get_archive_member_name (arch, nested_arch); 763 } 764 765 /* Construct a string showing the name of the archive member, qualified 766 with the name of the containing archive file. For thin archives, we 767 use square brackets to denote the indirection. For nested archives, 768 we show the qualified name of the external member inside the square 769 brackets (e.g., "thin.a[normal.a(foo.o)]"). */ 770 771 char * 772 make_qualified_name (struct archive_info * arch, 773 struct archive_info * nested_arch, 774 const char *member_name) 775 { 776 const char * error_name = _("<corrupt>"); 777 size_t len; 778 char * name; 779 780 len = strlen (arch->file_name) + strlen (member_name) + 3; 781 if (arch->is_thin_archive 782 && arch->nested_member_origin != 0) 783 { 784 /* PR 15140: Allow for corrupt thin archives. */ 785 if (nested_arch->file_name) 786 len += strlen (nested_arch->file_name) + 2; 787 else 788 len += strlen (error_name) + 2; 789 } 790 791 name = (char *) malloc (len); 792 if (name == NULL) 793 { 794 error (_("Out of memory\n")); 795 return NULL; 796 } 797 798 if (arch->is_thin_archive 799 && arch->nested_member_origin != 0) 800 { 801 if (nested_arch->file_name) 802 snprintf (name, len, "%s[%s(%s)]", arch->file_name, 803 nested_arch->file_name, member_name); 804 else 805 snprintf (name, len, "%s[%s(%s)]", arch->file_name, 806 error_name, member_name); 807 } 808 else if (arch->is_thin_archive) 809 snprintf (name, len, "%s[%s]", arch->file_name, member_name); 810 else 811 snprintf (name, len, "%s(%s)", arch->file_name, member_name); 812 813 return name; 814 } 815