summaryrefslogtreecommitdiff
path: root/bfd/archive.c
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2013-02-15 18:26:06 +0000
committerH.J. Lu <hjl.tools@gmail.com>2013-02-15 18:26:06 +0000
commit78f7a4ac9c4e3bb32dcac522cd5ac141facd6050 (patch)
tree716123a48413c0a5ff6f8e3fc658b836befe6034 /bfd/archive.c
parent467bdefdc19ad942bc501cdf144feed16276256e (diff)
downloadbinutils-redhat-78f7a4ac9c4e3bb32dcac522cd5ac141facd6050.tar.gz
Don't allow a nested archive pointing to itself
PR binutils/15151 * archive.c (_bfd_find_nested_archive): Don't allow a nested archive pointing to itself. (_bfd_get_elt_at_filepos): Revert the last 2 changes.
Diffstat (limited to 'bfd/archive.c')
-rw-r--r--bfd/archive.c21
1 files changed, 7 insertions, 14 deletions
diff --git a/bfd/archive.c b/bfd/archive.c
index 7df5c5443a..8cc6bf2a27 100644
--- a/bfd/archive.c
+++ b/bfd/archive.c
@@ -379,6 +379,13 @@ _bfd_find_nested_archive (bfd *arch_bfd, const char *filename)
bfd *abfd;
const char *target;
+ /* PR 15140: Don't allow a nested archive pointing to itself. */
+ if (filename_cmp (filename, arch_bfd->filename) == 0)
+ {
+ bfd_set_error (bfd_error_malformed_archive);
+ return NULL;
+ }
+
for (abfd = arch_bfd->nested_archives;
abfd != NULL;
abfd = abfd->archive_next)
@@ -617,8 +624,6 @@ _bfd_append_relative_path (bfd *arch, char *elt_name)
bfd *
_bfd_get_elt_at_filepos (bfd *archive, file_ptr filepos)
{
- static file_ptr prev_filepos;
- static unsigned int dup_filepos_count = 0;
struct areltdata *new_areldata;
bfd *n_nfd;
char *filename;
@@ -626,17 +631,6 @@ _bfd_get_elt_at_filepos (bfd *archive, file_ptr filepos)
n_nfd = _bfd_look_for_bfd_in_cache (archive, filepos);
if (n_nfd)
return n_nfd;
- /* PR15140: Prevent an infinite recursion scanning a malformed nested archive. */
- if (filepos == prev_filepos)
- {
- if (++ dup_filepos_count > 100)
- {
- bfd_set_error (bfd_error_malformed_archive);
- return NULL;
- }
- }
- else
- dup_filepos_count = 0;
if (0 > bfd_seek (archive, filepos, SEEK_SET))
return NULL;
@@ -645,7 +639,6 @@ _bfd_get_elt_at_filepos (bfd *archive, file_ptr filepos)
return NULL;
filename = new_areldata->filename;
- prev_filepos = filepos;
if (bfd_is_thin_archive (archive))
{