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