]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - binutils/elfcomm.c
gdb/aarch64: prevent crash from in process agent
[thirdparty/binutils-gdb.git] / binutils / elfcomm.c
1 /* elfcomm.c -- common code for ELF format file.
2 Copyright (C) 2010-2024 Free Software Foundation, Inc.
3
4 Originally developed by Eric Youngdale <eric@andante.jic.com>
5 Modifications by Nick Clifton <nickc@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 }