aboutsummaryrefslogtreecommitdiff
path: root/bfd/archive64.c
diff options
context:
space:
mode:
authorNathan Sidwell <nathan@codesourcery.com>2010-06-23 10:21:16 +0000
committerNathan Sidwell <nathan@codesourcery.com>2010-06-23 10:21:16 +0000
commit61e8a5ea173059baf957e65885fbaa3613cc6076 (patch)
tree30d3f0edcd29ff5d368a5c32b37d0ff329022670 /bfd/archive64.c
parent38f6b338fd42e2c16c7e53eed49a80b10ac3692f (diff)
downloadgdb-61e8a5ea173059baf957e65885fbaa3613cc6076.zip
gdb-61e8a5ea173059baf957e65885fbaa3613cc6076.tar.gz
gdb-61e8a5ea173059baf957e65885fbaa3613cc6076.tar.bz2
* archive64.c (bfd_elf64_archive_write_armap): Fix buffer overrun
when scaning map.
Diffstat (limited to 'bfd/archive64.c')
-rw-r--r--bfd/archive64.c12
1 files changed, 6 insertions, 6 deletions
diff --git a/bfd/archive64.c b/bfd/archive64.c
index 067fbb9..bbc4c3f 100644
--- a/bfd/archive64.c
+++ b/bfd/archive64.c
@@ -194,27 +194,27 @@ bfd_elf64_archive_write_armap (bfd *arch,
/* Write out the file offset for the file associated with each
symbol, and remember to keep the offsets padded out. */
-
- current = arch->archive_head;
count = 0;
- while (current != NULL && count < symbol_count)
+ for (current = arch->archive_head;
+ current != NULL && count < symbol_count;
+ current = current->archive_next)
{
/* For each symbol which is used defined in this object, write out
the object file's address in the archive */
- while (map[count].u.abfd == current)
+ for (;
+ count < symbol_count && map[count].u.abfd == current;
+ count++)
{
bfd_putb64 ((bfd_vma) archive_member_file_ptr, buf);
if (bfd_bwrite (buf, 8, arch) != 8)
return FALSE;
- count++;
}
/* Add size of this archive entry */
archive_member_file_ptr += (arelt_size (current)
+ sizeof (struct ar_hdr));
/* remember about the even alignment */
archive_member_file_ptr += archive_member_file_ptr % 2;
- current = current->archive_next;
}
/* now write the strings themselves */