commit cf912259ba491e51f6f211e186ff67605ff269c8 Author: Alexander Færøy ahf@torproject.org Date: Mon Apr 24 14:20:16 2017 +0200
Remove `tor_compress_memory_level()`.
This patch splits up `tor_compress_memory_level()` into static functions in the individual compression backends, which allows us to tune the values per compression backend rather than globally.
See: https://bugs.torproject.org/21662 --- src/common/compress.c | 14 -------------- src/common/compress.h | 3 --- src/common/compress_lzma.c | 16 ++++++++++++++-- src/common/compress_zlib.c | 16 ++++++++++++++-- src/common/compress_zstd.c | 18 ++++++++++++++++-- 5 files changed, 44 insertions(+), 23 deletions(-)
diff --git a/src/common/compress.c b/src/common/compress.c index 8b49af8..38b8184 100644 --- a/src/common/compress.c +++ b/src/common/compress.c @@ -56,20 +56,6 @@ tor_compress_is_compression_bomb(size_t size_in, size_t size_out) return (size_out / size_in > MAX_UNCOMPRESSION_FACTOR); }
-/** Given <b>level</b> return the memory level. The memory level is needed for - * the various compression backends used in Tor. - */ -int -tor_compress_memory_level(compression_level_t level) -{ - switch (level) { - default: - case HIGH_COMPRESSION: return 8; - case MEDIUM_COMPRESSION: return 7; - case LOW_COMPRESSION: return 6; - } -} - /** Given <b>in_len</b> bytes at <b>in</b>, compress them into a newly * allocated buffer, using the method described in <b>method</b>. Store the * compressed string in *<b>out</b>, and its length in *<b>out_len</b>. diff --git a/src/common/compress.h b/src/common/compress.h index 182530f..1e6e9fd 100644 --- a/src/common/compress.h +++ b/src/common/compress.h @@ -47,9 +47,6 @@ tor_uncompress(char **out, size_t *out_len, compress_method_t detect_compression_method(const char *in, size_t in_len);
int -tor_compress_memory_level(compression_level_t level); - -int tor_compress_is_compression_bomb(size_t size_in, size_t size_out);
int diff --git a/src/common/compress_lzma.c b/src/common/compress_lzma.c index f2952cc..ae0327f 100644 --- a/src/common/compress_lzma.c +++ b/src/common/compress_lzma.c @@ -26,6 +26,18 @@ static size_t total_lzma_allocation = 0;
#ifdef HAVE_LZMA +/** Given <b>level</b> return the memory level. */ +static int +memory_level(compression_level_t level) +{ + switch (level) { + default: + case HIGH_COMPRESSION: return 9; + case MEDIUM_COMPRESSION: return 6; + case LOW_COMPRESSION: return 3; + } +} + /** Convert a given <b>error</b> to a human readable error string. */ static const char * lzma_error_str(lzma_ret error) @@ -124,7 +136,7 @@ tor_lzma_compress(char **out, size_t *out_len, stream.avail_in = in_len;
lzma_lzma_preset(&stream_options, - tor_compress_memory_level(HIGH_COMPRESSION)); + memory_level(HIGH_COMPRESSION));
retval = lzma_alone_encoder(&stream, &stream_options);
@@ -432,7 +444,7 @@ tor_lzma_compress_new(int compress,
if (compress) { lzma_lzma_preset(&stream_options, - tor_compress_memory_level(compression_level)); + memory_level(compression_level));
retval = lzma_alone_encoder(&result->stream, &stream_options);
diff --git a/src/common/compress_zlib.c b/src/common/compress_zlib.c index e1a68c2..50bdf9e 100644 --- a/src/common/compress_zlib.c +++ b/src/common/compress_zlib.c @@ -50,6 +50,18 @@ static size_t tor_zlib_state_size_precalc(int inflate, /** Total number of bytes allocated for zlib state */ static size_t total_zlib_allocation = 0;
+/** Given <b>level</b> return the memory level. */ +static int +memory_level(compression_level_t level) +{ + switch (level) { + default: + case HIGH_COMPRESSION: return 8; + case MEDIUM_COMPRESSION: return 7; + case LOW_COMPRESSION: return 6; + } +} + /** Return the 'bits' value to tell zlib to use <b>method</b>.*/ static inline int method_bits(compress_method_t method, compression_level_t level) @@ -120,7 +132,7 @@ tor_zlib_compress(char **out, size_t *out_len,
if (deflateInit2(stream, Z_BEST_COMPRESSION, Z_DEFLATED, method_bits(method, HIGH_COMPRESSION), - tor_compress_memory_level(HIGH_COMPRESSION), + memory_level(HIGH_COMPRESSION), Z_DEFAULT_STRATEGY) != Z_OK) { //LCOV_EXCL_START -- we can only provoke failure by giving junk arguments. log_warn(LD_GENERAL, "Error from deflateInit2: %s", @@ -413,7 +425,7 @@ tor_zlib_compress_new(int compress, out->stream.opaque = NULL; out->compress = compress; bits = method_bits(method, compression_level); - memlevel = tor_compress_memory_level(compression_level); + memlevel = memory_level(compression_level); if (compress) { if (deflateInit2(&out->stream, Z_BEST_COMPRESSION, Z_DEFLATED, bits, memlevel, diff --git a/src/common/compress_zstd.c b/src/common/compress_zstd.c index c838cd9..664cce1 100644 --- a/src/common/compress_zstd.c +++ b/src/common/compress_zstd.c @@ -26,6 +26,20 @@ /** Total number of bytes allocated for Zstandard state. */ static size_t total_zstd_allocation = 0;
+#ifdef HAVE_ZSTD +/** Given <b>level</b> return the memory level. */ +static int +memory_level(compression_level_t level) +{ + switch (level) { + default: + case HIGH_COMPRESSION: return 9; + case MEDIUM_COMPRESSION: return 8; + case LOW_COMPRESSION: return 7; + } +} +#endif // HAVE_ZSTD. + /** Return 1 if Zstandard compression is supported; otherwise 0. */ int tor_zstd_method_supported(void) @@ -104,7 +118,7 @@ tor_zstd_compress(char **out, size_t *out_len, }
retval = ZSTD_initCStream(stream, - tor_compress_memory_level(HIGH_COMPRESSION)); + memory_level(HIGH_COMPRESSION));
if (ZSTD_isError(retval)) { log_warn(LD_GENERAL, "Zstandard stream initialization error: %s", @@ -408,7 +422,7 @@ tor_zstd_compress_new(int compress, }
retval = ZSTD_initCStream(result->u.compress_stream, - tor_compress_memory_level(compression_level)); + memory_level(compression_level));
if (ZSTD_isError(retval)) { log_warn(LD_GENERAL, "Zstandard stream initialization error: %s",