]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blobdiff - bfd/compress.c
When computing checksums, skip the contents of sections with the SHT_NOBITS type.
[thirdparty/binutils-gdb.git] / bfd / compress.c
index bdaa3c475107111e2c6514da7d41e6be38fb6593..a82a8bc9e3cb205ef6b881fc73b91ff1eda8709d 100644 (file)
@@ -1,5 +1,5 @@
 /* Compressed section support (intended for debug sections).
-   Copyright 2008, 2010
+   Copyright 2008, 2010, 2011
    Free Software Foundation, Inc.
 
    This file is part of BFD, the Binary File Descriptor library.
@@ -59,7 +59,7 @@ decompress_contents (bfd_byte *compressed_buffer,
       rc = inflateReset (&strm);
     }
   rc = inflateEnd (&strm);
-  return rc != Z_OK || strm.avail_out != 0 ? FALSE: TRUE;
+  return rc == Z_OK && strm.avail_out == 0;
 }
 #endif
 
@@ -100,6 +100,9 @@ bfd_compress_section_contents (bfd *abfd ATTRIBUTE_UNUSED,
   compressed_size = compressBound (uncompressed_size) + 12;
   compressed_buffer = (bfd_byte *) bfd_malloc (compressed_size);
 
+  if (compressed_buffer == NULL)
+    return FALSE;
+
   if (compress ((Bytef*) compressed_buffer + 12,
                &compressed_size,
                (const Bytef*) uncompressed_buffer,
@@ -155,10 +158,10 @@ DESCRIPTION
 bfd_boolean
 bfd_get_full_section_contents (bfd *abfd, sec_ptr sec, bfd_byte **ptr)
 {
-  bfd_size_type sz = sec->rawsize ? sec->rawsize : sec->size;
+  bfd_size_type sz;
   bfd_byte *p = *ptr;
-  bfd_boolean need_free, ret;
 #ifdef HAVE_ZLIB_H
+  bfd_boolean ret;
   bfd_size_type compressed_size;
   bfd_size_type uncompressed_size;
   bfd_size_type rawsize;
@@ -166,6 +169,10 @@ bfd_get_full_section_contents (bfd *abfd, sec_ptr sec, bfd_byte **ptr)
   bfd_byte *uncompressed_buffer;
 #endif
 
+  if (abfd->direction != write_direction && sec->rawsize != 0)
+    sz = sec->rawsize;
+  else
+    sz = sec->size;
   if (sz == 0)
     return TRUE;
 
@@ -177,88 +184,77 @@ bfd_get_full_section_contents (bfd *abfd, sec_ptr sec, bfd_byte **ptr)
          p = (bfd_byte *) bfd_malloc (sz);
          if (p == NULL)
            return FALSE;
-         need_free = TRUE;
-         *ptr = p;
        }
-      else
-       need_free = FALSE;
-      ret = bfd_get_section_contents (abfd, sec, p, 0, sz);
-      if (!ret && need_free)
-       free (p);
-      return ret;
-
-    case COMPRESS_SECTION_DONE:
-      if (p)
-       memcpy (p, sec->contents, sz);
-      else
-       *ptr = sec->contents;
+      if (!bfd_get_section_contents (abfd, sec, p, 0, sz))
+       {
+         if (*ptr != p)
+           free (p);
+         return FALSE;
+       }
+      *ptr = p;
       return TRUE;
 
     case DECOMPRESS_SECTION_SIZED:
-      break;
-
-    default:
-      abort ();
-    }
-
 #ifndef HAVE_ZLIB_H
-  bfd_set_error (bfd_error_invalid_operation);
-  return FALSE;
+      bfd_set_error (bfd_error_invalid_operation);
+      return FALSE;
 #else
-  /* Read in the full compressed section contents.  */
-  uncompressed_size = sec->size;
-  compressed_size = sec->compressed_size;
-  compressed_buffer = (bfd_byte *) bfd_malloc (compressed_size);
-  rawsize = sec->rawsize;
-  /* Clear rawsize, set size to compressed size and set compress_status
-     to COMPRESS_SECTION_NONE.  If the compressed size is bigger than
-     the uncompressed size, bfd_get_section_contents will fail.  */
-  sec->rawsize = 0;
-  sec->size = compressed_size;
-  sec->compress_status = COMPRESS_SECTION_NONE;
-  ret = bfd_get_section_contents (abfd, sec, compressed_buffer,
-                                 0, compressed_size);
-  /* Restore rawsize and size.  */
-  sec->rawsize = rawsize;
-  sec->size = uncompressed_size;
-  if (!ret)
-    {
-fail_compressed:
+      /* Read in the full compressed section contents.  */
+      uncompressed_size = sec->size;
+      compressed_size = sec->compressed_size;
+      compressed_buffer = (bfd_byte *) bfd_malloc (compressed_size);
+      if (compressed_buffer == NULL)
+       return FALSE;
+      rawsize = sec->rawsize;
+      /* Clear rawsize, set size to compressed size and set compress_status
+        to COMPRESS_SECTION_NONE.  If the compressed size is bigger than
+        the uncompressed size, bfd_get_section_contents will fail.  */
+      sec->rawsize = 0;
+      sec->size = compressed_size;
+      sec->compress_status = COMPRESS_SECTION_NONE;
+      ret = bfd_get_section_contents (abfd, sec, compressed_buffer,
+                                     0, compressed_size);
+      /* Restore rawsize and size.  */
+      sec->rawsize = rawsize;
+      sec->size = uncompressed_size;
       sec->compress_status = DECOMPRESS_SECTION_SIZED;
-      free (compressed_buffer);
-      return ret;
-    }
+      if (!ret)
+       goto fail_compressed;
 
-  /* Decompress to caller buffer directly if it is provided. */
-  if (p)
-    uncompressed_buffer = p;
-  else
-    {
       uncompressed_buffer = (bfd_byte *) bfd_malloc (uncompressed_size);
       if (uncompressed_buffer == NULL)
        goto fail_compressed;
-    }
 
-  if (!decompress_contents (compressed_buffer, compressed_size,
-                           uncompressed_buffer, uncompressed_size))
-    {
-      sec->compress_status = DECOMPRESS_SECTION_SIZED;
-      free (compressed_buffer);
-      if (p == NULL)
-       free (uncompressed_buffer);
-      bfd_set_error (bfd_error_bad_value);
-      return FALSE;
-    }
+      if (!decompress_contents (compressed_buffer, compressed_size,
+                               uncompressed_buffer, uncompressed_size))
+       {
+         bfd_set_error (bfd_error_bad_value);
+         free (uncompressed_buffer);
+       fail_compressed:
+         free (compressed_buffer);
+         return FALSE;
+       }
 
-  free (compressed_buffer);
-  if (p == NULL)
-    *ptr = uncompressed_buffer;
+      free (compressed_buffer);
+      sec->contents = uncompressed_buffer;
+      sec->compress_status = COMPRESS_SECTION_DONE;
+      /* Fall thru */
+#endif
 
-  sec->contents = uncompressed_buffer;
-  sec->compress_status = COMPRESS_SECTION_DONE;
+    case COMPRESS_SECTION_DONE:
+      if (p == NULL)
+       {
+         p = (bfd_byte *) bfd_malloc (sz);
+         if (p == NULL)
+           return FALSE;
+         *ptr = p;
+       }
+      memcpy (p, sec->contents, sz);
+      return TRUE;
 
-  return TRUE;
-#endif
+    default:
+      abort ();
+    }
 }
 
 /*