elfcomm.c revision 1.3
1/* elfcomm.c -- common code for ELF format file.
2   Copyright (C) 2010-2015 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
33void
34error (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
47void
48warn (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
61void (*byte_put) (unsigned char *, elf_vma, int);
62
63void
64byte_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
93void
94byte_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
128elf_vma (*byte_get) (unsigned char *, int);
129
130elf_vma
131byte_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
229elf_vma
230byte_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
335elf_vma
336byte_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
367void
368byte_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
387char *
388adjust_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
454static bfd_boolean
455process_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
596int
597setup_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
696int
697setup_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
721void
722release_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
741char *
742get_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
833char *
834get_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
867char *
868make_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}
911