From: Douglas Bagnall Date: Wed, 11 May 2022 03:24:38 +0000 (+1200) Subject: compression:tests: test lzxpress in some edge cases X-Git-Tag: talloc-2.3.4~156 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d8a90d2a8fc5f42859297c771bc83ec12f45a658;p=thirdparty%2Fsamba.git 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 Reviewed-by: Andrew Bartlett --- 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; } diff --git a/selftest/knownfail.d/lzexpress b/selftest/knownfail.d/lzexpress new file mode 100644 index 00000000000..a7dafdbaa33 --- /dev/null +++ b/selftest/knownfail.d/lzexpress @@ -0,0 +1 @@ +samba4.local.compression.lzxpress_round_trip