xref: /netbsd-src/external/gpl3/gdb/dist/bfd/compress.c (revision f8cf1a9151c7af1cb0bd8b09c13c66bca599c027)
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