]> icculus.org git repositories - icculus/xz.git/blob - src/xz/coder.c
Disable the memory usage limiter by default.
[icculus/xz.git] / src / xz / coder.c
1 ///////////////////////////////////////////////////////////////////////////////
2 //
3 /// \file       coder.c
4 /// \brief      Compresses or uncompresses a file
5 //
6 //  Author:     Lasse Collin
7 //
8 //  This file has been put into the public domain.
9 //  You can do whatever you want with this file.
10 //
11 ///////////////////////////////////////////////////////////////////////////////
12
13 #include "private.h"
14
15
16 /// Return value type for coder_init().
17 enum coder_init_ret {
18         CODER_INIT_NORMAL,
19         CODER_INIT_PASSTHRU,
20         CODER_INIT_ERROR,
21 };
22
23
24 enum operation_mode opt_mode = MODE_COMPRESS;
25 enum format_type opt_format = FORMAT_AUTO;
26 bool opt_auto_adjust = true;
27
28
29 /// Stream used to communicate with liblzma
30 static lzma_stream strm = LZMA_STREAM_INIT;
31
32 /// Filters needed for all encoding all formats, and also decoding in raw data
33 static lzma_filter filters[LZMA_FILTERS_MAX + 1];
34
35 /// Input and output buffers
36 static io_buf in_buf;
37 static io_buf out_buf;
38
39 /// Number of filters. Zero indicates that we are using a preset.
40 static size_t filters_count = 0;
41
42 /// Number of the preset (0-9)
43 static size_t preset_number = 6;
44
45 /// Indicate if no preset has been explicitly given. In that case, if we need
46 /// to auto-adjust for lower memory usage, we won't print a warning.
47 static bool preset_default = true;
48
49 /// If a preset is used (no custom filter chain) and preset_extreme is true,
50 /// a significantly slower compression is used to achieve slightly better
51 /// compression ratio.
52 static bool preset_extreme = false;
53
54 /// Integrity check type
55 static lzma_check check;
56
57 /// This becomes false if the --check=CHECK option is used.
58 static bool check_default = true;
59
60
61 extern void
62 coder_set_check(lzma_check new_check)
63 {
64         check = new_check;
65         check_default = false;
66         return;
67 }
68
69
70 extern void
71 coder_set_preset(size_t new_preset)
72 {
73         preset_number = new_preset;
74         preset_default = false;
75         return;
76 }
77
78
79 extern void
80 coder_set_extreme(void)
81 {
82         preset_extreme = true;
83         return;
84 }
85
86
87 extern void
88 coder_add_filter(lzma_vli id, void *options)
89 {
90         if (filters_count == LZMA_FILTERS_MAX)
91                 message_fatal(_("Maximum number of filters is four"));
92
93         filters[filters_count].id = id;
94         filters[filters_count].options = options;
95         ++filters_count;
96
97         return;
98 }
99
100
101 static void lzma_attribute((noreturn))
102 memlimit_too_small(uint64_t memory_usage)
103 {
104         message(V_ERROR, _("Memory usage limit is too low for the given "
105                         "filter setup."));
106         message_mem_needed(V_ERROR, memory_usage);
107         tuklib_exit(E_ERROR, E_ERROR, false);
108 }
109
110
111 extern void
112 coder_set_compression_settings(void)
113 {
114         // Options for LZMA1 or LZMA2 in case we are using a preset.
115         static lzma_options_lzma opt_lzma;
116
117         if (filters_count == 0) {
118                 // We are using a preset. This is not a good idea in raw mode
119                 // except when playing around with things. Different versions
120                 // of this software may use different options in presets, and
121                 // thus make uncompressing the raw data difficult.
122                 if (opt_format == FORMAT_RAW) {
123                         // The message is shown only if warnings are allowed
124                         // but the exit status isn't changed.
125                         message(V_WARNING, _("Using a preset in raw mode "
126                                         "is discouraged."));
127                         message(V_WARNING, _("The exact options of the "
128                                         "presets may vary between software "
129                                         "versions."));
130                 }
131
132                 // Get the preset for LZMA1 or LZMA2.
133                 if (preset_extreme)
134                         preset_number |= LZMA_PRESET_EXTREME;
135
136                 if (lzma_lzma_preset(&opt_lzma, preset_number))
137                         message_bug();
138
139                 // Use LZMA2 except with --format=lzma we use LZMA1.
140                 filters[0].id = opt_format == FORMAT_LZMA
141                                 ? LZMA_FILTER_LZMA1 : LZMA_FILTER_LZMA2;
142                 filters[0].options = &opt_lzma;
143                 filters_count = 1;
144         } else {
145                 preset_default = false;
146         }
147
148         // Terminate the filter options array.
149         filters[filters_count].id = LZMA_VLI_UNKNOWN;
150
151         // If we are using the .lzma format, allow exactly one filter
152         // which has to be LZMA1.
153         if (opt_format == FORMAT_LZMA && (filters_count != 1
154                         || filters[0].id != LZMA_FILTER_LZMA1))
155                 message_fatal(_("The .lzma format supports only "
156                                 "the LZMA1 filter"));
157
158         // If we are using the .xz format, make sure that there is no LZMA1
159         // filter to prevent LZMA_PROG_ERROR.
160         if (opt_format == FORMAT_XZ)
161                 for (size_t i = 0; i < filters_count; ++i)
162                         if (filters[i].id == LZMA_FILTER_LZMA1)
163                                 message_fatal(_("LZMA1 cannot be used "
164                                                 "with the .xz format"));
165
166         // Print the selected filter chain.
167         message_filters_show(V_DEBUG, filters);
168
169         // If using --format=raw, we can be decoding. The memusage function
170         // also validates the filter chain and the options used for the
171         // filters.
172         const uint64_t memory_limit = hardware_memlimit_get(opt_mode);
173         uint64_t memory_usage;
174         if (opt_mode == MODE_COMPRESS)
175                 memory_usage = lzma_raw_encoder_memusage(filters);
176         else
177                 memory_usage = lzma_raw_decoder_memusage(filters);
178
179         if (memory_usage == UINT64_MAX)
180                 message_fatal(_("Unsupported filter chain or filter options"));
181
182         // Print memory usage info before possible dictionary
183         // size auto-adjusting.
184         message_mem_needed(V_DEBUG, memory_usage);
185
186         if (memory_usage > memory_limit) {
187                 // If --no-auto-adjust was used or we didn't find LZMA1 or
188                 // LZMA2 as the last filter, give an error immediately.
189                 // --format=raw implies --no-auto-adjust.
190                 if (!opt_auto_adjust || opt_format == FORMAT_RAW)
191                         memlimit_too_small(memory_usage);
192
193                 assert(opt_mode == MODE_COMPRESS);
194
195                 // Look for the last filter if it is LZMA2 or LZMA1, so
196                 // we can make it use less RAM. With other filters we don't
197                 // know what to do.
198                 size_t i = 0;
199                 while (filters[i].id != LZMA_FILTER_LZMA2
200                                 && filters[i].id != LZMA_FILTER_LZMA1) {
201                         if (filters[i].id == LZMA_VLI_UNKNOWN)
202                                 memlimit_too_small(memory_usage);
203
204                         ++i;
205                 }
206
207                 // Decrease the dictionary size until we meet the memory
208                 // usage limit. First round down to full mebibytes.
209                 lzma_options_lzma *opt = filters[i].options;
210                 const uint32_t orig_dict_size = opt->dict_size;
211                 opt->dict_size &= ~((UINT32_C(1) << 20) - 1);
212                 while (true) {
213                         // If it is below 1 MiB, auto-adjusting failed. We
214                         // could be more sophisticated and scale it down even
215                         // more, but let's see if many complain about this
216                         // version.
217                         //
218                         // FIXME: Displays the scaled memory usage instead
219                         // of the original.
220                         if (opt->dict_size < (UINT32_C(1) << 20))
221                                 memlimit_too_small(memory_usage);
222
223                         memory_usage = lzma_raw_encoder_memusage(filters);
224                         if (memory_usage == UINT64_MAX)
225                                 message_bug();
226
227                         // Accept it if it is low enough.
228                         if (memory_usage <= memory_limit)
229                                 break;
230
231                         // Otherwise 1 MiB down and try again. I hope this
232                         // isn't too slow method for cases where the original
233                         // dict_size is very big.
234                         opt->dict_size -= UINT32_C(1) << 20;
235                 }
236
237                 // Tell the user that we decreased the dictionary size.
238                 // However, omit the message if no preset or custom chain
239                 // was given. FIXME: Always warn?
240                 if (!preset_default)
241                         message(V_WARNING, _("Adjusted LZMA%c dictionary size "
242                                         "from %s MiB to %s MiB to not exceed "
243                                         "the memory usage limit of %s MiB"),
244                                         filters[i].id == LZMA_FILTER_LZMA2
245                                                 ? '2' : '1',
246                                         uint64_to_str(orig_dict_size >> 20, 0),
247                                         uint64_to_str(opt->dict_size >> 20, 1),
248                                         uint64_to_str(round_up_to_mib(
249                                                 memory_limit), 2));
250         }
251
252 /*
253         // Limit the number of worker threads so that memory usage
254         // limit isn't exceeded.
255         assert(memory_usage > 0);
256         size_t thread_limit = memory_limit / memory_usage;
257         if (thread_limit == 0)
258                 thread_limit = 1;
259
260         if (opt_threads > thread_limit)
261                 opt_threads = thread_limit;
262 */
263
264         if (check_default) {
265                 // The default check type is CRC64, but fallback to CRC32
266                 // if CRC64 isn't supported by the copy of liblzma we are
267                 // using. CRC32 is always supported.
268                 check = LZMA_CHECK_CRC64;
269                 if (!lzma_check_is_supported(check))
270                         check = LZMA_CHECK_CRC32;
271         }
272
273         return;
274 }
275
276
277 /// Return true if the data in in_buf seems to be in the .xz format.
278 static bool
279 is_format_xz(void)
280 {
281         return strm.avail_in >= 6 && memcmp(in_buf.u8, "\3757zXZ", 6) == 0;
282 }
283
284
285 /// Return true if the data in in_buf seems to be in the .lzma format.
286 static bool
287 is_format_lzma(void)
288 {
289         // The .lzma header is 13 bytes.
290         if (strm.avail_in < 13)
291                 return false;
292
293         // Decode the LZMA1 properties.
294         lzma_filter filter = { .id = LZMA_FILTER_LZMA1 };
295         if (lzma_properties_decode(&filter, NULL, in_buf.u8, 5) != LZMA_OK)
296                 return false;
297
298         // A hack to ditch tons of false positives: We allow only dictionary
299         // sizes that are 2^n or 2^n + 2^(n-1) or UINT32_MAX. LZMA_Alone
300         // created only files with 2^n, but accepts any dictionary size.
301         // If someone complains, this will be reconsidered.
302         lzma_options_lzma *opt = filter.options;
303         const uint32_t dict_size = opt->dict_size;
304         free(opt);
305
306         if (dict_size != UINT32_MAX) {
307                 uint32_t d = dict_size - 1;
308                 d |= d >> 2;
309                 d |= d >> 3;
310                 d |= d >> 4;
311                 d |= d >> 8;
312                 d |= d >> 16;
313                 ++d;
314                 if (d != dict_size || dict_size == 0)
315                         return false;
316         }
317
318         // Another hack to ditch false positives: Assume that if the
319         // uncompressed size is known, it must be less than 256 GiB.
320         // Again, if someone complains, this will be reconsidered.
321         uint64_t uncompressed_size = 0;
322         for (size_t i = 0; i < 8; ++i)
323                 uncompressed_size |= (uint64_t)(in_buf.u8[5 + i]) << (i * 8);
324
325         if (uncompressed_size != UINT64_MAX
326                         && uncompressed_size > (UINT64_C(1) << 38))
327                 return false;
328
329         return true;
330 }
331
332
333 /// Detect the input file type (for now, this done only when decompressing),
334 /// and initialize an appropriate coder. Return value indicates if a normal
335 /// liblzma-based coder was initialized (CODER_INIT_NORMAL), if passthru
336 /// mode should be used (CODER_INIT_PASSTHRU), or if an error occurred
337 /// (CODER_INIT_ERROR).
338 static enum coder_init_ret
339 coder_init(file_pair *pair)
340 {
341         lzma_ret ret = LZMA_PROG_ERROR;
342
343         if (opt_mode == MODE_COMPRESS) {
344                 switch (opt_format) {
345                 case FORMAT_AUTO:
346                         // args.c ensures this.
347                         assert(0);
348                         break;
349
350                 case FORMAT_XZ:
351                         ret = lzma_stream_encoder(&strm, filters, check);
352                         break;
353
354                 case FORMAT_LZMA:
355                         ret = lzma_alone_encoder(&strm, filters[0].options);
356                         break;
357
358                 case FORMAT_RAW:
359                         ret = lzma_raw_encoder(&strm, filters);
360                         break;
361                 }
362         } else {
363                 const uint32_t flags = LZMA_TELL_UNSUPPORTED_CHECK
364                                 | LZMA_CONCATENATED;
365
366                 // We abuse FORMAT_AUTO to indicate unknown file format,
367                 // for which we may consider passthru mode.
368                 enum format_type init_format = FORMAT_AUTO;
369
370                 switch (opt_format) {
371                 case FORMAT_AUTO:
372                         if (is_format_xz())
373                                 init_format = FORMAT_XZ;
374                         else if (is_format_lzma())
375                                 init_format = FORMAT_LZMA;
376                         break;
377
378                 case FORMAT_XZ:
379                         if (is_format_xz())
380                                 init_format = FORMAT_XZ;
381                         break;
382
383                 case FORMAT_LZMA:
384                         if (is_format_lzma())
385                                 init_format = FORMAT_LZMA;
386                         break;
387
388                 case FORMAT_RAW:
389                         init_format = FORMAT_RAW;
390                         break;
391                 }
392
393                 switch (init_format) {
394                 case FORMAT_AUTO:
395                         // Uknown file format. If --decompress --stdout
396                         // --force have been given, then we copy the input
397                         // as is to stdout. Checking for MODE_DECOMPRESS
398                         // is needed, because we don't want to do use
399                         // passthru mode with --test.
400                         if (opt_mode == MODE_DECOMPRESS
401                                         && opt_stdout && opt_force)
402                                 return CODER_INIT_PASSTHRU;
403
404                         ret = LZMA_FORMAT_ERROR;
405                         break;
406
407                 case FORMAT_XZ:
408                         ret = lzma_stream_decoder(&strm,
409                                         hardware_memlimit_get(
410                                                 MODE_DECOMPRESS), flags);
411                         break;
412
413                 case FORMAT_LZMA:
414                         ret = lzma_alone_decoder(&strm,
415                                         hardware_memlimit_get(
416                                                 MODE_DECOMPRESS));
417                         break;
418
419                 case FORMAT_RAW:
420                         // Memory usage has already been checked in
421                         // coder_set_compression_settings().
422                         ret = lzma_raw_decoder(&strm, filters);
423                         break;
424                 }
425
426                 // Try to decode the headers. This will catch too low
427                 // memory usage limit in case it happens in the first
428                 // Block of the first Stream, which is where it very
429                 // probably will happen if it is going to happen.
430                 if (ret == LZMA_OK && init_format != FORMAT_RAW) {
431                         strm.next_out = NULL;
432                         strm.avail_out = 0;
433                         ret = lzma_code(&strm, LZMA_RUN);
434                 }
435         }
436
437         if (ret != LZMA_OK) {
438                 message_error("%s: %s", pair->src_name, message_strm(ret));
439                 if (ret == LZMA_MEMLIMIT_ERROR)
440                         message_mem_needed(V_ERROR, lzma_memusage(&strm));
441
442                 return CODER_INIT_ERROR;
443         }
444
445         return CODER_INIT_NORMAL;
446 }
447
448
449 /// Compress or decompress using liblzma.
450 static bool
451 coder_normal(file_pair *pair)
452 {
453         // Encoder needs to know when we have given all the input to it.
454         // The decoders need to know it too when we are using
455         // LZMA_CONCATENATED. We need to check for src_eof here, because
456         // the first input chunk has been already read, and that may
457         // have been the only chunk we will read.
458         lzma_action action = pair->src_eof ? LZMA_FINISH : LZMA_RUN;
459
460         lzma_ret ret;
461
462         // Assume that something goes wrong.
463         bool success = false;
464
465         strm.next_out = out_buf.u8;
466         strm.avail_out = IO_BUFFER_SIZE;
467
468         while (!user_abort) {
469                 // Fill the input buffer if it is empty and we haven't reached
470                 // end of file yet.
471                 if (strm.avail_in == 0 && !pair->src_eof) {
472                         strm.next_in = in_buf.u8;
473                         strm.avail_in = io_read(
474                                         pair, &in_buf, IO_BUFFER_SIZE);
475
476                         if (strm.avail_in == SIZE_MAX)
477                                 break;
478
479                         if (pair->src_eof)
480                                 action = LZMA_FINISH;
481                 }
482
483                 // Let liblzma do the actual work.
484                 ret = lzma_code(&strm, action);
485
486                 // Write out if the output buffer became full.
487                 if (strm.avail_out == 0) {
488                         if (opt_mode != MODE_TEST && io_write(pair, &out_buf,
489                                         IO_BUFFER_SIZE - strm.avail_out))
490                                 break;
491
492                         strm.next_out = out_buf.u8;
493                         strm.avail_out = IO_BUFFER_SIZE;
494                 }
495
496                 if (ret != LZMA_OK) {
497                         // Determine if the return value indicates that we
498                         // won't continue coding.
499                         const bool stop = ret != LZMA_NO_CHECK
500                                         && ret != LZMA_UNSUPPORTED_CHECK;
501
502                         if (stop) {
503                                 // Write the remaining bytes even if something
504                                 // went wrong, because that way the user gets
505                                 // as much data as possible, which can be good
506                                 // when trying to get at least some useful
507                                 // data out of damaged files.
508                                 if (opt_mode != MODE_TEST && io_write(pair,
509                                                 &out_buf, IO_BUFFER_SIZE
510                                                         - strm.avail_out))
511                                         break;
512                         }
513
514                         if (ret == LZMA_STREAM_END) {
515                                 // Check that there is no trailing garbage.
516                                 // This is needed for LZMA_Alone and raw
517                                 // streams.
518                                 if (strm.avail_in == 0 && !pair->src_eof) {
519                                         // Try reading one more byte.
520                                         // Hopefully we don't get any more
521                                         // input, and thus pair->src_eof
522                                         // becomes true.
523                                         strm.avail_in = io_read(
524                                                         pair, &in_buf, 1);
525                                         if (strm.avail_in == SIZE_MAX)
526                                                 break;
527
528                                         assert(strm.avail_in == 0
529                                                         || strm.avail_in == 1);
530                                 }
531
532                                 if (strm.avail_in == 0) {
533                                         assert(pair->src_eof);
534                                         success = true;
535                                         break;
536                                 }
537
538                                 // We hadn't reached the end of the file.
539                                 ret = LZMA_DATA_ERROR;
540                                 assert(stop);
541                         }
542
543                         // If we get here and stop is true, something went
544                         // wrong and we print an error. Otherwise it's just
545                         // a warning and coding can continue.
546                         if (stop) {
547                                 message_error("%s: %s", pair->src_name,
548                                                 message_strm(ret));
549                         } else {
550                                 message_warning("%s: %s", pair->src_name,
551                                                 message_strm(ret));
552
553                                 // When compressing, all possible errors set
554                                 // stop to true.
555                                 assert(opt_mode != MODE_COMPRESS);
556                         }
557
558                         if (ret == LZMA_MEMLIMIT_ERROR) {
559                                 // Display how much memory it would have
560                                 // actually needed.
561                                 message_mem_needed(V_ERROR,
562                                                 lzma_memusage(&strm));
563                         }
564
565                         if (stop)
566                                 break;
567                 }
568
569                 // Show progress information under certain conditions.
570                 message_progress_update();
571         }
572
573         return success;
574 }
575
576
577 /// Copy from input file to output file without processing the data in any
578 /// way. This is used only when trying to decompress unrecognized files
579 /// with --decompress --stdout --force, so the output is always stdout.
580 static bool
581 coder_passthru(file_pair *pair)
582 {
583         while (strm.avail_in != 0) {
584                 if (user_abort)
585                         return false;
586
587                 if (io_write(pair, &in_buf, strm.avail_in))
588                         return false;
589
590                 strm.total_in += strm.avail_in;
591                 strm.total_out = strm.total_in;
592                 message_progress_update();
593
594                 strm.avail_in = io_read(pair, &in_buf, IO_BUFFER_SIZE);
595                 if (strm.avail_in == SIZE_MAX)
596                         return false;
597         }
598
599         return true;
600 }
601
602
603 extern void
604 coder_run(const char *filename)
605 {
606         // Set and possibly print the filename for the progress message.
607         message_filename(filename);
608
609         // Try to open the input file.
610         file_pair *pair = io_open_src(filename);
611         if (pair == NULL)
612                 return;
613
614         // Assume that something goes wrong.
615         bool success = false;
616
617         // Read the first chunk of input data. This is needed to detect
618         // the input file type (for now, only for decompression).
619         strm.next_in = in_buf.u8;
620         strm.avail_in = io_read(pair, &in_buf, IO_BUFFER_SIZE);
621
622         if (strm.avail_in != SIZE_MAX) {
623                 // Initialize the coder. This will detect the file format
624                 // and, in decompression or testing mode, check the memory
625                 // usage of the first Block too. This way we don't try to
626                 // open the destination file if we see that coding wouldn't
627                 // work at all anyway. This also avoids deleting the old
628                 // "target" file if --force was used.
629                 const enum coder_init_ret init_ret = coder_init(pair);
630
631                 if (init_ret != CODER_INIT_ERROR && !user_abort) {
632                         // Don't open the destination file when --test
633                         // is used.
634                         if (opt_mode == MODE_TEST || !io_open_dest(pair)) {
635                                 // Initialize the progress indicator.
636                                 const uint64_t in_size
637                                                 = pair->src_st.st_size <= 0
638                                                 ? 0 : pair->src_st.st_size;
639                                 message_progress_start(&strm, in_size);
640
641                                 // Do the actual coding or passthru.
642                                 if (init_ret == CODER_INIT_NORMAL)
643                                         success = coder_normal(pair);
644                                 else
645                                         success = coder_passthru(pair);
646
647                                 message_progress_end(success);
648                         }
649                 }
650         }
651
652         // Close the file pair. It needs to know if coding was successful to
653         // know if the source or target file should be unlinked.
654         io_close(pair, success);
655
656         return;
657 }