summaryrefslogtreecommitdiff
path: root/bfd/archive.c
diff options
context:
space:
mode:
authorNick Clifton <nickc@redhat.com>2013-02-15 15:53:42 +0000
committerNick Clifton <nickc@redhat.com>2013-02-15 15:53:42 +0000
commit370835c70166d9d61b1c2e77b6f5725651057c3b (patch)
tree12756509013c02613167969738a1cef61e3ec7ca /bfd/archive.c
parent03162e5fe0e190d0f86057121311eca16222014d (diff)
downloadbinutils-redhat-370835c70166d9d61b1c2e77b6f5725651057c3b.tar.gz
Allow for some recursion when scanning archives.
Diffstat (limited to 'bfd/archive.c')
-rw-r--r--bfd/archive.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/bfd/archive.c b/bfd/archive.c
index 4b6a81cb0f..7df5c5443a 100644
--- a/bfd/archive.c
+++ b/bfd/archive.c
@@ -618,6 +618,7 @@ 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;
@@ -625,12 +626,17 @@ _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 inifnite recursion scanning a malformed nested archive. */
+ /* PR15140: Prevent an infinite recursion scanning a malformed nested archive. */
if (filepos == prev_filepos)
{
- bfd_set_error (bfd_error_malformed_archive);
- return NULL;
+ 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;