summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKota Tsuyuzaki <tsuyuzaki.kota@lab.ntt.co.jp>2017-02-15 01:08:25 -0800
committerKota Tsuyuzaki <tsuyuzaki.kota@lab.ntt.co.jp>2017-02-20 07:45:55 -0800
commitc9136a62b6e7cc8701cd7206ef0367520a20b8b9 (patch)
treee3710b1997b9fce5128809ee3437724432240979 /src
parent10e096fe097a489eec41bad120f5b5e52fa4b61c (diff)
downloadliberasurecode-c9136a62b6e7cc8701cd7206ef0367520a20b8b9.tar.gz
Fix valgrind-check and memory leak
Can you believe that we ware testing the memory leak with valgrind to just *bash scripts* instead of actual binaries on liberasurecode_test and libec_slap? That is why we cannot find such an easy memory leak[1] at the gate. Now this patch enable to run the valgrind against to the binaries. With this fix, we found various memory leak at liberasurecode_test as follows and this patch also fixes them: - If we create fake fragments, we're responsible for freeing all of the frags as well as the array holding the pointers to the frags. - If we allocate any space, we're responsible for freeing it. - If we create an EC descriptor, we're responsible for destroying it. - If we create a fragment or skip array, we're responsible for freeing it. - If that happens inside a loop, we're responsible for doing it *inside that same loop*. In addition to the test fix, this patch fixes following memory leaks at the code which is affected to other users (pyeclib, OpenStack Swift) * Refuse to decode fragments that aren't even long enough to include fragment headers. * Fix a small memory leak in the builtin rs_vand implementation. Closes-Bug: #1665242 Co-Authored-By: Tim Burke <tim@swiftstack.com> 1: https://review.openstack.org/#/c/431812 Change-Id: I96f124e4e536bbd7544208acc084de1cda5c19b2
Diffstat (limited to 'src')
-rw-r--r--src/builtin/rs_vand/liberasurecode_rs_vand.c2
-rw-r--r--src/erasurecode.c7
2 files changed, 8 insertions, 1 deletions
diff --git a/src/builtin/rs_vand/liberasurecode_rs_vand.c b/src/builtin/rs_vand/liberasurecode_rs_vand.c
index de88d34..94b1620 100644
--- a/src/builtin/rs_vand/liberasurecode_rs_vand.c
+++ b/src/builtin/rs_vand/liberasurecode_rs_vand.c
@@ -543,7 +543,7 @@ int liberasurecode_rs_vand_reconstruct(int *generator_matrix, char **data, char
}
region_dot_product(first_k_available, parity[destination_idx - k], parity_row, k, blocksize);
}
-
+ free(parity_row);
free(decoding_matrix);
free(inverse_decoding_matrix);
free(first_k_available);
diff --git a/src/erasurecode.c b/src/erasurecode.c
index a63bc25..6206b47 100644
--- a/src/erasurecode.c
+++ b/src/erasurecode.c
@@ -587,6 +587,13 @@ int liberasurecode_decode(int desc,
goto out;
}
+ if (fragment_len < sizeof(fragment_header_t)) {
+ log_error("Fragments not long enough to include headers! "
+ "Need %zu, but got %lu.", sizeof(fragment_header_t),
+ (unsigned long)fragment_len);
+ ret = -EBADHEADER;
+ goto out;
+ }
for (i = 0; i < num_fragments; ++i) {
/* Verify metadata checksum */
if (is_invalid_fragment_header(