Add checks for memory access violations exposed by fuzzed archives.
[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         {
515           error (_("%s: the archive index is supposed to have %ld entries of %d bytes, but the size is only %ld\n"),
516                  arch->file_name, (long) arch->index_num, sizeof_ar_index, size);
517           return FALSE;
518         }
519
520       /* Read in the archive index.  */
521       index_buffer = (unsigned char *)
522         malloc (arch->index_num * sizeof_ar_index);
523       if (index_buffer == NULL)
524         {
525           error (_("Out of memory whilst trying to read archive symbol index\n"));
526           return FALSE;
527         }
528
529       got = fread (index_buffer, sizeof_ar_index, arch->index_num, arch->file);
530       if (got != arch->index_num)
531         {
532           free (index_buffer);
533           error (_("%s: failed to read archive index\n"), arch->file_name);
534           return FALSE;
535         }
536
537       size -= arch->index_num * sizeof_ar_index;
538
539       /* Convert the index numbers into the host's numeric format.  */
540       arch->index_array = (elf_vma *)
541         malloc (arch->index_num * sizeof (* arch->index_array));
542       if (arch->index_array == NULL)
543         {
544           free (index_buffer);
545           error (_("Out of memory whilst trying to convert the archive symbol index\n"));
546           return FALSE;
547         }
548
549       for (i = 0; i < arch->index_num; i++)
550         arch->index_array[i] =
551           byte_get_big_endian ((unsigned char *) (index_buffer + (i * sizeof_ar_index)),
552                                sizeof_ar_index);
553       free (index_buffer);
554
555       /* The remaining space in the header is taken up by the symbol table.  */
556       if (size < 1)
557         {
558           error (_("%s: the archive has an index but no symbols\n"),
559                  arch->file_name);
560           return FALSE;
561         }
562
563       arch->sym_table = (char *) malloc (size);
564       if (arch->sym_table == NULL)
565         {
566           error (_("Out of memory whilst trying to read archive index symbol table\n"));
567           return FALSE;
568         }
569
570       arch->sym_size = size;
571       got = fread (arch->sym_table, 1, size, arch->file);
572       if (got != size)
573         {
574           error (_("%s: failed to read archive index symbol table\n"),
575                  arch->file_name);
576           return FALSE;
577         }
578     }
579
580   /* Read the next archive header.  */
581   got = fread (&arch->arhdr, 1, sizeof arch->arhdr, arch->file);
582   if (got != sizeof arch->arhdr && got != 0)
583     {
584       error (_("%s: failed to read archive header following archive index\n"),
585              arch->file_name);
586       return FALSE;
587     }
588
589   return TRUE;
590 }
591
592 /* Read the symbol table and long-name table from an archive.  */
593
594 int
595 setup_archive (struct archive_info *arch, const char *file_name,
596                FILE *file, bfd_boolean is_thin_archive,
597                bfd_boolean read_symbols)
598 {
599   size_t got;
600
601   arch->file_name = strdup (file_name);
602   arch->file = file;
603   arch->index_num = 0;
604   arch->index_array = NULL;
605   arch->sym_table = NULL;
606   arch->sym_size = 0;
607   arch->longnames = NULL;
608   arch->longnames_size = 0;
609   arch->nested_member_origin = 0;
610   arch->is_thin_archive = is_thin_archive;
611   arch->uses_64bit_indicies = FALSE;
612   arch->next_arhdr_offset = SARMAG;
613
614   /* Read the first archive member header.  */
615   if (fseek (file, SARMAG, SEEK_SET) != 0)
616     {
617       error (_("%s: failed to seek to first archive header\n"), file_name);
618       return 1;
619     }
620   got = fread (&arch->arhdr, 1, sizeof arch->arhdr, file);
621   if (got != sizeof arch->arhdr)
622     {
623       if (got == 0)
624         return 0;
625
626       error (_("%s: failed to read archive header\n"), file_name);
627       return 1;
628     }
629
630   /* See if this is the archive symbol table.  */
631   if (const_strneq (arch->arhdr.ar_name, "/               "))
632     {
633       if (! process_archive_index_and_symbols (arch, 4, read_symbols))
634         return 1;
635     }
636   else if (const_strneq (arch->arhdr.ar_name, "/SYM64/         "))
637     {
638       arch->uses_64bit_indicies = TRUE;
639       if (! process_archive_index_and_symbols (arch, 8, read_symbols))
640         return 1;
641     }
642   else if (read_symbols)
643     printf (_("%s has no archive index\n"), file_name);
644
645   if (const_strneq (arch->arhdr.ar_name, "//              "))
646     {
647       /* This is the archive string table holding long member names.  */
648       arch->longnames_size = strtoul (arch->arhdr.ar_size, NULL, 10);
649       /* PR 17531: file: 01068045.  */
650       if (arch->longnames_size < 8)
651         {
652           error (_("%s: long name table is too small, (size = %ld)\n"),
653                  file_name, arch->longnames_size);
654           return 1;
655         }
656       arch->next_arhdr_offset += sizeof arch->arhdr + arch->longnames_size;
657
658       /* Plus one to allow for a string terminator.  */
659       arch->longnames = (char *) malloc (arch->longnames_size + 1);
660       if (arch->longnames == NULL)
661         {
662           error (_("Out of memory reading long symbol names in archive\n"));
663           return 1;
664         }
665
666       if (fread (arch->longnames, arch->longnames_size, 1, file) != 1)
667         {
668           free (arch->longnames);
669           arch->longnames = NULL;
670           error (_("%s: failed to read long symbol name string table\n"),
671                  file_name);
672           return 1;
673         }
674
675       if ((arch->longnames_size & 1) != 0)
676         getc (file);
677     }
678
679   return 0;
680 }
681
682 /* Open and setup a nested archive, if not already open.  */
683
684 int
685 setup_nested_archive (struct archive_info *nested_arch,
686                       const char *member_file_name)
687 {
688   FILE * member_file;
689
690   /* Have we already setup this archive?  */
691   if (nested_arch->file_name != NULL
692       && streq (nested_arch->file_name, member_file_name))
693     return 0;
694
695   /* Close previous file and discard cached information.  */
696   if (nested_arch->file != NULL)
697     fclose (nested_arch->file);
698   release_archive (nested_arch);
699
700   member_file = fopen (member_file_name, "rb");
701   if (member_file == NULL)
702     return 1;
703   return setup_archive (nested_arch, member_file_name, member_file,
704                         FALSE, FALSE);
705 }
706
707 /* Release the memory used for the archive information.  */
708
709 void
710 release_archive (struct archive_info * arch)
711 {
712   if (arch->file_name != NULL)
713     free (arch->file_name);
714   if (arch->index_array != NULL)
715     free (arch->index_array);
716   if (arch->sym_table != NULL)
717     free (arch->sym_table);
718   if (arch->longnames != NULL)
719     free (arch->longnames);
720 }
721
722 /* Get the name of an archive member from the current archive header.
723    For simple names, this will modify the ar_name field of the current
724    archive header.  For long names, it will return a pointer to the
725    longnames table.  For nested archives, it will open the nested archive
726    and get the name recursively.  NESTED_ARCH is a single-entry cache so
727    we don't keep rereading the same information from a nested archive.  */
728
729 char *
730 get_archive_member_name (struct archive_info *arch,
731                          struct archive_info *nested_arch)
732 {
733   unsigned long j, k;
734
735   if (arch->arhdr.ar_name[0] == '/')
736     {
737       /* We have a long name.  */
738       char *endp;
739       char *member_file_name;
740       char *member_name;
741
742       if (arch->longnames == NULL || arch->longnames_size == 0)
743         {
744           error (_("Archive member uses long names, but no longname table found\n"));
745           return NULL;
746         }
747       
748       arch->nested_member_origin = 0;
749       k = j = strtoul (arch->arhdr.ar_name + 1, &endp, 10);
750       if (arch->is_thin_archive && endp != NULL && * endp == ':')
751         arch->nested_member_origin = strtoul (endp + 1, NULL, 10);
752
753       if (j > arch->longnames_size)
754         {
755           error (_("Found long name index (%ld) beyond end of long name table\n"),j);
756           return NULL;
757         }
758       while ((j < arch->longnames_size)
759              && (arch->longnames[j] != '\n')
760              && (arch->longnames[j] != '\0'))
761         j++;
762       if (j > 0 && arch->longnames[j-1] == '/')
763         j--;
764       if (j > arch->longnames_size)
765         j = arch->longnames_size;
766       arch->longnames[j] = '\0';
767
768       if (!arch->is_thin_archive || arch->nested_member_origin == 0)
769         return arch->longnames + k;
770
771       /* PR 17531: file: 2896dc8b.  */
772       if (k >= j)
773         {
774           error (_("Invalid Thin archive member name\n"));
775           return NULL;
776         }
777  
778       /* This is a proxy for a member of a nested archive.
779          Find the name of the member in that archive.  */
780       member_file_name = adjust_relative_path (arch->file_name,
781                                                arch->longnames + k, j - k);
782       if (member_file_name != NULL
783           && setup_nested_archive (nested_arch, member_file_name) == 0)
784         {
785           member_name = get_archive_member_name_at (nested_arch,
786                                                     arch->nested_member_origin,
787                                                     NULL);
788           if (member_name != NULL)
789             {
790               free (member_file_name);
791               return member_name;
792             }
793         }
794       free (member_file_name);
795
796       /* Last resort: just return the name of the nested archive.  */
797       return arch->longnames + k;
798     }
799
800   /* We have a normal (short) name.  */
801   for (j = 0; j < sizeof (arch->arhdr.ar_name); j++)
802     if (arch->arhdr.ar_name[j] == '/')
803       {
804         arch->arhdr.ar_name[j] = '\0';
805         return arch->arhdr.ar_name;
806       }
807
808   /* The full ar_name field is used.  Don't rely on ar_date starting
809      with a zero byte.  */
810   {
811     char *name = xmalloc (sizeof (arch->arhdr.ar_name) + 1);
812     memcpy (name, arch->arhdr.ar_name, sizeof (arch->arhdr.ar_name));
813     name[sizeof (arch->arhdr.ar_name)] = '\0';
814     return name;
815   }
816 }
817
818 /* Get the name of an archive member at a given OFFSET within an archive
819    ARCH.  */
820
821 char *
822 get_archive_member_name_at (struct archive_info *arch,
823                             unsigned long offset,
824                             struct archive_info *nested_arch)
825 {
826   size_t got;
827
828   if (fseek (arch->file, offset, SEEK_SET) != 0)
829     {
830       error (_("%s: failed to seek to next file name\n"), arch->file_name);
831       return NULL;
832     }
833   got = fread (&arch->arhdr, 1, sizeof arch->arhdr, arch->file);
834   if (got != sizeof arch->arhdr)
835     {
836       error (_("%s: failed to read archive header\n"), arch->file_name);
837       return NULL;
838     }
839   if (memcmp (arch->arhdr.ar_fmag, ARFMAG, 2) != 0)
840     {
841       error (_("%s: did not find a valid archive header\n"),
842              arch->file_name);
843       return NULL;
844     }
845
846   return get_archive_member_name (arch, nested_arch);
847 }
848
849 /* Construct a string showing the name of the archive member, qualified
850    with the name of the containing archive file.  For thin archives, we
851    use square brackets to denote the indirection.  For nested archives,
852    we show the qualified name of the external member inside the square
853    brackets (e.g., "thin.a[normal.a(foo.o)]").  */
854
855 char *
856 make_qualified_name (struct archive_info * arch,
857                      struct archive_info * nested_arch,
858                      const char *member_name)
859 {
860   const char * error_name = _("<corrupt>");
861   size_t len;
862   char * name;
863
864   len = strlen (arch->file_name) + strlen (member_name) + 3;
865   if (arch->is_thin_archive
866       && arch->nested_member_origin != 0)
867     {
868       /* PR 15140: Allow for corrupt thin archives.  */
869       if (nested_arch->file_name)
870         len += strlen (nested_arch->file_name) + 2;
871       else
872         len += strlen (error_name) + 2;
873     }
874
875   name = (char *) malloc (len);
876   if (name == NULL)
877     {
878       error (_("Out of memory\n"));
879       return NULL;
880     }
881
882   if (arch->is_thin_archive
883       && arch->nested_member_origin != 0)
884     {
885       if (nested_arch->file_name)
886         snprintf (name, len, "%s[%s(%s)]", arch->file_name,
887                   nested_arch->file_name, member_name);
888       else
889         snprintf (name, len, "%s[%s(%s)]", arch->file_name,
890                   error_name, member_name);     
891     }
892   else if (arch->is_thin_archive)
893     snprintf (name, len, "%s[%s]", arch->file_name, member_name);
894   else
895     snprintf (name, len, "%s(%s)", arch->file_name, member_name);
896
897   return name;
898 }