* compress.c (decompress_contents): Style.
authorAlan Modra <amodra@gmail.com>
Fri, 24 Dec 2010 10:40:19 +0000 (10:40 +0000)
committerAlan Modra <amodra@gmail.com>
Fri, 24 Dec 2010 10:40:19 +0000 (10:40 +0000)
(bfd_get_full_section_contents): Do not decompress directly into
caller buffer or directly return cached section contents.
Check malloc return for compressed_buffer.

bfd/ChangeLog
bfd/compress.c

index 7b8ca30d2cd83fb3758683c1721199f38ae4251e..bf39613717c9675af0ddfd092f297701ac9d0320 100644 (file)
@@ -1,3 +1,10 @@
+2010-12-24  Alan Modra  <amodra@gmail.com>
+
+       * compress.c (decompress_contents): Style.
+       (bfd_get_full_section_contents): Do not decompress directly into
+       caller buffer or directly return cached section contents.
+       Check malloc return for compressed_buffer.
+
 2010-12-21  Kai Tietz  <kai.tietz@onevision.com>
 
        * peXXigen.c (_bfd_XXi_final_link_postscript): Use
index bdaa3c475107111e2c6514da7d41e6be38fb6593..a526ea99c79822c171edce34106c27c354006a7f 100644 (file)
@@ -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
 
@@ -157,8 +157,8 @@ bfd_get_full_section_contents (bfd *abfd, sec_ptr sec, bfd_byte **ptr)
 {
   bfd_size_type sz = sec->rawsize ? sec->rawsize : sec->size;
   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;
@@ -177,88 +177,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 ();
+    }
 }
 
 /*