mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-19 17:18:24 +08:00
* 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.
This commit is contained in:
@ -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>
|
2010-12-21 Kai Tietz <kai.tietz@onevision.com>
|
||||||
|
|
||||||
* peXXigen.c (_bfd_XXi_final_link_postscript): Use
|
* peXXigen.c (_bfd_XXi_final_link_postscript): Use
|
||||||
|
141
bfd/compress.c
141
bfd/compress.c
@ -59,7 +59,7 @@ decompress_contents (bfd_byte *compressed_buffer,
|
|||||||
rc = inflateReset (&strm);
|
rc = inflateReset (&strm);
|
||||||
}
|
}
|
||||||
rc = inflateEnd (&strm);
|
rc = inflateEnd (&strm);
|
||||||
return rc != Z_OK || strm.avail_out != 0 ? FALSE: TRUE;
|
return rc == Z_OK && strm.avail_out == 0;
|
||||||
}
|
}
|
||||||
#endif
|
#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_size_type sz = sec->rawsize ? sec->rawsize : sec->size;
|
||||||
bfd_byte *p = *ptr;
|
bfd_byte *p = *ptr;
|
||||||
bfd_boolean need_free, ret;
|
|
||||||
#ifdef HAVE_ZLIB_H
|
#ifdef HAVE_ZLIB_H
|
||||||
|
bfd_boolean ret;
|
||||||
bfd_size_type compressed_size;
|
bfd_size_type compressed_size;
|
||||||
bfd_size_type uncompressed_size;
|
bfd_size_type uncompressed_size;
|
||||||
bfd_size_type rawsize;
|
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);
|
p = (bfd_byte *) bfd_malloc (sz);
|
||||||
if (p == NULL)
|
if (p == NULL)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
need_free = TRUE;
|
|
||||||
*ptr = p;
|
|
||||||
}
|
}
|
||||||
else
|
if (!bfd_get_section_contents (abfd, sec, p, 0, sz))
|
||||||
need_free = FALSE;
|
{
|
||||||
ret = bfd_get_section_contents (abfd, sec, p, 0, sz);
|
if (*ptr != p)
|
||||||
if (!ret && need_free)
|
free (p);
|
||||||
free (p);
|
return FALSE;
|
||||||
return ret;
|
}
|
||||||
|
*ptr = p;
|
||||||
case COMPRESS_SECTION_DONE:
|
|
||||||
if (p)
|
|
||||||
memcpy (p, sec->contents, sz);
|
|
||||||
else
|
|
||||||
*ptr = sec->contents;
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
case DECOMPRESS_SECTION_SIZED:
|
case DECOMPRESS_SECTION_SIZED:
|
||||||
break;
|
#ifndef HAVE_ZLIB_H
|
||||||
|
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);
|
||||||
|
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;
|
||||||
|
if (!ret)
|
||||||
|
goto fail_compressed;
|
||||||
|
|
||||||
|
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))
|
||||||
|
{
|
||||||
|
bfd_set_error (bfd_error_bad_value);
|
||||||
|
free (uncompressed_buffer);
|
||||||
|
fail_compressed:
|
||||||
|
free (compressed_buffer);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
free (compressed_buffer);
|
||||||
|
sec->contents = uncompressed_buffer;
|
||||||
|
sec->compress_status = COMPRESS_SECTION_DONE;
|
||||||
|
/* Fall thru */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
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;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
abort ();
|
abort ();
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef HAVE_ZLIB_H
|
|
||||||
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:
|
|
||||||
sec->compress_status = DECOMPRESS_SECTION_SIZED;
|
|
||||||
free (compressed_buffer);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 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;
|
|
||||||
}
|
|
||||||
|
|
||||||
free (compressed_buffer);
|
|
||||||
if (p == NULL)
|
|
||||||
*ptr = uncompressed_buffer;
|
|
||||||
|
|
||||||
sec->contents = uncompressed_buffer;
|
|
||||||
sec->compress_status = COMPRESS_SECTION_DONE;
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Reference in New Issue
Block a user