Home | History | Annotate | Line # | Download | only in bfd
compress.c revision 1.1.1.11
      1 /* Compressed section support (intended for debug sections).
      2    Copyright (C) 2008-2024 Free Software Foundation, Inc.
      3 
      4    This file is part of BFD, the Binary File Descriptor library.
      5 
      6    This program is free software; you can redistribute it and/or modify
      7    it under the terms of the GNU General Public License as published by
      8    the Free Software Foundation; either version 3 of the License, or
      9    (at your option) any later version.
     10 
     11    This program is distributed in the hope that it will be useful,
     12    but WITHOUT ANY WARRANTY; without even the implied warranty of
     13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     14    GNU General Public License for more details.
     15 
     16    You should have received a copy of the GNU General Public License
     17    along with this program; if not, write to the Free Software
     18    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
     19    MA 02110-1301, USA.  */
     20 
     21 #include "sysdep.h"
     22 #include <zlib.h>
     23 #ifdef HAVE_ZSTD
     24 #include <zstd.h>
     25 #endif
     26 #include "bfd.h"
     27 #include "elf-bfd.h"
     28 #include "libbfd.h"
     29 #include "safe-ctype.h"
     30 #include "libiberty.h"
     31 
     32 #define MAX_COMPRESSION_HEADER_SIZE 24
     33 
     34 /*
     35 EXTERNAL
     36 .{* Types of compressed DWARF debug sections.  *}
     37 .enum compressed_debug_section_type
     38 .{
     39 .  COMPRESS_DEBUG_NONE = 0,
     40 .  COMPRESS_DEBUG_GNU_ZLIB = 1 << 1,
     41 .  COMPRESS_DEBUG_GABI_ZLIB = 1 << 2,
     42 .  COMPRESS_DEBUG_ZSTD = 1 << 3,
     43 .  COMPRESS_UNKNOWN = 1 << 4
     44 .};
     45 .
     46 .{* Tuple for compressed_debug_section_type and their name.  *}
     47 .struct compressed_type_tuple
     48 .{
     49 .  enum compressed_debug_section_type type;
     50 .  const char *name;
     51 .};
     52 .
     53 .{* Compression header ch_type values.  *}
     54 .enum compression_type
     55 .{
     56 .  ch_none = 0,
     57 .  ch_compress_zlib = 1	,	{* Compressed with zlib.  *}
     58 .  ch_compress_zstd = 2		{* Compressed with zstd (www.zstandard.org).  *}
     59 .};
     60 .
     61 .static inline char *
     62 .bfd_debug_name_to_zdebug (bfd *abfd, const char *name)
     63 .{
     64 .  size_t len = strlen (name);
     65 .  char *new_name = (char *) bfd_alloc (abfd, len + 2);
     66 .  if (new_name == NULL)
     67 .    return NULL;
     68 .  new_name[0] = '.';
     69 .  new_name[1] = 'z';
     70 .  memcpy (new_name + 2, name + 1, len);
     71 .  return new_name;
     72 .}
     73 .
     74 .static inline char *
     75 .bfd_zdebug_name_to_debug (bfd *abfd, const char *name)
     76 .{
     77 .  size_t len = strlen (name);
     78 .  char *new_name = (char *) bfd_alloc (abfd, len);
     79 .  if (new_name == NULL)
     80 .    return NULL;
     81 .  new_name[0] = '.';
     82 .  memcpy (new_name + 1, name + 2, len - 1);
     83 .  return new_name;
     84 .}
     85 .
     86 */
     87 
     88 /* Display texts for type of compressed DWARF debug sections.  */
     89 static const struct compressed_type_tuple compressed_debug_section_names[] =
     90 {
     91   { COMPRESS_DEBUG_NONE, "none" },
     92   { COMPRESS_DEBUG_GABI_ZLIB, "zlib" },
     93   { COMPRESS_DEBUG_GNU_ZLIB, "zlib-gnu" },
     94   { COMPRESS_DEBUG_GABI_ZLIB, "zlib-gabi" },
     95   { COMPRESS_DEBUG_ZSTD, "zstd" },
     96 };
     97 
     98 /*
     99 FUNCTION
    100 	bfd_get_compression_algorithm
    101 SYNOPSIS
    102 	enum compressed_debug_section_type
    103 	  bfd_get_compression_algorithm (const char *name);
    104 DESCRIPTION
    105 	Return compressed_debug_section_type from a string representation.
    106 */
    107 enum compressed_debug_section_type
    108 bfd_get_compression_algorithm (const char *name)
    109 {
    110   for (unsigned i = 0; i < ARRAY_SIZE (compressed_debug_section_names); ++i)
    111     if (strcasecmp (compressed_debug_section_names[i].name, name) == 0)
    112       return compressed_debug_section_names[i].type;
    113 
    114   return COMPRESS_UNKNOWN;
    115 }
    116 
    117 /*
    118 FUNCTION
    119 	bfd_get_compression_algorithm_name
    120 SYNOPSIS
    121 	const char *bfd_get_compression_algorithm_name
    122 	  (enum compressed_debug_section_type type);
    123 DESCRIPTION
    124 	Return compression algorithm name based on the type.
    125 */
    126 const char *
    127 bfd_get_compression_algorithm_name (enum compressed_debug_section_type type)
    128 {
    129   for (unsigned i = 0; i < ARRAY_SIZE (compressed_debug_section_names); ++i)
    130     if (type == compressed_debug_section_names[i].type)
    131       return compressed_debug_section_names[i].name;
    132 
    133   return NULL;
    134 }
    135 
    136 /*
    137 FUNCTION
    138 	bfd_update_compression_header
    139 
    140 SYNOPSIS
    141 	void bfd_update_compression_header
    142 	  (bfd *abfd, bfd_byte *contents, asection *sec);
    143 
    144 DESCRIPTION
    145 	Set the compression header at CONTENTS of SEC in ABFD and update
    146 	elf_section_flags for compression.
    147 */
    148 
    149 void
    150 bfd_update_compression_header (bfd *abfd, bfd_byte *contents,
    151 			       asection *sec)
    152 {
    153   if ((abfd->flags & BFD_COMPRESS) == 0)
    154     abort ();
    155 
    156   switch (bfd_get_flavour (abfd))
    157     {
    158     case bfd_target_elf_flavour:
    159       if ((abfd->flags & BFD_COMPRESS_GABI) != 0)
    160 	{
    161 	  const struct elf_backend_data *bed = get_elf_backend_data (abfd);
    162 	  struct bfd_elf_section_data * esd = elf_section_data (sec);
    163 	  enum compression_type ch_type = (abfd->flags & BFD_COMPRESS_ZSTD
    164 					   ? ch_compress_zstd
    165 					   : ch_compress_zlib);
    166 
    167 	  /* Set the SHF_COMPRESSED bit.  */
    168 	  elf_section_flags (sec) |= SHF_COMPRESSED;
    169 
    170 	  if (bed->s->elfclass == ELFCLASS32)
    171 	    {
    172 	      Elf32_External_Chdr *echdr = (Elf32_External_Chdr *) contents;
    173 	      bfd_put_32 (abfd, ch_type, &echdr->ch_type);
    174 	      bfd_put_32 (abfd, sec->size, &echdr->ch_size);
    175 	      bfd_put_32 (abfd, 1u << sec->alignment_power,
    176 			  &echdr->ch_addralign);
    177 	      /* bfd_log2 (alignof (Elf32_Chdr)) */
    178 	      bfd_set_section_alignment (sec, 2);
    179 	      esd->this_hdr.sh_addralign = 4;
    180 	    }
    181 	  else
    182 	    {
    183 	      Elf64_External_Chdr *echdr = (Elf64_External_Chdr *) contents;
    184 	      bfd_put_32 (abfd, ch_type, &echdr->ch_type);
    185 	      bfd_put_32 (abfd, 0, &echdr->ch_reserved);
    186 	      bfd_put_64 (abfd, sec->size, &echdr->ch_size);
    187 	      bfd_put_64 (abfd, UINT64_C (1) << sec->alignment_power,
    188 			  &echdr->ch_addralign);
    189 	      /* bfd_log2 (alignof (Elf64_Chdr)) */
    190 	      bfd_set_section_alignment (sec, 3);
    191 	      esd->this_hdr.sh_addralign = 8;
    192 	    }
    193 	  break;
    194 	}
    195 
    196       /* Clear the SHF_COMPRESSED bit.  */
    197       elf_section_flags (sec) &= ~SHF_COMPRESSED;
    198       /* Fall through.  */
    199 
    200     default:
    201       /* Write the zlib header.  It should be "ZLIB" followed by
    202 	 the uncompressed section size, 8 bytes in big-endian
    203 	 order.  */
    204       memcpy (contents, "ZLIB", 4);
    205       bfd_putb64 (sec->size, contents + 4);
    206       /* No way to keep the original alignment, just use 1 always. */
    207       bfd_set_section_alignment (sec, 0);
    208       break;
    209     }
    210 }
    211 
    212 /* Check the compression header at CONTENTS of SEC in ABFD and store the
    213    ch_type in CH_TYPE, uncompressed size in UNCOMPRESSED_SIZE, and the
    214    uncompressed data alignment in UNCOMPRESSED_ALIGNMENT_POWER if the
    215    compression header is valid.  */
    216 
    217 static bool
    218 bfd_check_compression_header (bfd *abfd, bfd_byte *contents,
    219 			      asection *sec,
    220 			      enum compression_type *ch_type,
    221 			      bfd_size_type *uncompressed_size,
    222 			      unsigned int *uncompressed_alignment_power)
    223 {
    224   if (bfd_get_flavour (abfd) == bfd_target_elf_flavour
    225       && (elf_section_flags (sec) & SHF_COMPRESSED) != 0)
    226     {
    227       Elf_Internal_Chdr chdr;
    228       const struct elf_backend_data *bed = get_elf_backend_data (abfd);
    229       if (bed->s->elfclass == ELFCLASS32)
    230 	{
    231 	  Elf32_External_Chdr *echdr = (Elf32_External_Chdr *) contents;
    232 	  chdr.ch_type = bfd_get_32 (abfd, &echdr->ch_type);
    233 	  chdr.ch_size = bfd_get_32 (abfd, &echdr->ch_size);
    234 	  chdr.ch_addralign = bfd_get_32 (abfd, &echdr->ch_addralign);
    235 	}
    236       else
    237 	{
    238 	  Elf64_External_Chdr *echdr = (Elf64_External_Chdr *) contents;
    239 	  chdr.ch_type = bfd_get_32 (abfd, &echdr->ch_type);
    240 	  chdr.ch_size = bfd_get_64 (abfd, &echdr->ch_size);
    241 	  chdr.ch_addralign = bfd_get_64 (abfd, &echdr->ch_addralign);
    242 	}
    243       *ch_type = chdr.ch_type;
    244       if ((chdr.ch_type == ch_compress_zlib
    245 	   || chdr.ch_type == ch_compress_zstd)
    246 	  && chdr.ch_addralign == (chdr.ch_addralign & -chdr.ch_addralign))
    247 	{
    248 	  *uncompressed_size = chdr.ch_size;
    249 	  *uncompressed_alignment_power = bfd_log2 (chdr.ch_addralign);
    250 	  return true;
    251 	}
    252     }
    253 
    254   return false;
    255 }
    256 
    257 /*
    258 FUNCTION
    259 	bfd_get_compression_header_size
    260 
    261 SYNOPSIS
    262 	int bfd_get_compression_header_size (bfd *abfd, asection *sec);
    263 
    264 DESCRIPTION
    265 	Return the size of the compression header of SEC in ABFD.
    266 */
    267 
    268 int
    269 bfd_get_compression_header_size (bfd *abfd, asection *sec)
    270 {
    271   if (bfd_get_flavour (abfd) == bfd_target_elf_flavour)
    272     {
    273       if (sec == NULL)
    274 	{
    275 	  if (!(abfd->flags & BFD_COMPRESS_GABI))
    276 	    return 0;
    277 	}
    278       else if (!(elf_section_flags (sec) & SHF_COMPRESSED))
    279 	return 0;
    280 
    281       if (get_elf_backend_data (abfd)->s->elfclass == ELFCLASS32)
    282 	return sizeof (Elf32_External_Chdr);
    283       else
    284 	return sizeof (Elf64_External_Chdr);
    285     }
    286 
    287   return 0;
    288 }
    289 
    290 /*
    291 FUNCTION
    292 	bfd_convert_section_setup
    293 
    294 SYNOPSIS
    295 	bool bfd_convert_section_setup
    296 	  (bfd *ibfd, asection *isec, bfd *obfd,
    297 	   const char **new_name, bfd_size_type *new_size);
    298 
    299 DESCRIPTION
    300 	Do early setup for objcopy, when copying @var{isec} in input
    301 	BFD @var{ibfd} to output BFD @var{obfd}.  Returns the name and
    302 	size of the output section.
    303 */
    304 
    305 bool
    306 bfd_convert_section_setup (bfd *ibfd, asection *isec, bfd *obfd,
    307 			   const char **new_name, bfd_size_type *new_size)
    308 {
    309   bfd_size_type hdr_size;
    310 
    311   if ((isec->flags & SEC_DEBUGGING) != 0
    312       && (isec->flags & SEC_HAS_CONTENTS) != 0)
    313     {
    314       const char *name = *new_name;
    315 
    316       if ((obfd->flags & (BFD_DECOMPRESS | BFD_COMPRESS_GABI)) != 0)
    317 	{
    318 	  /* When we decompress or compress with SHF_COMPRESSED,
    319 	     convert section name from .zdebug_* to .debug_*.  */
    320 	  if (startswith (name, ".zdebug_"))
    321 	    {
    322 	      name = bfd_zdebug_name_to_debug (obfd, name);
    323 	      if (name == NULL)
    324 		return false;
    325 	    }
    326 	}
    327 
    328       /* PR binutils/18087: Compression does not always make a
    329 	 section smaller.  So only rename the section when
    330 	 compression has actually taken place.  If input section
    331 	 name is .zdebug_*, we should never compress it again.  */
    332       else if (isec->compress_status == COMPRESS_SECTION_DONE
    333 	       && startswith (name, ".debug_"))
    334 	{
    335 	  name = bfd_debug_name_to_zdebug (obfd, name);
    336 	  if (name == NULL)
    337 	    return false;
    338 	}
    339       *new_name = name;
    340     }
    341   *new_size = bfd_section_size (isec);
    342 
    343   /* Do nothing if either input or output aren't ELF.  */
    344   if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
    345       || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
    346     return true;
    347 
    348   /* Do nothing if ELF classes of input and output are the same. */
    349   if (get_elf_backend_data (ibfd)->s->elfclass
    350       == get_elf_backend_data (obfd)->s->elfclass)
    351     return true;
    352 
    353   /* Convert GNU property size.  */
    354   if (startswith (isec->name, NOTE_GNU_PROPERTY_SECTION_NAME))
    355     {
    356       *new_size = _bfd_elf_convert_gnu_property_size (ibfd, obfd);
    357       return true;
    358     }
    359 
    360   /* Do nothing if input file will be decompressed.  */
    361   if ((ibfd->flags & BFD_DECOMPRESS))
    362     return true;
    363 
    364   /* Do nothing if the input section isn't a SHF_COMPRESSED section. */
    365   hdr_size = bfd_get_compression_header_size (ibfd, isec);
    366   if (hdr_size == 0)
    367     return true;
    368 
    369   /* Adjust the size of the output SHF_COMPRESSED section.  */
    370   if (hdr_size == sizeof (Elf32_External_Chdr))
    371     *new_size += sizeof (Elf64_External_Chdr) - sizeof (Elf32_External_Chdr);
    372   else
    373     *new_size -= sizeof (Elf64_External_Chdr) - sizeof (Elf32_External_Chdr);
    374   return true;
    375 }
    376 
    377 /*
    378 FUNCTION
    379 	bfd_convert_section_contents
    380 
    381 SYNOPSIS
    382 	bool bfd_convert_section_contents
    383 	  (bfd *ibfd, asection *isec, bfd *obfd,
    384 	   bfd_byte **ptr, bfd_size_type *ptr_size);
    385 
    386 DESCRIPTION
    387 	Convert the contents, stored in @var{*ptr}, of the section
    388 	@var{isec} in input BFD @var{ibfd} to output BFD @var{obfd}
    389 	if needed.  The original buffer pointed to by @var{*ptr} may
    390 	be freed and @var{*ptr} is returned with memory malloc'd by this
    391 	function, and the new size written to @var{ptr_size}.
    392 */
    393 
    394 bool
    395 bfd_convert_section_contents (bfd *ibfd, sec_ptr isec, bfd *obfd,
    396 			      bfd_byte **ptr, bfd_size_type *ptr_size)
    397 {
    398   bfd_byte *contents;
    399   bfd_size_type ihdr_size, ohdr_size, size;
    400   Elf_Internal_Chdr chdr;
    401   bool use_memmove;
    402 
    403   /* Do nothing if either input or output aren't ELF.  */
    404   if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
    405       || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
    406     return true;
    407 
    408   /* Do nothing if ELF classes of input and output are the same.  */
    409   if (get_elf_backend_data (ibfd)->s->elfclass
    410       == get_elf_backend_data (obfd)->s->elfclass)
    411     return true;
    412 
    413   /* Convert GNU properties.  */
    414   if (startswith (isec->name, NOTE_GNU_PROPERTY_SECTION_NAME))
    415     return _bfd_elf_convert_gnu_properties (ibfd, isec, obfd, ptr,
    416 					    ptr_size);
    417 
    418   /* Do nothing if input file will be decompressed.  */
    419   if ((ibfd->flags & BFD_DECOMPRESS))
    420     return true;
    421 
    422   /* Do nothing if the input section isn't a SHF_COMPRESSED section.  */
    423   ihdr_size = bfd_get_compression_header_size (ibfd, isec);
    424   if (ihdr_size == 0)
    425     return true;
    426 
    427   /* PR 25221.  Check for corrupt input sections.  */
    428   if (ihdr_size > bfd_get_section_limit (ibfd, isec))
    429     /* FIXME: Issue a warning about a corrupt
    430        compression header size field ?  */
    431     return false;
    432 
    433   contents = *ptr;
    434 
    435   /* Convert the contents of the input SHF_COMPRESSED section to
    436      output.  Get the input compression header and the size of the
    437      output compression header.  */
    438   if (ihdr_size == sizeof (Elf32_External_Chdr))
    439     {
    440       Elf32_External_Chdr *echdr = (Elf32_External_Chdr *) contents;
    441       chdr.ch_type = bfd_get_32 (ibfd, &echdr->ch_type);
    442       chdr.ch_size = bfd_get_32 (ibfd, &echdr->ch_size);
    443       chdr.ch_addralign = bfd_get_32 (ibfd, &echdr->ch_addralign);
    444 
    445       ohdr_size = sizeof (Elf64_External_Chdr);
    446 
    447       use_memmove = false;
    448     }
    449   else if (ihdr_size != sizeof (Elf64_External_Chdr))
    450     {
    451       /* FIXME: Issue a warning about a corrupt
    452 	 compression header size field ?  */
    453       return false;
    454     }
    455   else
    456     {
    457       Elf64_External_Chdr *echdr = (Elf64_External_Chdr *) contents;
    458       chdr.ch_type = bfd_get_32 (ibfd, &echdr->ch_type);
    459       chdr.ch_size = bfd_get_64 (ibfd, &echdr->ch_size);
    460       chdr.ch_addralign = bfd_get_64 (ibfd, &echdr->ch_addralign);
    461 
    462       ohdr_size = sizeof (Elf32_External_Chdr);
    463       use_memmove = true;
    464     }
    465 
    466   size = bfd_section_size (isec) - ihdr_size + ohdr_size;
    467   if (!use_memmove)
    468     {
    469       contents = (bfd_byte *) bfd_malloc (size);
    470       if (contents == NULL)
    471 	return false;
    472     }
    473 
    474   /* Write out the output compression header.  */
    475   if (ohdr_size == sizeof (Elf32_External_Chdr))
    476     {
    477       Elf32_External_Chdr *echdr = (Elf32_External_Chdr *) contents;
    478       bfd_put_32 (obfd, chdr.ch_type, &echdr->ch_type);
    479       bfd_put_32 (obfd, chdr.ch_size, &echdr->ch_size);
    480       bfd_put_32 (obfd, chdr.ch_addralign, &echdr->ch_addralign);
    481     }
    482   else
    483     {
    484       Elf64_External_Chdr *echdr = (Elf64_External_Chdr *) contents;
    485       bfd_put_32 (obfd, chdr.ch_type, &echdr->ch_type);
    486       bfd_put_32 (obfd, 0, &echdr->ch_reserved);
    487       bfd_put_64 (obfd, chdr.ch_size, &echdr->ch_size);
    488       bfd_put_64 (obfd, chdr.ch_addralign, &echdr->ch_addralign);
    489     }
    490 
    491   /* Copy the compressed contents.  */
    492   if (use_memmove)
    493     memmove (contents + ohdr_size, *ptr + ihdr_size, size - ohdr_size);
    494   else
    495     {
    496       memcpy (contents + ohdr_size, *ptr + ihdr_size, size - ohdr_size);
    497       free (*ptr);
    498       *ptr = contents;
    499     }
    500 
    501   *ptr_size = size;
    502   return true;
    503 }
    504 
    505 static bool
    506 decompress_contents (bool is_zstd, bfd_byte *compressed_buffer,
    507 		     bfd_size_type compressed_size,
    508 		     bfd_byte *uncompressed_buffer,
    509 		     bfd_size_type uncompressed_size)
    510 {
    511   if (is_zstd)
    512     {
    513 #ifdef HAVE_ZSTD
    514       size_t ret = ZSTD_decompress (uncompressed_buffer, uncompressed_size,
    515 				    compressed_buffer, compressed_size);
    516       return !ZSTD_isError (ret);
    517 #endif
    518     }
    519 
    520   z_stream strm;
    521   int rc;
    522 
    523   /* It is possible the section consists of several compressed
    524      buffers concatenated together, so we uncompress in a loop.  */
    525   /* PR 18313: The state field in the z_stream structure is supposed
    526      to be invisible to the user (ie us), but some compilers will
    527      still complain about it being used without initialisation.  So
    528      we first zero the entire z_stream structure and then set the fields
    529      that we need.  */
    530   memset (& strm, 0, sizeof strm);
    531   strm.avail_in = compressed_size;
    532   strm.next_in = (Bytef*) compressed_buffer;
    533   strm.avail_out = uncompressed_size;
    534   /* FIXME: strm.avail_in and strm.avail_out are typically unsigned
    535      int.  Supporting sizes that don't fit in an unsigned int is
    536      possible but will require some rewriting of this function.  */
    537   if (strm.avail_in != compressed_size || strm.avail_out != uncompressed_size)
    538     return false;
    539 
    540   BFD_ASSERT (Z_OK == 0);
    541   rc = inflateInit (&strm);
    542   while (strm.avail_in > 0 && strm.avail_out > 0)
    543     {
    544       if (rc != Z_OK)
    545 	break;
    546       strm.next_out = ((Bytef*) uncompressed_buffer
    547 		       + (uncompressed_size - strm.avail_out));
    548       rc = inflate (&strm, Z_FINISH);
    549       if (rc != Z_STREAM_END)
    550 	break;
    551       rc = inflateReset (&strm);
    552     }
    553   return inflateEnd (&strm) == Z_OK && rc == Z_OK && strm.avail_out == 0;
    554 }
    555 
    556 /* Compress section contents using zlib/zstd and store
    557    as the contents field.  This function assumes the contents
    558    field was allocated using bfd_malloc() or equivalent.
    559 
    560    Return the uncompressed size if the full section contents is
    561    compressed successfully.  Otherwise return (bfd_size_type) -1.  */
    562 
    563 static bfd_size_type
    564 bfd_compress_section_contents (bfd *abfd, sec_ptr sec)
    565 {
    566   bfd_byte *input_buffer;
    567   uLong compressed_size;
    568   bfd_byte *buffer;
    569   bfd_size_type buffer_size;
    570   int zlib_size = 0;
    571   int orig_header_size;
    572   bfd_size_type uncompressed_size;
    573   unsigned int uncompressed_alignment_pow;
    574   enum compression_type ch_type = ch_none;
    575   int new_header_size = bfd_get_compression_header_size (abfd, NULL);
    576   bool compressed
    577     = bfd_is_section_compressed_info (abfd, sec,
    578 				      &orig_header_size,
    579 				      &uncompressed_size,
    580 				      &uncompressed_alignment_pow,
    581 				      &ch_type);
    582   bool update = false;
    583 
    584   /* We shouldn't be trying to decompress unsupported compressed sections.  */
    585   if (compressed && orig_header_size < 0)
    586     abort ();
    587 
    588   /* PR 31455: Check for a corrupt uncompressed size.  */
    589   if (uncompressed_size == (bfd_size_type) -1)
    590     return uncompressed_size;
    591 
    592   /* Either ELF compression header or the 12-byte, "ZLIB" + 8-byte size,
    593      overhead in .zdebug* section.  */
    594   if (!new_header_size)
    595     new_header_size = 12;
    596   if (ch_type == ch_none)
    597     orig_header_size = 12;
    598 
    599   input_buffer = sec->contents;
    600   if (compressed)
    601     {
    602       zlib_size = sec->size - orig_header_size;
    603       compressed_size = zlib_size + new_header_size;
    604 
    605       /* If we are converting between zlib-gnu and zlib-gabi then the
    606 	 compressed contents just need to be moved.  */
    607       update = (ch_type < ch_compress_zstd
    608 		&& (abfd->flags & BFD_COMPRESS_ZSTD) == 0);
    609 
    610       /* Uncompress when not just moving contents or when compressed
    611 	 is not smaller than uncompressed.  */
    612       if (!update || compressed_size >= uncompressed_size)
    613 	{
    614 	  buffer_size = uncompressed_size;
    615 	  buffer = bfd_malloc (buffer_size);
    616 	  if (buffer == NULL)
    617 	    return (bfd_size_type) -1;
    618 
    619 	  if (!decompress_contents (ch_type == ch_compress_zstd,
    620 				    input_buffer + orig_header_size,
    621 				    zlib_size, buffer, buffer_size))
    622 	    {
    623 	      bfd_set_error (bfd_error_bad_value);
    624 	      free (buffer);
    625 	      return (bfd_size_type) -1;
    626 	    }
    627 	  free (input_buffer);
    628 	  bfd_set_section_alignment (sec, uncompressed_alignment_pow);
    629 	  sec->contents = buffer;
    630 	  sec->flags |= SEC_IN_MEMORY;
    631 	  sec->compress_status = COMPRESS_SECTION_NONE;
    632 	  sec->size = uncompressed_size;
    633 	  input_buffer = buffer;
    634 	}
    635     }
    636 
    637   if (!update)
    638     compressed_size = compressBound (uncompressed_size) + new_header_size;
    639 
    640   buffer_size = compressed_size;
    641   buffer = bfd_alloc (abfd, buffer_size);
    642   if (buffer == NULL)
    643     return (bfd_size_type) -1;
    644 
    645   if (update)
    646     {
    647       if (compressed_size < uncompressed_size)
    648 	memcpy (buffer + new_header_size,
    649 		input_buffer + orig_header_size,
    650 		zlib_size);
    651     }
    652   else
    653     {
    654       if (abfd->flags & BFD_COMPRESS_ZSTD)
    655 	{
    656 #if HAVE_ZSTD
    657 	  compressed_size = ZSTD_compress (buffer + new_header_size,
    658 					   compressed_size,
    659 					   input_buffer,
    660 					   uncompressed_size,
    661 					   ZSTD_CLEVEL_DEFAULT);
    662 	  if (ZSTD_isError (compressed_size))
    663 	    {
    664 	      bfd_release (abfd, buffer);
    665 	      bfd_set_error (bfd_error_bad_value);
    666 	      return (bfd_size_type) -1;
    667 	    }
    668 #endif
    669 	}
    670       else if (compress ((Bytef *) buffer + new_header_size, &compressed_size,
    671 			 (const Bytef *) input_buffer, uncompressed_size)
    672 	       != Z_OK)
    673 	{
    674 	  bfd_release (abfd, buffer);
    675 	  bfd_set_error (bfd_error_bad_value);
    676 	  return (bfd_size_type) -1;
    677 	}
    678 
    679       compressed_size += new_header_size;
    680     }
    681 
    682   /* If compression didn't make the section smaller, keep it uncompressed.  */
    683   if (compressed_size >= uncompressed_size)
    684     {
    685       memcpy (buffer, input_buffer, uncompressed_size);
    686       if (bfd_get_flavour (abfd) == bfd_target_elf_flavour)
    687 	elf_section_flags (sec) &= ~SHF_COMPRESSED;
    688       sec->compress_status = COMPRESS_SECTION_NONE;
    689     }
    690   else
    691     {
    692       sec->size = uncompressed_size;
    693       bfd_update_compression_header (abfd, buffer, sec);
    694       sec->size = compressed_size;
    695       sec->compress_status = COMPRESS_SECTION_DONE;
    696     }
    697   sec->contents = buffer;
    698   sec->flags |= SEC_IN_MEMORY;
    699   free (input_buffer);
    700   return uncompressed_size;
    701 }
    702 
    703 /*
    704 FUNCTION
    705 	bfd_get_full_section_contents
    706 
    707 SYNOPSIS
    708 	bool bfd_get_full_section_contents
    709 	  (bfd *abfd, asection *section, bfd_byte **ptr);
    710 
    711 DESCRIPTION
    712 	Read all data from @var{section} in BFD @var{abfd}, decompress
    713 	if needed, and store in @var{*ptr}.  If @var{*ptr} is NULL,
    714 	return @var{*ptr} with memory malloc'd by this function.
    715 
    716 	Return @code{TRUE} if the full section contents is retrieved
    717 	successfully.  If the section has no contents then this function
    718 	returns @code{TRUE} but @var{*ptr} is set to NULL.
    719 */
    720 
    721 bool
    722 bfd_get_full_section_contents (bfd *abfd, sec_ptr sec, bfd_byte **ptr)
    723 {
    724   bfd_size_type readsz = bfd_get_section_limit_octets (abfd, sec);
    725   bfd_size_type allocsz = bfd_get_section_alloc_size (abfd, sec);
    726   bfd_byte *p = *ptr;
    727   bool ret;
    728   bfd_size_type save_size;
    729   bfd_size_type save_rawsize;
    730   bfd_byte *compressed_buffer;
    731   unsigned int compression_header_size;
    732   const unsigned int compress_status = sec->compress_status;
    733 
    734   if (allocsz == 0)
    735     {
    736       *ptr = NULL;
    737       return true;
    738     }
    739 
    740   if (p == NULL
    741       && compress_status != COMPRESS_SECTION_DONE
    742       && bfd_section_size_insane (abfd, sec))
    743     {
    744       /* PR 24708: Avoid attempts to allocate a ridiculous amount
    745 	 of memory.  */
    746       _bfd_error_handler
    747 	/* xgettext:c-format */
    748 	(_("error: %pB(%pA) is too large (%#" PRIx64 " bytes)"),
    749 	 abfd, sec, (uint64_t) readsz);
    750       return false;
    751     }
    752 
    753   switch (compress_status)
    754     {
    755     case COMPRESS_SECTION_NONE:
    756       if (p == NULL && !sec->mmapped_p)
    757 	{
    758 	  p = (bfd_byte *) bfd_malloc (allocsz);
    759 	  if (p == NULL)
    760 	    {
    761 	      /* PR 20801: Provide a more helpful error message.  */
    762 	      if (bfd_get_error () == bfd_error_no_memory)
    763 		_bfd_error_handler
    764 		  /* xgettext:c-format */
    765 		  (_("error: %pB(%pA) is too large (%#" PRIx64 " bytes)"),
    766 		  abfd, sec, (uint64_t) allocsz);
    767 	      return false;
    768 	    }
    769 	}
    770 
    771       if (!bfd_get_section_contents (abfd, sec, p, 0, readsz))
    772 	{
    773 	  if (*ptr != p)
    774 	    free (p);
    775 	  return false;
    776 	}
    777       *ptr = p;
    778       return true;
    779 
    780     case DECOMPRESS_SECTION_ZLIB:
    781     case DECOMPRESS_SECTION_ZSTD:
    782       /* Read in the full compressed section contents.  */
    783       compressed_buffer = (bfd_byte *) bfd_malloc (sec->compressed_size);
    784       if (compressed_buffer == NULL)
    785 	return false;
    786       save_rawsize = sec->rawsize;
    787       save_size = sec->size;
    788       /* Clear rawsize, set size to compressed size and set compress_status
    789 	 to COMPRESS_SECTION_NONE.  If the compressed size is bigger than
    790 	 the uncompressed size, bfd_get_section_contents will fail.  */
    791       sec->rawsize = 0;
    792       sec->size = sec->compressed_size;
    793       sec->compress_status = COMPRESS_SECTION_NONE;
    794       ret = bfd_get_section_contents (abfd, sec, compressed_buffer,
    795 				      0, sec->compressed_size);
    796       /* Restore rawsize and size.  */
    797       sec->rawsize = save_rawsize;
    798       sec->size = save_size;
    799       sec->compress_status = compress_status;
    800       if (!ret)
    801 	goto fail_compressed;
    802 
    803       if (p == NULL)
    804 	p = (bfd_byte *) bfd_malloc (allocsz);
    805       if (p == NULL)
    806 	goto fail_compressed;
    807 
    808       compression_header_size = bfd_get_compression_header_size (abfd, sec);
    809       if (compression_header_size == 0)
    810 	/* Set header size to the zlib header size if it is a
    811 	   SHF_COMPRESSED section.  */
    812 	compression_header_size = 12;
    813       bool is_zstd = compress_status == DECOMPRESS_SECTION_ZSTD;
    814       if (!decompress_contents (
    815 	      is_zstd, compressed_buffer + compression_header_size,
    816 	      sec->compressed_size - compression_header_size, p, readsz))
    817 	{
    818 	  bfd_set_error (bfd_error_bad_value);
    819 	  if (p != *ptr)
    820 	    free (p);
    821 	fail_compressed:
    822 	  free (compressed_buffer);
    823 	  return false;
    824 	}
    825 
    826       free (compressed_buffer);
    827       *ptr = p;
    828       return true;
    829 
    830     case COMPRESS_SECTION_DONE:
    831       if (sec->contents == NULL)
    832 	return false;
    833       if (p == NULL)
    834 	{
    835 	  p = (bfd_byte *) bfd_malloc (allocsz);
    836 	  if (p == NULL)
    837 	    return false;
    838 	  *ptr = p;
    839 	}
    840       /* PR 17512; file: 5bc29788.  */
    841       if (p != sec->contents)
    842 	memcpy (p, sec->contents, readsz);
    843       return true;
    844 
    845     default:
    846       abort ();
    847     }
    848 }
    849 
    850 /*
    851 FUNCTION
    852 	bfd_is_section_compressed_info
    853 
    854 SYNOPSIS
    855 	bool bfd_is_section_compressed_info
    856 	  (bfd *abfd, asection *section,
    857 	   int *compression_header_size_p,
    858 	   bfd_size_type *uncompressed_size_p,
    859 	   unsigned int *uncompressed_alignment_power_p,
    860 	   enum compression_type *ch_type);
    861 
    862 DESCRIPTION
    863 	Return @code{TRUE} if @var{section} is compressed.  Compression
    864 	header size is returned in @var{compression_header_size_p},
    865 	uncompressed size is returned in @var{uncompressed_size_p}
    866 	and the uncompressed data alignement power is returned in
    867 	@var{uncompressed_align_pow_p}.  If compression is
    868 	unsupported, compression header size is returned with -1
    869 	and uncompressed size is returned with 0.
    870 */
    871 
    872 bool
    873 bfd_is_section_compressed_info (bfd *abfd, sec_ptr sec,
    874 				int *compression_header_size_p,
    875 				bfd_size_type *uncompressed_size_p,
    876 				unsigned int *uncompressed_align_pow_p,
    877 				enum compression_type *ch_type)
    878 {
    879   bfd_byte header[MAX_COMPRESSION_HEADER_SIZE];
    880   int compression_header_size;
    881   int header_size;
    882   unsigned int saved = sec->compress_status;
    883   bool compressed;
    884 
    885   *uncompressed_align_pow_p = 0;
    886 
    887   compression_header_size = bfd_get_compression_header_size (abfd, sec);
    888   if (compression_header_size > MAX_COMPRESSION_HEADER_SIZE)
    889     abort ();
    890   header_size = compression_header_size ? compression_header_size : 12;
    891 
    892   /* Don't decompress the section.  */
    893   sec->compress_status = COMPRESS_SECTION_NONE;
    894 
    895   /* Read the header.  */
    896   if (bfd_get_section_contents (abfd, sec, header, 0, header_size))
    897     {
    898       if (compression_header_size == 0)
    899 	/* In this case, it should be "ZLIB" followed by the uncompressed
    900 	   section size, 8 bytes in big-endian order.  */
    901 	compressed = startswith ((char*) header , "ZLIB");
    902       else
    903 	compressed = true;
    904     }
    905   else
    906     compressed = false;
    907 
    908   *uncompressed_size_p = sec->size;
    909   if (compressed)
    910     {
    911       if (compression_header_size != 0)
    912 	{
    913 	  if (!bfd_check_compression_header (abfd, header, sec, ch_type,
    914 					     uncompressed_size_p,
    915 					     uncompressed_align_pow_p))
    916 	    compression_header_size = -1;
    917 	}
    918       /* Check for the pathalogical case of a debug string section that
    919 	 contains the string ZLIB.... as the first entry.  We assume that
    920 	 no uncompressed .debug_str section would ever be big enough to
    921 	 have the first byte of its (big-endian) size be non-zero.  */
    922       else if (strcmp (sec->name, ".debug_str") == 0
    923 	       && ISPRINT (header[4]))
    924 	compressed = false;
    925       else
    926 	*uncompressed_size_p = bfd_getb64 (header + 4);
    927     }
    928 
    929   /* Restore compress_status.  */
    930   sec->compress_status = saved;
    931   *compression_header_size_p = compression_header_size;
    932   return compressed;
    933 }
    934 
    935 /*
    936 FUNCTION
    937 	bfd_is_section_compressed
    938 
    939 SYNOPSIS
    940 	bool bfd_is_section_compressed
    941 	  (bfd *abfd, asection *section);
    942 
    943 DESCRIPTION
    944 	Return @code{TRUE} if @var{section} is compressed.
    945 */
    946 
    947 bool
    948 bfd_is_section_compressed (bfd *abfd, sec_ptr sec)
    949 {
    950   int compression_header_size;
    951   bfd_size_type uncompressed_size;
    952   unsigned int uncompressed_align_power;
    953   enum compression_type ch_type;
    954   return (bfd_is_section_compressed_info (abfd, sec,
    955 					  &compression_header_size,
    956 					  &uncompressed_size,
    957 					  &uncompressed_align_power,
    958 					  &ch_type)
    959 	  && compression_header_size >= 0
    960 	  && uncompressed_size > 0);
    961 }
    962 
    963 /*
    964 FUNCTION
    965 	bfd_init_section_decompress_status
    966 
    967 SYNOPSIS
    968 	bool bfd_init_section_decompress_status
    969 	  (bfd *abfd, asection *section);
    970 
    971 DESCRIPTION
    972 	Record compressed section size, update section size with
    973 	decompressed size and set compress_status to
    974 	DECOMPRESS_SECTION_{ZLIB,ZSTD}.
    975 
    976 	Return @code{FALSE} if the section is not a valid compressed
    977 	section.  Otherwise, return @code{TRUE}.
    978 */
    979 
    980 bool
    981 bfd_init_section_decompress_status (bfd *abfd, sec_ptr sec)
    982 {
    983   bfd_byte header[MAX_COMPRESSION_HEADER_SIZE];
    984   int compression_header_size;
    985   int header_size;
    986   bfd_size_type uncompressed_size;
    987   unsigned int uncompressed_alignment_power = 0;
    988   enum compression_type ch_type;
    989   z_stream strm;
    990 
    991   compression_header_size = bfd_get_compression_header_size (abfd, sec);
    992   if (compression_header_size > MAX_COMPRESSION_HEADER_SIZE)
    993     abort ();
    994   header_size = compression_header_size ? compression_header_size : 12;
    995 
    996   /* Read the header.  */
    997   if (sec->rawsize != 0
    998       || sec->contents != NULL
    999       || sec->compress_status != COMPRESS_SECTION_NONE
   1000       || !bfd_get_section_contents (abfd, sec, header, 0, header_size))
   1001     {
   1002       bfd_set_error (bfd_error_invalid_operation);
   1003       return false;
   1004     }
   1005 
   1006   if (compression_header_size == 0)
   1007     {
   1008       /* In this case, it should be "ZLIB" followed by the uncompressed
   1009 	 section size, 8 bytes in big-endian order.  */
   1010       if (! startswith ((char*) header, "ZLIB"))
   1011 	{
   1012 	  bfd_set_error (bfd_error_wrong_format);
   1013 	  return false;
   1014 	}
   1015       uncompressed_size = bfd_getb64 (header + 4);
   1016       ch_type = ch_none;
   1017     }
   1018   else if (!bfd_check_compression_header (abfd, header, sec,
   1019 					  &ch_type,
   1020 					  &uncompressed_size,
   1021 					  &uncompressed_alignment_power))
   1022     {
   1023       bfd_set_error (bfd_error_wrong_format);
   1024       return false;
   1025     }
   1026 
   1027   /* PR28530, reject sizes unsupported by decompress_contents.  */
   1028   strm.avail_in = sec->size;
   1029   strm.avail_out = uncompressed_size;
   1030   if (strm.avail_in != sec->size || strm.avail_out != uncompressed_size)
   1031     {
   1032       bfd_set_error (bfd_error_nonrepresentable_section);
   1033       return false;
   1034     }
   1035 
   1036   sec->compressed_size = sec->size;
   1037   sec->size = uncompressed_size;
   1038   bfd_set_section_alignment (sec, uncompressed_alignment_power);
   1039   sec->compress_status = (ch_type == ch_compress_zstd
   1040 			  ? DECOMPRESS_SECTION_ZSTD : DECOMPRESS_SECTION_ZLIB);
   1041 
   1042   return true;
   1043 }
   1044 
   1045 /*
   1046 FUNCTION
   1047 	bfd_init_section_compress_status
   1048 
   1049 SYNOPSIS
   1050 	bool bfd_init_section_compress_status
   1051 	  (bfd *abfd, asection *section);
   1052 
   1053 DESCRIPTION
   1054 	If open for read, compress section, update section size with
   1055 	compressed size and set compress_status to COMPRESS_SECTION_DONE.
   1056 
   1057 	Return @code{FALSE} if the section is not a valid compressed
   1058 	section.  Otherwise, return @code{TRUE}.
   1059 */
   1060 
   1061 bool
   1062 bfd_init_section_compress_status (bfd *abfd, sec_ptr sec)
   1063 {
   1064   bfd_size_type uncompressed_size;
   1065   bfd_byte *uncompressed_buffer;
   1066 
   1067   /* Error if not opened for read.  */
   1068   if (abfd->direction != read_direction
   1069       || sec->size == 0
   1070       || sec->rawsize != 0
   1071       || sec->contents != NULL
   1072       || sec->compress_status != COMPRESS_SECTION_NONE
   1073       || bfd_section_size_insane (abfd, sec))
   1074     {
   1075       bfd_set_error (bfd_error_invalid_operation);
   1076       return false;
   1077     }
   1078 
   1079   /* Read in the full section contents and compress it.  */
   1080   uncompressed_size = sec->size;
   1081   uncompressed_buffer = (bfd_byte *) bfd_malloc (uncompressed_size);
   1082   /* PR 21431 */
   1083   if (uncompressed_buffer == NULL)
   1084     return false;
   1085 
   1086   if (!bfd_get_section_contents (abfd, sec, uncompressed_buffer,
   1087 				 0, uncompressed_size))
   1088     {
   1089       free (uncompressed_buffer);
   1090       return false;
   1091     }
   1092 
   1093   sec->contents = uncompressed_buffer;
   1094   if (bfd_compress_section_contents (abfd, sec) == (bfd_size_type) -1)
   1095     {
   1096       free (sec->contents);
   1097       sec->contents = NULL;
   1098       return false;
   1099     }
   1100   return true;
   1101 }
   1102 
   1103 /*
   1104 FUNCTION
   1105 	bfd_compress_section
   1106 
   1107 SYNOPSIS
   1108 	bool bfd_compress_section
   1109 	  (bfd *abfd, asection *section, bfd_byte *uncompressed_buffer);
   1110 
   1111 DESCRIPTION
   1112 	If open for write, compress section, update section size with
   1113 	compressed size and set compress_status to COMPRESS_SECTION_DONE.
   1114 
   1115 	Return @code{FALSE} if compression fail.  Otherwise, return
   1116 	@code{TRUE}.  UNCOMPRESSED_BUFFER is freed in both cases.
   1117 */
   1118 
   1119 bool
   1120 bfd_compress_section (bfd *abfd, sec_ptr sec, bfd_byte *uncompressed_buffer)
   1121 {
   1122   bfd_size_type uncompressed_size = sec->size;
   1123 
   1124   /* Error if not opened for write.  */
   1125   if (abfd->direction != write_direction
   1126       || uncompressed_size == 0
   1127       || uncompressed_buffer == NULL
   1128       || sec->contents != NULL
   1129       || sec->compressed_size != 0
   1130       || sec->compress_status != COMPRESS_SECTION_NONE)
   1131     {
   1132       bfd_set_error (bfd_error_invalid_operation);
   1133       return false;
   1134     }
   1135 
   1136   sec->contents = uncompressed_buffer;
   1137   if (bfd_compress_section_contents (abfd, sec) == (bfd_size_type) -1)
   1138     {
   1139       free (sec->contents);
   1140       sec->contents = NULL;
   1141       return false;
   1142     }
   1143   return true;
   1144 }
   1145