summaryrefslogtreecommitdiff
path: root/lib/compression
diff options
context:
space:
mode:
authorAndrew Bartlett <abartlet@samba.org>2023-03-28 15:42:39 +1300
committerAndrew Bartlett <abartlet@samba.org>2023-03-31 01:48:30 +0000
commit0ab5552c8c32e7d7196b5a33eaa5533ccac53d0e (patch)
tree6b8e8d8aa2a5b415e97994ea9b7149d85ec6d4ed /lib/compression
parent976dfc7585fcce594f5e77c8bb8ccc9644625f95 (diff)
downloadsamba-0ab5552c8c32e7d7196b5a33eaa5533ccac53d0e.tar.gz
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 <abartlet@samba.org> Reviewed-by: Douglas Bagnall <douglas.bagnall@catalyst.net.nz>
Diffstat (limited to 'lib/compression')
-rw-r--r--lib/compression/lzxpress_huffman.c23
-rw-r--r--lib/compression/lzxpress_huffman.h8
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 */