* archive.c (_bfd_generic_read_ar_hdr_mag): Simplify end-of-name test.

This commit is contained in:
Richard Henderson 1998-04-21 07:15:33 +00:00
parent 515125b709
commit a56e73eda4

View file

@ -1,5 +1,6 @@
/* BFD back-end for archive files (libraries).
Copyright 1990, 91, 92, 93, 94, 95, 1996 Free Software Foundation, Inc.
Copyright 1990, 91, 92, 93, 94, 95, 96, 97, 1998
Free Software Foundation, Inc.
Written by Cygnus Support. Mostly Gumby Henkel-Wallace's fault.
This file is part of BFD, the Binary File Descriptor library.
@ -142,12 +143,9 @@ extern int errno;
#define BFD_GNU960_ARMAG(abfd) (BFD_COFF_FILE_P((abfd)) ? ARMAG : ARMAGB)
#endif
/* Can't define this in hosts/foo.h, because (e.g. in gprof) the hosts file
is included, then obstack.h, which thinks if offsetof is defined, it
doesn't need to include stddef.h. */
/* Define offsetof for those systems which lack it */
#if !defined (offsetof)
#ifndef offsetof
#define offsetof(TYPE, MEMBER) ((unsigned long) &((TYPE *)0)->MEMBER)
#endif
@ -415,8 +413,10 @@ _bfd_generic_read_ar_hdr_mag (abfd, mag)
}
/* BSD4.4-style long filename.
Only implemented for reading, so far! */
else if (hdr.ar_name[0] == '#' && hdr.ar_name[1] == '1'
&& hdr.ar_name[2] == '/' && isdigit (hdr.ar_name[3]))
else if (hdr.ar_name[0] == '#'
&& hdr.ar_name[1] == '1'
&& hdr.ar_name[2] == '/'
&& isdigit ((unsigned char) hdr.ar_name[3]))
{
/* BSD-4.4 extended name */
namelen = atoi (&hdr.ar_name[3]);
@ -443,21 +443,21 @@ _bfd_generic_read_ar_hdr_mag (abfd, mag)
Note: The SYSV format (terminated by '/') allows embedded
spaces, so only look for ' ' if we don't find '/'. */
namelen = 0;
while (hdr.ar_name[namelen] != '\0' &&
hdr.ar_name[namelen] != '/')
char *e;
e = memchr(hdr.ar_name, '\0', ar_maxnamelen (abfd));
if (e == NULL)
{
namelen++;
if (namelen == (unsigned) ar_maxnamelen (abfd))
{
namelen = 0;
while (hdr.ar_name[namelen] != ' '
&& namelen < (unsigned) ar_maxnamelen (abfd))
namelen++;
break;
}
e = memchr(hdr.ar_name, '/', ar_maxnamelen (abfd));
if (e == NULL)
e = memchr(hdr.ar_name, ' ', ar_maxnamelen (abfd));
}
if (e == NULL)
{
bfd_set_error (bfd_error_malformed_archive);
return NULL;
}
namelen = e - hdr.ar_name;
allocsize += namelen + 1;
}
@ -646,6 +646,8 @@ bfd_generic_archive_p (abfd)
{
bfd_release (abfd, bfd_ardata (abfd));
abfd->tdata.aout_ar_data = tdata_hold;
if (bfd_get_error () != bfd_error_system_call)
bfd_set_error (bfd_error_wrong_format);
return NULL;
}
@ -653,6 +655,8 @@ bfd_generic_archive_p (abfd)
{
bfd_release (abfd, bfd_ardata (abfd));
abfd->tdata.aout_ar_data = tdata_hold;
if (bfd_get_error () != bfd_error_system_call)
bfd_set_error (bfd_error_wrong_format);
return NULL;
}
@ -780,7 +784,7 @@ do_slurp_bsd_armap (abfd)
ardata->first_file_filepos += (ardata->first_file_filepos) % 2;
/* FIXME, we should provide some way to free raw_ardata when
we are done using the strings from it. For now, it seems
to be allocated on an obstack anyway... */
to be allocated on an objalloc anyway... */
bfd_has_map (abfd) = true;
return true;
}
@ -826,7 +830,9 @@ do_slurp_coff_armap (abfd)
little, because our tools changed. Here's a horrible hack to clean
up the crap. */
if (stringsize > 0xfffff)
if (stringsize > 0xfffff
&& bfd_get_arch (abfd) == bfd_arch_i960
&& bfd_get_flavour (abfd) == bfd_target_coff_flavour)
{
/* This looks dangerous, let's do it the other way around */
nsymz = bfd_getl32 ((PTR) int_buf);
@ -1040,7 +1046,7 @@ bfd_slurp_bsd_armap_f2 (abfd)
ardata->first_file_filepos += (ardata->first_file_filepos) % 2;
/* FIXME, we should provide some way to free raw_ardata when
we are done using the strings from it. For now, it seems
to be allocated on an obstack anyway... */
to be allocated on an objalloc anyway... */
bfd_has_map (abfd) = true;
return true;
}
@ -1123,7 +1129,7 @@ _bfd_slurp_extended_name_table (abfd)
(bfd_ardata (abfd)->first_file_filepos) % 2;
/* FIXME, we can't release namedata here because it was allocated
below extended_names on the obstack... */
below extended_names on the objalloc... */
/* bfd_release (abfd, namedata); */
}
return true;
@ -1391,10 +1397,12 @@ bfd_ar_hdr_from_filesystem (abfd, filename)
a strong stomach to write this, and it does, but it takes even a
stronger stomach to try to code around such a thing! */
struct ar_hdr *bfd_special_undocumented_glue PARAMS ((bfd *, const char *));
struct ar_hdr *
bfd_special_undocumented_glue (abfd, filename)
bfd *abfd;
char *filename;
const char *filename;
{
struct areltdata *ar_elt = bfd_ar_hdr_from_filesystem (abfd, filename);
if (ar_elt == NULL)
@ -1726,7 +1734,7 @@ _bfd_compute_and_write_armap (arch, elength)
if (map == NULL)
goto error_return;
/* We put the symbol names on the arch obstack, and then discard
/* We put the symbol names on the arch objalloc, and then discard
them when done. */
first_name = bfd_alloc (arch, 1);
if (first_name == NULL)
@ -1879,8 +1887,13 @@ bsd_write_armap (arch, elength, map, orl_count, stridx)
bfd_ardata (arch)->armap_datepos = (SARMAG
+ offsetof (struct ar_hdr, ar_date[0]));
sprintf (hdr.ar_date, "%ld", bfd_ardata (arch)->armap_timestamp);
#ifndef _WIN32
sprintf (hdr.ar_uid, "%ld", (long) getuid ());
sprintf (hdr.ar_gid, "%ld", (long) getgid ());
#else
sprintf (hdr.ar_uid, "%ld", (long) 666);
sprintf (hdr.ar_gid, "%ld", (long) 42);
#endif
sprintf (hdr.ar_size, "%-10d", (int) mapsize);
strncpy (hdr.ar_fmag, ARFMAG, 2);
for (i = 0; i < sizeof (struct ar_hdr); i++)