bfd_get_section_by_name_if hash chain traversal
authorAlan Modra <amodra@gmail.com>
Fri, 24 Jul 2015 05:06:38 +0000 (14:36 +0930)
committerAlan Modra <amodra@gmail.com>
Fri, 24 Jul 2015 05:18:35 +0000 (14:48 +0930)
This function stops too soon, as I found when the hash chain happened
to contain two .debug_macro sections and a .bss section:
.debug_macro -> .bss -> .debug_macro

* section.c (bfd_get_section_by_name_if): Iterate over entire hash
chain.

bfd/ChangeLog
bfd/section.c

index 9db32ed..6a29b7a 100644 (file)
@@ -1,3 +1,8 @@
+2015-07-24  Alan Modra  <amodra@gmail.com>
+
+       * section.c (bfd_get_section_by_name_if): Iterate over entire hash
+       chain.
+
 2015-07-23  Joseph Myers  <joseph@codesourcery.com>
 
        * elfxx-mips.c (_bfd_mips_elf_finish_dynamic_sections)
index 6af174a..aa652a4 100644 (file)
@@ -994,14 +994,11 @@ bfd_get_section_by_name_if (bfd *abfd, const char *name,
     return NULL;
 
   hash = sh->root.hash;
-  do
-    {
-      if ((*operation) (abfd, &sh->section, user_storage))
-       return &sh->section;
-      sh = (struct section_hash_entry *) sh->root.next;
-    }
-  while (sh != NULL && sh->root.hash == hash
-        && strcmp (sh->root.string, name) == 0);
+  for (; sh != NULL; sh = (struct section_hash_entry *) sh->root.next)
+    if (sh->root.hash == hash
+       && strcmp (sh->root.string, name) == 0
+       && (*operation) (abfd, &sh->section, user_storage))
+      return &sh->section;
 
   return NULL;
 }