Don't allow a nested archive pointing to itself
authorH.J. Lu <hjl.tools@gmail.com>
Fri, 15 Feb 2013 18:26:06 +0000 (18:26 +0000)
committerH.J. Lu <hjl.tools@gmail.com>
Fri, 15 Feb 2013 18:26:06 +0000 (18:26 +0000)
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.

bfd/ChangeLog
bfd/archive.c

index b65b2348f5be3d0d82c3fd0a02b1224776d70ccc..72d12ef9563cc1186790ddef5a7e89263bce7000 100644 (file)
@@ -1,3 +1,10 @@
+2013-02-15  H.J. Lu  <hongjiu.lu@intel.com>
+
+       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.
+
 2013-02-15  Nick Clifton  <nickc@redhat.com>
 
        PR binutils/15140
index 7df5c5443a57601753ce017fb3932f04157f2b41..8cc6bf2a27ef904ceb7e6cef55008959b903bd19 100644 (file)
@@ -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))
     {