xref: /netbsd-src/external/gpl3/gdb/dist/bfd/compress.c (revision cef8759bd76c1b621f8eab8faa6f208faabc2e15)
1 /* Compressed section support (intended for debug sections).
2    Copyright (C) 2008-2019 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 #include "bfd.h"
24 #include "libbfd.h"
25 #include "safe-ctype.h"
26 
27 #define MAX_COMPRESSION_HEADER_SIZE 24
28 
29 static bfd_boolean
30 decompress_contents (bfd_byte *compressed_buffer,
31 		     bfd_size_type compressed_size,
32 		     bfd_byte *uncompressed_buffer,
33 		     bfd_size_type uncompressed_size)
34 {
35   z_stream strm;
36   int rc;
37 
38   /* It is possible the section consists of several compressed
39      buffers concatenated together, so we uncompress in a loop.  */
40   /* PR 18313: The state field in the z_stream structure is supposed
41      to be invisible to the user (ie us), but some compilers will
42      still complain about it being used without initialisation.  So
43      we first zero the entire z_stream structure and then set the fields
44      that we need.  */
45   memset (& strm, 0, sizeof strm);
46   strm.avail_in = compressed_size;
47   strm.next_in = (Bytef*) compressed_buffer;
48   strm.avail_out = uncompressed_size;
49 
50   BFD_ASSERT (Z_OK == 0);
51   rc = inflateInit (&strm);
52   while (strm.avail_in > 0 && strm.avail_out > 0)
53     {
54       if (rc != Z_OK)
55 	break;
56       strm.next_out = ((Bytef*) uncompressed_buffer
57 		       + (uncompressed_size - strm.avail_out));
58       rc = inflate (&strm, Z_FINISH);
59       if (rc != Z_STREAM_END)
60 	break;
61       rc = inflateReset (&strm);
62     }
63   rc |= inflateEnd (&strm);
64   return rc == Z_OK && strm.avail_out == 0;
65 }
66 
67 /* Compress data of the size specified in @var{uncompressed_size}
68    and pointed to by @var{uncompressed_buffer} using zlib and store
69    as the contents field.  This function assumes the contents
70    field was allocated using bfd_malloc() or equivalent.
71 
72    Return the uncompressed size if the full section contents is
73    compressed successfully.  Otherwise return 0.  */
74 
75 static bfd_size_type
76 bfd_compress_section_contents (bfd *abfd, sec_ptr sec,
77 			       bfd_byte *uncompressed_buffer,
78 			       bfd_size_type uncompressed_size)
79 {
80   uLong compressed_size;
81   bfd_byte *buffer;
82   bfd_size_type buffer_size;
83   bfd_boolean decompress;
84   int zlib_size = 0;
85   int orig_compression_header_size;
86   bfd_size_type orig_uncompressed_size;
87   unsigned int orig_uncompressed_alignment_pow;
88   int header_size = bfd_get_compression_header_size (abfd, NULL);
89   bfd_boolean compressed
90     = bfd_is_section_compressed_with_header (abfd, sec,
91 					     &orig_compression_header_size,
92 					     &orig_uncompressed_size,
93 					     &orig_uncompressed_alignment_pow);
94 
95   /* Either ELF compression header or the 12-byte, "ZLIB" + 8-byte size,
96      overhead in .zdebug* section.  */
97   if (!header_size)
98      header_size = 12;
99 
100   if (compressed)
101     {
102       /* We shouldn't decompress unsupported compressed section.  */
103       if (orig_compression_header_size < 0)
104 	abort ();
105 
106       /* Different compression schemes.  Just move the compressed section
107 	 contents to the right position. */
108       if (orig_compression_header_size == 0)
109 	{
110 	  /* Convert it from .zdebug* section.  Get the uncompressed
111 	     size first.  We need to subtract the 12-byte overhead in
112 	     .zdebug* section.  Set orig_compression_header_size to
113 	     the 12-bye overhead.  */
114 	  orig_compression_header_size = 12;
115 	  zlib_size = uncompressed_size - 12;
116 	}
117       else
118 	{
119 	  /* Convert it to .zdebug* section.  */
120 	  zlib_size = uncompressed_size - orig_compression_header_size;
121 	}
122 
123       /* Add the header size.  */
124       compressed_size = zlib_size + header_size;
125     }
126   else
127     compressed_size = compressBound (uncompressed_size) + header_size;
128 
129   /* Uncompress if it leads to smaller size.  */
130   if (compressed && compressed_size > orig_uncompressed_size)
131     {
132       decompress = TRUE;
133       buffer_size = orig_uncompressed_size;
134     }
135   else
136     {
137       decompress = FALSE;
138       buffer_size = compressed_size;
139     }
140   buffer = (bfd_byte *) bfd_alloc (abfd, buffer_size);
141   if (buffer == NULL)
142     return 0;
143 
144   if (compressed)
145     {
146       sec->size = orig_uncompressed_size;
147       if (decompress)
148 	{
149 	  if (!decompress_contents (uncompressed_buffer
150 				    + orig_compression_header_size,
151 				    zlib_size, buffer, buffer_size))
152 	    {
153 	      bfd_set_error (bfd_error_bad_value);
154 	      bfd_release (abfd, buffer);
155 	      return 0;
156 	    }
157 	  free (uncompressed_buffer);
158 	  bfd_set_section_alignment (abfd, sec,
159 				     orig_uncompressed_alignment_pow);
160 
161 	  sec->contents = buffer;
162 	  sec->compress_status = COMPRESS_SECTION_DONE;
163 	  return orig_uncompressed_size;
164 	}
165       else
166 	{
167 	  bfd_update_compression_header (abfd, buffer, sec);
168 	  memmove (buffer + header_size,
169 		   uncompressed_buffer + orig_compression_header_size,
170 		   zlib_size);
171 	}
172     }
173   else
174     {
175       if (compress ((Bytef*) buffer + header_size,
176 		    &compressed_size,
177 		    (const Bytef*) uncompressed_buffer,
178 		    uncompressed_size) != Z_OK)
179 	{
180 	  bfd_release (abfd, buffer);
181 	  bfd_set_error (bfd_error_bad_value);
182 	  return 0;
183 	}
184 
185       compressed_size += header_size;
186       /* PR binutils/18087: If compression didn't make the section smaller,
187 	 just keep it uncompressed.  */
188       if (compressed_size < uncompressed_size)
189 	bfd_update_compression_header (abfd, buffer, sec);
190       else
191 	{
192 	  /* NOTE: There is a small memory leak here since
193 	     uncompressed_buffer is malloced and won't be freed.  */
194 	  bfd_release (abfd, buffer);
195 	  sec->contents = uncompressed_buffer;
196 	  sec->compress_status = COMPRESS_SECTION_NONE;
197 	  return uncompressed_size;
198 	}
199     }
200 
201   free (uncompressed_buffer);
202   sec->contents = buffer;
203   sec->size = compressed_size;
204   sec->compress_status = COMPRESS_SECTION_DONE;
205 
206   return uncompressed_size;
207 }
208 
209 /*
210 FUNCTION
211 	bfd_get_full_section_contents
212 
213 SYNOPSIS
214 	bfd_boolean bfd_get_full_section_contents
215 	  (bfd *abfd, asection *section, bfd_byte **ptr);
216 
217 DESCRIPTION
218 	Read all data from @var{section} in BFD @var{abfd}, decompress
219 	if needed, and store in @var{*ptr}.  If @var{*ptr} is NULL,
220 	return @var{*ptr} with memory malloc'd by this function.
221 
222 	Return @code{TRUE} if the full section contents is retrieved
223 	successfully.  If the section has no contents then this function
224 	returns @code{TRUE} but @var{*ptr} is set to NULL.
225 */
226 
227 bfd_boolean
228 bfd_get_full_section_contents (bfd *abfd, sec_ptr sec, bfd_byte **ptr)
229 {
230   bfd_size_type sz;
231   bfd_byte *p = *ptr;
232   bfd_boolean ret;
233   bfd_size_type save_size;
234   bfd_size_type save_rawsize;
235   bfd_byte *compressed_buffer;
236   unsigned int compression_header_size;
237 
238   if (abfd->direction != write_direction && sec->rawsize != 0)
239     sz = sec->rawsize;
240   else
241     sz = sec->size;
242   if (sz == 0)
243     {
244       *ptr = NULL;
245       return TRUE;
246     }
247 
248   switch (sec->compress_status)
249     {
250     case COMPRESS_SECTION_NONE:
251       if (p == NULL)
252 	{
253 	  p = (bfd_byte *) bfd_malloc (sz);
254 	  if (p == NULL)
255 	    {
256 	      /* PR 20801: Provide a more helpful error message.  */
257 	      if (bfd_get_error () == bfd_error_no_memory)
258 		_bfd_error_handler
259 		  /* xgettext:c-format */
260 		  (_("error: %pB(%pA) is too large (%#" PRIx64 " bytes)"),
261 		  abfd, sec, (uint64_t) sz);
262 	      return FALSE;
263 	    }
264 	}
265 
266       if (!bfd_get_section_contents (abfd, sec, p, 0, sz))
267 	{
268 	  if (*ptr != p)
269 	    free (p);
270 	  return FALSE;
271 	}
272       *ptr = p;
273       return TRUE;
274 
275     case DECOMPRESS_SECTION_SIZED:
276       /* Read in the full compressed section contents.  */
277       compressed_buffer = (bfd_byte *) bfd_malloc (sec->compressed_size);
278       if (compressed_buffer == NULL)
279 	return FALSE;
280       save_rawsize = sec->rawsize;
281       save_size = sec->size;
282       /* Clear rawsize, set size to compressed size and set compress_status
283 	 to COMPRESS_SECTION_NONE.  If the compressed size is bigger than
284 	 the uncompressed size, bfd_get_section_contents will fail.  */
285       sec->rawsize = 0;
286       sec->size = sec->compressed_size;
287       sec->compress_status = COMPRESS_SECTION_NONE;
288       ret = bfd_get_section_contents (abfd, sec, compressed_buffer,
289 				      0, sec->compressed_size);
290       /* Restore rawsize and size.  */
291       sec->rawsize = save_rawsize;
292       sec->size = save_size;
293       sec->compress_status = DECOMPRESS_SECTION_SIZED;
294       if (!ret)
295 	goto fail_compressed;
296 
297       if (p == NULL)
298 	p = (bfd_byte *) bfd_malloc (sz);
299       if (p == NULL)
300 	goto fail_compressed;
301 
302       compression_header_size = bfd_get_compression_header_size (abfd, sec);
303       if (compression_header_size == 0)
304 	/* Set header size to the zlib header size if it is a
305 	   SHF_COMPRESSED section.  */
306 	compression_header_size = 12;
307       if (!decompress_contents (compressed_buffer + compression_header_size,
308 				sec->compressed_size - compression_header_size, p, sz))
309 	{
310 	  bfd_set_error (bfd_error_bad_value);
311 	  if (p != *ptr)
312 	    free (p);
313 	fail_compressed:
314 	  free (compressed_buffer);
315 	  return FALSE;
316 	}
317 
318       free (compressed_buffer);
319       *ptr = p;
320       return TRUE;
321 
322     case COMPRESS_SECTION_DONE:
323       if (sec->contents == NULL)
324 	return FALSE;
325       if (p == NULL)
326 	{
327 	  p = (bfd_byte *) bfd_malloc (sz);
328 	  if (p == NULL)
329 	    return FALSE;
330 	  *ptr = p;
331 	}
332       /* PR 17512; file: 5bc29788.  */
333       if (p != sec->contents)
334 	memcpy (p, sec->contents, sz);
335       return TRUE;
336 
337     default:
338       abort ();
339     }
340 }
341 
342 /*
343 FUNCTION
344 	bfd_cache_section_contents
345 
346 SYNOPSIS
347 	void bfd_cache_section_contents
348 	  (asection *sec, void *contents);
349 
350 DESCRIPTION
351 	Stash @var(contents) so any following reads of @var(sec) do
352 	not need to decompress again.
353 */
354 
355 void
356 bfd_cache_section_contents (asection *sec, void *contents)
357 {
358   if (sec->compress_status == DECOMPRESS_SECTION_SIZED)
359     sec->compress_status = COMPRESS_SECTION_DONE;
360   sec->contents = contents;
361   sec->flags |= SEC_IN_MEMORY;
362 }
363 
364 /*
365 FUNCTION
366 	bfd_is_section_compressed_with_header
367 
368 SYNOPSIS
369 	bfd_boolean bfd_is_section_compressed_with_header
370 	  (bfd *abfd, asection *section,
371 	  int *compression_header_size_p,
372 	  bfd_size_type *uncompressed_size_p,
373 	  unsigned int *uncompressed_alignment_power_p);
374 
375 DESCRIPTION
376 	Return @code{TRUE} if @var{section} is compressed.  Compression
377 	header size is returned in @var{compression_header_size_p},
378 	uncompressed size is returned in @var{uncompressed_size_p}
379 	and the uncompressed data alignement power is returned in
380 	@var{uncompressed_align_pow_p}.  If compression is
381 	unsupported, compression header size is returned with -1
382 	and uncompressed size is returned with 0.
383 */
384 
385 bfd_boolean
386 bfd_is_section_compressed_with_header (bfd *abfd, sec_ptr sec,
387 				       int *compression_header_size_p,
388 				       bfd_size_type *uncompressed_size_p,
389 				       unsigned int *uncompressed_align_pow_p)
390 {
391   bfd_byte header[MAX_COMPRESSION_HEADER_SIZE];
392   int compression_header_size;
393   int header_size;
394   unsigned int saved = sec->compress_status;
395   bfd_boolean compressed;
396 
397   *uncompressed_align_pow_p = 0;
398 
399   compression_header_size = bfd_get_compression_header_size (abfd, sec);
400   if (compression_header_size > MAX_COMPRESSION_HEADER_SIZE)
401     abort ();
402   header_size = compression_header_size ? compression_header_size : 12;
403 
404   /* Don't decompress the section.  */
405   sec->compress_status = COMPRESS_SECTION_NONE;
406 
407   /* Read the header.  */
408   if (bfd_get_section_contents (abfd, sec, header, 0, header_size))
409     {
410       if (compression_header_size == 0)
411 	/* In this case, it should be "ZLIB" followed by the uncompressed
412 	   section size, 8 bytes in big-endian order.  */
413 	compressed = CONST_STRNEQ ((char*) header , "ZLIB");
414       else
415 	compressed = TRUE;
416     }
417   else
418     compressed = FALSE;
419 
420   *uncompressed_size_p = sec->size;
421   if (compressed)
422     {
423       if (compression_header_size != 0)
424 	{
425 	  if (!bfd_check_compression_header (abfd, header, sec,
426 					     uncompressed_size_p,
427 					     uncompressed_align_pow_p))
428 	    compression_header_size = -1;
429 	}
430       /* Check for the pathalogical case of a debug string section that
431 	 contains the string ZLIB.... as the first entry.  We assume that
432 	 no uncompressed .debug_str section would ever be big enough to
433 	 have the first byte of its (big-endian) size be non-zero.  */
434       else if (strcmp (sec->name, ".debug_str") == 0
435 	       && ISPRINT (header[4]))
436 	compressed = FALSE;
437       else
438 	*uncompressed_size_p = bfd_getb64 (header + 4);
439     }
440 
441   /* Restore compress_status.  */
442   sec->compress_status = saved;
443   *compression_header_size_p = compression_header_size;
444   return compressed;
445 }
446 
447 /*
448 FUNCTION
449 	bfd_is_section_compressed
450 
451 SYNOPSIS
452 	bfd_boolean bfd_is_section_compressed
453 	  (bfd *abfd, asection *section);
454 
455 DESCRIPTION
456 	Return @code{TRUE} if @var{section} is compressed.
457 */
458 
459 bfd_boolean
460 bfd_is_section_compressed (bfd *abfd, sec_ptr sec)
461 {
462   int compression_header_size;
463   bfd_size_type uncompressed_size;
464   unsigned int uncompressed_align_power;
465   return (bfd_is_section_compressed_with_header (abfd, sec,
466 						 &compression_header_size,
467 						 &uncompressed_size,
468 						 &uncompressed_align_power)
469 	  && compression_header_size >= 0
470 	  && uncompressed_size > 0);
471 }
472 
473 /*
474 FUNCTION
475 	bfd_init_section_decompress_status
476 
477 SYNOPSIS
478 	bfd_boolean bfd_init_section_decompress_status
479 	  (bfd *abfd, asection *section);
480 
481 DESCRIPTION
482 	Record compressed section size, update section size with
483 	decompressed size and set compress_status to
484 	DECOMPRESS_SECTION_SIZED.
485 
486 	Return @code{FALSE} if the section is not a valid compressed
487 	section.  Otherwise, return @code{TRUE}.
488 */
489 
490 bfd_boolean
491 bfd_init_section_decompress_status (bfd *abfd, sec_ptr sec)
492 {
493   bfd_byte header[MAX_COMPRESSION_HEADER_SIZE];
494   int compression_header_size;
495   int header_size;
496   bfd_size_type uncompressed_size;
497   unsigned int uncompressed_alignment_power = 0;
498 
499   compression_header_size = bfd_get_compression_header_size (abfd, sec);
500   if (compression_header_size > MAX_COMPRESSION_HEADER_SIZE)
501     abort ();
502   header_size = compression_header_size ? compression_header_size : 12;
503 
504   /* Read the header.  */
505   if (sec->rawsize != 0
506       || sec->contents != NULL
507       || sec->compress_status != COMPRESS_SECTION_NONE
508       || !bfd_get_section_contents (abfd, sec, header, 0, header_size))
509     {
510       bfd_set_error (bfd_error_invalid_operation);
511       return FALSE;
512     }
513 
514   if (compression_header_size == 0)
515     {
516       /* In this case, it should be "ZLIB" followed by the uncompressed
517 	 section size, 8 bytes in big-endian order.  */
518       if (! CONST_STRNEQ ((char*) header, "ZLIB"))
519 	{
520 	  bfd_set_error (bfd_error_wrong_format);
521 	  return FALSE;
522 	}
523       uncompressed_size = bfd_getb64 (header + 4);
524     }
525   else if (!bfd_check_compression_header (abfd, header, sec,
526 					  &uncompressed_size,
527 					  &uncompressed_alignment_power))
528     {
529       bfd_set_error (bfd_error_wrong_format);
530       return FALSE;
531     }
532 
533   sec->compressed_size = sec->size;
534   sec->size = uncompressed_size;
535   bfd_set_section_alignment (abfd, sec, uncompressed_alignment_power);
536   sec->compress_status = DECOMPRESS_SECTION_SIZED;
537 
538   return TRUE;
539 }
540 
541 /*
542 FUNCTION
543 	bfd_init_section_compress_status
544 
545 SYNOPSIS
546 	bfd_boolean bfd_init_section_compress_status
547 	  (bfd *abfd, asection *section);
548 
549 DESCRIPTION
550 	If open for read, compress section, update section size with
551 	compressed size and set compress_status to COMPRESS_SECTION_DONE.
552 
553 	Return @code{FALSE} if the section is not a valid compressed
554 	section.  Otherwise, return @code{TRUE}.
555 */
556 
557 bfd_boolean
558 bfd_init_section_compress_status (bfd *abfd, sec_ptr sec)
559 {
560   bfd_size_type uncompressed_size;
561   bfd_byte *uncompressed_buffer;
562 
563   /* Error if not opened for read.  */
564   if (abfd->direction != read_direction
565       || sec->size == 0
566       || sec->rawsize != 0
567       || sec->contents != NULL
568       || sec->compress_status != COMPRESS_SECTION_NONE)
569     {
570       bfd_set_error (bfd_error_invalid_operation);
571       return FALSE;
572     }
573 
574   /* Read in the full section contents and compress it.  */
575   uncompressed_size = sec->size;
576   uncompressed_buffer = (bfd_byte *) bfd_malloc (uncompressed_size);
577   /* PR 21431 */
578   if (uncompressed_buffer == NULL)
579     return FALSE;
580 
581   if (!bfd_get_section_contents (abfd, sec, uncompressed_buffer,
582 				 0, uncompressed_size))
583     return FALSE;
584 
585   uncompressed_size = bfd_compress_section_contents (abfd, sec,
586 						     uncompressed_buffer,
587 						     uncompressed_size);
588   return uncompressed_size != 0;
589 }
590 
591 /*
592 FUNCTION
593 	bfd_compress_section
594 
595 SYNOPSIS
596 	bfd_boolean bfd_compress_section
597 	  (bfd *abfd, asection *section, bfd_byte *uncompressed_buffer);
598 
599 DESCRIPTION
600 	If open for write, compress section, update section size with
601 	compressed size and set compress_status to COMPRESS_SECTION_DONE.
602 
603 	Return @code{FALSE} if compression fail.  Otherwise, return
604 	@code{TRUE}.
605 */
606 
607 bfd_boolean
608 bfd_compress_section (bfd *abfd, sec_ptr sec, bfd_byte *uncompressed_buffer)
609 {
610   bfd_size_type uncompressed_size = sec->size;
611 
612   /* Error if not opened for write.  */
613   if (abfd->direction != write_direction
614       || uncompressed_size == 0
615       || uncompressed_buffer == NULL
616       || sec->contents != NULL
617       || sec->compressed_size != 0
618       || sec->compress_status != COMPRESS_SECTION_NONE)
619     {
620       bfd_set_error (bfd_error_invalid_operation);
621       return FALSE;
622     }
623 
624   /* Compress it.  */
625   return bfd_compress_section_contents (abfd, sec, uncompressed_buffer,
626 					uncompressed_size) != 0;
627 }
628