diff options
author | Douglas Bagnall <douglas.bagnall@catalyst.net.nz> | 2022-05-11 15:24:38 +1200 |
---|---|---|
committer | Andrew Bartlett <abartlet@samba.org> | 2022-05-12 02:22:35 +0000 |
commit | d8a90d2a8fc5f42859297c771bc83ec12f45a658 (patch) | |
tree | 4bfe11df85d87608a8857f5f783777e9d4110e81 /lib/compression | |
parent | 075df819cce783d69069943f39bead833f3628ef (diff) | |
download | samba-d8a90d2a8fc5f42859297c771bc83ec12f45a658.tar.gz |
compression:tests: test lzxpress in some edge cases
Empty strings and trailing flag blocks.
(found with Honggfuzz and a round-trip fuzzer that aborts if the
strings differ).
Signed-off-by: Douglas Bagnall <douglas.bagnall@catalyst.net.nz>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
Diffstat (limited to 'lib/compression')
-rw-r--r-- | lib/compression/testsuite.c | 62 |
1 files changed, 61 insertions, 1 deletions
diff --git a/lib/compression/testsuite.c b/lib/compression/testsuite.c index fc6c2e43ea8..21d8a369c7e 100644 --- a/lib/compression/testsuite.c +++ b/lib/compression/testsuite.c @@ -23,6 +23,7 @@ #include "torture/local/proto.h" #include "talloc.h" #include "lzxpress.h" +#include "lib/util/base64.h" /* Tests based on [MS-XCA] 3.1 Examples */ static bool test_msft_data1( @@ -339,6 +340,64 @@ static bool test_lzxpress4(struct torture_context *test) return true; } +static bool test_lzxpress_round_trip(struct torture_context *test) +{ + /* + * Examples found using via fuzzing. + */ + TALLOC_CTX *tmp_ctx = talloc_new(test); + size_t i; + struct b64_pair { + const char *uncompressed; + const char *compressed; + } pairs[] = { + { /* this results in a trailing flags block */ + "AAICAmq/EKdP785YU2Ddh7d4vUtdlQyLeHV09LHpUBw=", + "AAAAAAACAgJqvxCnT+/OWFNg3Ye3eL1LXZUMi3h1dPSx6VAc/////w==", + }, + { /* empty string compresses to empty string */ + "", "" + }, + }; + const size_t alloc_size = 1000; + uint8_t *data = talloc_array(tmp_ctx, uint8_t, alloc_size); + + for (i = 0; i < ARRAY_SIZE(pairs); i++) { + ssize_t len; + DATA_BLOB uncomp = base64_decode_data_blob_talloc( + tmp_ctx, + pairs[i].uncompressed); + DATA_BLOB comp = base64_decode_data_blob_talloc( + tmp_ctx, + pairs[i].compressed); + + len = lzxpress_compress(uncomp.data, + uncomp.length, + data, + alloc_size); + + torture_assert_int_equal(test, len, comp.length, + "lzexpress compression size"); + + torture_assert_mem_equal(test, comp.data, data, len, + "lzxpress compression data"); + + len = lzxpress_decompress(comp.data, + comp.length, + data, + alloc_size); + + torture_assert_int_equal(test, len, uncomp.length, + "lzexpress decompression size"); + + torture_assert_mem_equal(test, uncomp.data, data, len, + "lzxpress decompression data"); + } + talloc_free(tmp_ctx); + return true; +} + + struct torture_suite *torture_local_compression(TALLOC_CTX *mem_ctx) { struct torture_suite *suite = torture_suite_create(mem_ctx, "compression"); @@ -349,6 +408,7 @@ struct torture_suite *torture_local_compression(TALLOC_CTX *mem_ctx) torture_suite_add_simple_test(suite, "lzxpress4", test_lzxpress2); torture_suite_add_simple_test(suite, "lzxpress5", test_lzxpress3); torture_suite_add_simple_test(suite, "lzxpress6", test_lzxpress4); - + torture_suite_add_simple_test(suite, "lzxpress_round_trip", + test_lzxpress_round_trip); return suite; } |