From 5240afa713581a0bbba64547e00107a9cbf17f21 Mon Sep 17 00:00:00 2001 From: Nick Mathewson Date: Sun, 5 Nov 2017 12:21:16 -0500 Subject: Fix a memory leak on decryption non-failure of v3 hsdesc If it decrypts something that turns out to start with a NUL byte, then decrypt_desc_layer() will return 0 to indicate the length of its result. But 0 also indicates an error, which causes the result not to be freed by decrypt_desc_layer()'s callers. Since we're trying to stabilize 0.3.2.x, I've opted for the simpler possible fix here and made it so that an empty decrypted string will also count as an error. Fixes bug 24150 and OSS-Fuzz issue 3994. The original bug was present but unreachable in 0.3.1.1-alpha. I'm calling this a bugfix on 0.3.2.1-alpha since that's the first version where you could actually try to decrypt these descriptors. --- src/test/fuzz/fuzz_hsdescv3.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'src/test/fuzz') diff --git a/src/test/fuzz/fuzz_hsdescv3.c b/src/test/fuzz/fuzz_hsdescv3.c index 30e82c9252..428774e330 100644 --- a/src/test/fuzz/fuzz_hsdescv3.c +++ b/src/test/fuzz/fuzz_hsdescv3.c @@ -50,7 +50,13 @@ mock_decrypt_desc_layer(const hs_descriptor_t *desc, *decrypted_out = tor_memdup_nulterm( encrypted_blob + HS_DESC_ENCRYPTED_SALT_LEN, encrypted_blob_size - overhead); - return strlen(*decrypted_out); + size_t result = strlen(*decrypted_out); + if (result) { + return result; + } else { + tor_free(*decrypted_out); + return 0; + } } int -- cgit v1.2.3-54-g00ecf