More fixes for invalid memory accesses exposed 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       /* PR 17531: file: 639d6a26.  */
659       if ((signed long) arch->longnames_size < 0)
660         {
661           error (_("%s: long name table is too big, (size = 0x%lx)\n"),
662                  file_name, arch->longnames_size);
663           return 1;
664         }
665
666       arch->next_arhdr_offset += sizeof arch->arhdr + arch->longnames_size;
667
668       /* Plus one to allow for a string terminator.  */
669       arch->longnames = (char *) malloc (arch->longnames_size + 1);
670       if (arch->longnames == NULL)
671         {
672           error (_("Out of memory reading long symbol names in archive\n"));
673           return 1;
674         }
675
676       if (fread (arch->longnames, arch->longnames_size, 1, file) != 1)
677         {
678           free (arch->longnames);
679           arch->longnames = NULL;
680           error (_("%s: failed to read long symbol name string table\n"),
681                  file_name);
682           return 1;
683         }
684
685       if ((arch->longnames_size & 1) != 0)
686         getc (file);
687
688       arch->longnames[arch->longnames_size] = 0;
689     }
690
691   return 0;
692 }
693
694 /* Open and setup a nested archive, if not already open.  */
695
696 int
697 setup_nested_archive (struct archive_info *nested_arch,
698                       const char *member_file_name)
699 {
700   FILE * member_file;
701
702   /* Have we already setup this archive?  */
703   if (nested_arch->file_name != NULL
704       && streq (nested_arch->file_name, member_file_name))
705     return 0;
706
707   /* Close previous file and discard cached information.  */
708   if (nested_arch->file != NULL)
709     fclose (nested_arch->file);
710   release_archive (nested_arch);
711
712   member_file = fopen (member_file_name, "rb");
713   if (member_file == NULL)
714     return 1;
715   return setup_archive (nested_arch, member_file_name, member_file,
716                         FALSE, FALSE);
717 }
718
719 /* Release the memory used for the archive information.  */
720
721 void
722 release_archive (struct archive_info * arch)
723 {
724   if (arch->file_name != NULL)
725     free (arch->file_name);
726   if (arch->index_array != NULL)
727     free (arch->index_array);
728   if (arch->sym_table != NULL)
729     free (arch->sym_table);
730   if (arch->longnames != NULL)
731     free (arch->longnames);
732 }
733
734 /* Get the name of an archive member from the current archive header.
735    For simple names, this will modify the ar_name field of the current
736    archive header.  For long names, it will return a pointer to the
737    longnames table.  For nested archives, it will open the nested archive
738    and get the name recursively.  NESTED_ARCH is a single-entry cache so
739    we don't keep rereading the same information from a nested archive.  */
740
741 char *
742 get_archive_member_name (struct archive_info *arch,
743                          struct archive_info *nested_arch)
744 {
745   unsigned long j, k;
746
747   if (arch->arhdr.ar_name[0] == '/')
748     {
749       /* We have a long name.  */
750       char *endp;
751       char *member_file_name;
752       char *member_name;
753
754       if (arch->longnames == NULL || arch->longnames_size == 0)
755         {
756           error (_("Archive member uses long names, but no longname table found\n"));
757           return NULL;
758         }
759       
760       arch->nested_member_origin = 0;
761       k = j = strtoul (arch->arhdr.ar_name + 1, &endp, 10);
762       if (arch->is_thin_archive && endp != NULL && * endp == ':')
763         arch->nested_member_origin = strtoul (endp + 1, NULL, 10);
764
765       if (j > arch->longnames_size)
766         {
767           error (_("Found long name index (%ld) beyond end of long name table\n"),j);
768           return NULL;
769         }
770       while ((j < arch->longnames_size)
771              && (arch->longnames[j] != '\n')
772              && (arch->longnames[j] != '\0'))
773         j++;
774       if (j > 0 && arch->longnames[j-1] == '/')
775         j--;
776       if (j > arch->longnames_size)
777         j = arch->longnames_size;
778       arch->longnames[j] = '\0';
779
780       if (!arch->is_thin_archive || arch->nested_member_origin == 0)
781         return arch->longnames + k;
782
783       /* PR 17531: file: 2896dc8b.  */
784       if (k >= j)
785         {
786           error (_("Invalid Thin archive member name\n"));
787           return NULL;
788         }
789  
790       /* This is a proxy for a member of a nested archive.
791          Find the name of the member in that archive.  */
792       member_file_name = adjust_relative_path (arch->file_name,
793                                                arch->longnames + k, j - k);
794       if (member_file_name != NULL
795           && setup_nested_archive (nested_arch, member_file_name) == 0)
796         {
797           member_name = get_archive_member_name_at (nested_arch,
798                                                     arch->nested_member_origin,
799                                                     NULL);
800           if (member_name != NULL)
801             {
802               free (member_file_name);
803               return member_name;
804             }
805         }
806       free (member_file_name);
807
808       /* Last resort: just return the name of the nested archive.  */
809       return arch->longnames + k;
810     }
811
812   /* We have a normal (short) name.  */
813   for (j = 0; j < sizeof (arch->arhdr.ar_name); j++)
814     if (arch->arhdr.ar_name[j] == '/')
815       {
816         arch->arhdr.ar_name[j] = '\0';
817         return arch->arhdr.ar_name;
818       }
819
820   /* The full ar_name field is used.  Don't rely on ar_date starting
821      with a zero byte.  */
822   {
823     char *name = xmalloc (sizeof (arch->arhdr.ar_name) + 1);
824     memcpy (name, arch->arhdr.ar_name, sizeof (arch->arhdr.ar_name));
825     name[sizeof (arch->arhdr.ar_name)] = '\0';
826     return name;
827   }
828 }
829
830 /* Get the name of an archive member at a given OFFSET within an archive
831    ARCH.  */
832
833 char *
834 get_archive_member_name_at (struct archive_info *arch,
835                             unsigned long offset,
836                             struct archive_info *nested_arch)
837 {
838   size_t got;
839
840   if (fseek (arch->file, offset, SEEK_SET) != 0)
841     {
842       error (_("%s: failed to seek to next file name\n"), arch->file_name);
843       return NULL;
844     }
845   got = fread (&arch->arhdr, 1, sizeof arch->arhdr, arch->file);
846   if (got != sizeof arch->arhdr)
847     {
848       error (_("%s: failed to read archive header\n"), arch->file_name);
849       return NULL;
850     }
851   if (memcmp (arch->arhdr.ar_fmag, ARFMAG, 2) != 0)
852     {
853       error (_("%s: did not find a valid archive header\n"),
854              arch->file_name);
855       return NULL;
856     }
857
858   return get_archive_member_name (arch, nested_arch);
859 }
860
861 /* Construct a string showing the name of the archive member, qualified
862    with the name of the containing archive file.  For thin archives, we
863    use square brackets to denote the indirection.  For nested archives,
864    we show the qualified name of the external member inside the square
865    brackets (e.g., "thin.a[normal.a(foo.o)]").  */
866
867 char *
868 make_qualified_name (struct archive_info * arch,
869                      struct archive_info * nested_arch,
870                      const char *member_name)
871 {
872   const char * error_name = _("<corrupt>");
873   size_t len;
874   char * name;
875
876   len = strlen (arch->file_name) + strlen (member_name) + 3;
877   if (arch->is_thin_archive
878       && arch->nested_member_origin != 0)
879     {
880       /* PR 15140: Allow for corrupt thin archives.  */
881       if (nested_arch->file_name)
882         len += strlen (nested_arch->file_name) + 2;
883       else
884         len += strlen (error_name) + 2;
885     }
886
887   name = (char *) malloc (len);
888   if (name == NULL)
889     {
890       error (_("Out of memory\n"));
891       return NULL;
892     }
893
894   if (arch->is_thin_archive
895       && arch->nested_member_origin != 0)
896     {
897       if (nested_arch->file_name)
898         snprintf (name, len, "%s[%s(%s)]", arch->file_name,
899                   nested_arch->file_name, member_name);
900       else
901         snprintf (name, len, "%s[%s(%s)]", arch->file_name,
902                   error_name, member_name);     
903     }
904   else if (arch->is_thin_archive)
905     snprintf (name, len, "%s[%s]", arch->file_name, member_name);
906   else
907     snprintf (name, len, "%s(%s)", arch->file_name, member_name);
908
909   return name;
910 }