summaryrefslogtreecommitdiff
path: root/src/erasurecode.c
diff options
context:
space:
mode:
authorKota Tsuyuzaki <bloodeagle40234@gmail.com>2015-02-05 20:15:57 -0800
committerKota Tsuyuzaki <bloodeagle40234@gmail.com>2015-02-27 15:44:37 +0900
commit57f5c565e64f8c33d3e299a8542de6d0f083b840 (patch)
tree2560935514eaa6b18c9f7752a6f60c2c3ae861e2 /src/erasurecode.c
parentaa0c9605048153f640b8b871da9e483347e4b70f (diff)
downloadliberasurecode-57f5c565e64f8c33d3e299a8542de6d0f083b840.tar.gz
Ensure fragment pointers passed to cleanup
This patch achieves a couple of things as follows: - Undoing the liberasurecode_encode_cleanup specification to expect "fragment" pointers as its arguments. - Ensuring liberasurecode_encode to pass "fratment" pointers to liberasurecode_encode_cleanup. liberasurecode_encode_cleanup is used also in pyeclib so that it is expected that the argument pointers (i.e. encoded_data and encoded_parity) should be the collection of the heads of "fragment" pointers. However, when the backend encode fails, liberasurecode keeps "data" pointers behind of fragment_header, and then, goes to "out:" statement to cleanup its memories. It causes invalid pointer failure. This patch adds a translation function from "data" pointers to "fragment" pointers and ensure liberasurecode_encode to pass correct pointers to libersurecode_encode_cleanup.
Diffstat (limited to 'src/erasurecode.c')
-rw-r--r--src/erasurecode.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/src/erasurecode.c b/src/erasurecode.c
index c9a32f1..775f37c 100644
--- a/src/erasurecode.c
+++ b/src/erasurecode.c
@@ -333,6 +333,7 @@ int liberasurecode_encode_cleanup(int desc,
char **encoded_parity)
{
int i, k, m;
+
ec_backend_t instance = liberasurecode_backend_instance_get_by_desc(desc);
if (NULL == instance) {
return -EBACKENDNOTAVAIL;
@@ -353,7 +354,6 @@ int liberasurecode_encode_cleanup(int desc,
for (i = 0; i < m; i++) {
free(encoded_parity[i]);
}
-
free(encoded_parity);
}
@@ -441,6 +441,9 @@ int liberasurecode_encode(int desc,
ret = prepare_fragments_for_encode(instance, k, m, orig_data, orig_data_size,
*encoded_data, *encoded_parity, &blocksize);
if (ret < 0) {
+ // ensure encoded_data/parity point the head of fragment_ptr
+ get_fragment_ptr_array_from_data(*encoded_data, *encoded_data, k);
+ get_fragment_ptr_array_from_data(*encoded_parity, *encoded_parity, m);
goto out;
}
@@ -448,6 +451,9 @@ int liberasurecode_encode(int desc,
ret = instance->common.ops->encode(instance->desc.backend_desc,
*encoded_data, *encoded_parity, blocksize);
if (ret < 0) {
+ // ensure encoded_data/parity point the head of fragment_ptr
+ get_fragment_ptr_array_from_data(*encoded_data, *encoded_data, k);
+ get_fragment_ptr_array_from_data(*encoded_parity, *encoded_parity, m);
goto out;
}
@@ -455,6 +461,7 @@ int liberasurecode_encode(int desc,
*encoded_data, *encoded_parity);
*fragment_len = get_fragment_size((*encoded_data)[0]);
+
out:
if (ret) {
/* Cleanup the allocations we have done */