Enforce 16 MB upper bound of memory usage in LZMA decoder.

This patch changes two things in our LZMA compression backend:

- We lower the preset values for all `compression_level_t` values to
  ensure that we can run the LZMA decoder with less than 65 MB of memory
  available. This seems to have a small impact on the real world usage
  and fits well with our needs.

- We set the upper bound of memory usage for the LZMA decoder to 16 MB.

See: https://bugs.torproject.org/21665
This commit is contained in:
Alexander Færøy 2017-04-27 20:09:20 +02:00
parent e5122b91a9
commit 0672b33f1e
No known key found for this signature in database
GPG Key ID: E15081D5D3C3DB53

View File

@ -22,6 +22,9 @@
#include <lzma.h> #include <lzma.h>
#endif #endif
/** The maximum amount of memory we allow the LZMA decoder to use, in bytes. */
#define MEMORY_LIMIT (16 * 1024 * 1024)
/** Total number of bytes allocated for LZMA state. */ /** Total number of bytes allocated for LZMA state. */
static atomic_counter_t total_lzma_allocation; static atomic_counter_t total_lzma_allocation;
@ -33,9 +36,9 @@ memory_level(compression_level_t level)
switch (level) { switch (level) {
default: default:
case BEST_COMPRESSION: case BEST_COMPRESSION:
case HIGH_COMPRESSION: return 9; case HIGH_COMPRESSION: return 6;
case MEDIUM_COMPRESSION: return 6; case MEDIUM_COMPRESSION: return 4;
case LOW_COMPRESSION: return 3; case LOW_COMPRESSION: return 2;
} }
} }
@ -191,9 +194,7 @@ tor_lzma_compress_new(int compress,
goto err; goto err;
} }
} else { } else {
// FIXME(ahf): This should be something more sensible than retval = lzma_alone_decoder(&result->stream, MEMORY_LIMIT);
// UINT64_MAX: See #21665.
retval = lzma_alone_decoder(&result->stream, UINT64_MAX);
if (retval != LZMA_OK) { if (retval != LZMA_OK) {
log_warn(LD_GENERAL, "Error from LZMA decoder: %s (%u).", log_warn(LD_GENERAL, "Error from LZMA decoder: %s (%u).",