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