* section.c (bfd_get_section_contents): Detect and handle the case
authorNick Clifton <nickc@redhat.com>
Fri, 27 Mar 2009 11:38:30 +0000 (11:38 +0000)
committerNick Clifton <nickc@redhat.com>
Fri, 27 Mar 2009 11:38:30 +0000 (11:38 +0000)
        where a section has the SEC_IN_MEMORY flag set but no actual
        contents allocated.

bfd/ChangeLog
bfd/section.c

index 11a0acbbf83b2bdfdec1fb9b900b18771aa23171..1fcef7b29abc2511d800c7516bebd9a127f9ef05 100644 (file)
@@ -1,3 +1,9 @@
+2009-03-27  Nick Clifton  <nickc@redhat.com>
+
+       * section.c (bfd_get_section_contents): Detect and handle the case
+       where a section has the SEC_IN_MEMORY flag set but no actual
+       contents allocated.
+
 2009-03-26  Alan Modra  <amodra@bigpond.net.au>
 
        PR 6494
index 5a335a62909ad67754c3d6c6763302b5bf2f01a2..dc8225f39d3329997b32dba497ef54c086078ef9 100644 (file)
@@ -1436,6 +1436,16 @@ bfd_get_section_contents (bfd *abfd,
 
   if ((section->flags & SEC_IN_MEMORY) != 0)
     {
+      if (section->contents == NULL)
+       {
+         /* This can happen because of errors earlier on in the linking process.
+            We do not want to seg-fault here, so clear the flag and return an
+            error code.  */
+         section->flags &= ~ SEC_IN_MEMORY;
+         bfd_set_error (bfd_error_invalid_operation);
+         return FALSE;
+       }
+      
       memcpy (location, section->contents + offset, (size_t) count);
       return TRUE;
     }