From 0ab5552c8c32e7d7196b5a33eaa5533ccac53d0e Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Tue, 28 Mar 2023 15:42:39 +1300 Subject: [PATCH] lib/compression: Add helper function lzxpress_huffman_max_compressed_size() This allows the calculation of the worst case to be shared with callers. Signed-off-by: Andrew Bartlett Reviewed-by: Douglas Bagnall --- lib/compression/lzxpress_huffman.c | 23 +++++++++++++++++------ lib/compression/lzxpress_huffman.h | 8 ++++++++ 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/lib/compression/lzxpress_huffman.c b/lib/compression/lzxpress_huffman.c index 3eac8e3b2b6..6d383e4f8ca 100644 --- a/lib/compression/lzxpress_huffman.c +++ b/lib/compression/lzxpress_huffman.c @@ -1210,6 +1210,21 @@ static ssize_t lzx_huffman_compress_block(struct lzxhuff_compressor_context *cmp return bytes_written; } +/* + * lzxpress_huffman_max_compressed_size() + * + * Return the most bytes the compression can take, to allow + * pre-allocation. + */ +size_t lzxpress_huffman_max_compressed_size(size_t input_size) +{ + /* + * In the worst case, the output size should be about the same as the + * input size, plus the 256 byte header per 64k block. We aim for + * ample, but within the order of magnitude. + */ + return input_size + (input_size / 8) + 270; +} /* * lzxpress_huffman_compress_talloc() @@ -1236,12 +1251,8 @@ ssize_t lzxpress_huffman_compress_talloc(TALLOC_CTX *mem_ctx, uint8_t **output) { struct lzxhuff_compressor_mem *cmp = NULL; - /* - * In the worst case, the output size should be about the same as the - * input size, plus the 256 byte header per 64k block. We aim for - * ample, but within the order of magnitude. - */ - size_t alloc_size = input_size + (input_size / 8) + 270; + size_t alloc_size = lzxpress_huffman_max_compressed_size(input_size); + ssize_t output_size; *output = talloc_array(mem_ctx, uint8_t, alloc_size); diff --git a/lib/compression/lzxpress_huffman.h b/lib/compression/lzxpress_huffman.h index 04de448bcce..232e58920f5 100644 --- a/lib/compression/lzxpress_huffman.h +++ b/lib/compression/lzxpress_huffman.h @@ -83,5 +83,13 @@ uint8_t *lzxpress_huffman_decompress_talloc(TALLOC_CTX *mem_ctx, size_t input_size, size_t output_size); +/* + * lzxpress_huffman_max_compressed_size() + * + * Return the most bytes the compression can take, to allow + * pre-allocation. + */ +size_t lzxpress_huffman_max_compressed_size(size_t input_size); + #endif /* HAVE_LZXPRESS_HUFFMAN_H */