summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/backends/isa-l/isa_l_common.c1
-rw-r--r--src/backends/jerasure/jerasure_rs_cauchy.c21
-rw-r--r--src/backends/jerasure/jerasure_rs_vand.c24
-rw-r--r--src/builtin/rs_vand/liberasurecode_rs_vand.c2
-rw-r--r--src/erasurecode.c7
5 files changed, 53 insertions, 2 deletions
diff --git a/src/backends/isa-l/isa_l_common.c b/src/backends/isa-l/isa_l_common.c
index 07deb13..b7fb05e 100644
--- a/src/backends/isa-l/isa_l_common.c
+++ b/src/backends/isa-l/isa_l_common.c
@@ -444,6 +444,7 @@ int isa_l_exit(void *desc)
isa_l_desc = (isa_l_descriptor*) desc;
+ free(isa_l_desc->matrix);
free(isa_l_desc);
return 0;
diff --git a/src/backends/jerasure/jerasure_rs_cauchy.c b/src/backends/jerasure/jerasure_rs_cauchy.c
index da94aff..3a0365a 100644
--- a/src/backends/jerasure/jerasure_rs_cauchy.c
+++ b/src/backends/jerasure/jerasure_rs_cauchy.c
@@ -63,6 +63,7 @@ typedef int (*jerasure_make_decoding_bitmatrix_func)
(int, int, int, int *, int *, int *, int *);
typedef void (*jerasure_bitmatrix_dotprod_func)
(int, int, int *, int *, int,char **, char **, int, int);
+typedef void (*galois_uninit_field_func)(int);
/*
* ToDo (KMG): Should we make this a parameter, or is that
@@ -76,6 +77,9 @@ struct jerasure_rs_cauchy_descriptor {
jerasure_matrix_to_bitmatrix_func jerasure_matrix_to_bitmatrix;
jerasure_smart_bitmatrix_to_schedule_func jerasure_smart_bitmatrix_to_schedule;
+ /* calls required for free */
+ galois_uninit_field_func galois_uninit_field;
+
/* calls required for encode */
jerasure_bitmatrix_encode_func jerasure_bitmatrix_encode;
@@ -273,6 +277,7 @@ static void * jerasure_rs_cauchy_init(struct ec_backend_args *args,
cauchy_original_coding_matrix_func initp;
jerasure_matrix_to_bitmatrix_func matrixtobitmatrixp;
jerasure_smart_bitmatrix_to_schedule_func matrixschedulep;
+ galois_uninit_field_func uninitp;
jerasure_bitmatrix_encode_func encodep;
jerasure_bitmatrix_decode_func decodep;
jerasure_erasures_to_erased_func erasedp;
@@ -338,6 +343,13 @@ static void * jerasure_rs_cauchy_init(struct ec_backend_args *args,
goto error;
}
+ func_handle.vptr = NULL;
+ func_handle.vptr = dlsym(backend_sohandle, "galois_uninit_field");
+ desc->galois_uninit_field = func_handle.uninitp;
+ if (NULL == desc->galois_uninit_field) {
+ goto error;
+ }
+
/* setup the Cauchy matrices and schedules */
desc->matrix = desc->cauchy_original_coding_matrix(k, m, w);
if (NULL == desc->matrix) {
@@ -385,6 +397,15 @@ static void free_rs_cauchy_desc(
return;
}
+ /*
+ * jerasure allocates some internal data structures for caching
+ * fields. It will allocate one for w, and if we do anything that
+ * needs to xor a region >= 16 bytes, it will also allocate one
+ * for 32. Fortunately we can safely uninit any value; if it
+ * wasn't inited it will be ignored.
+ */
+ jerasure_desc->galois_uninit_field(jerasure_desc->w);
+ jerasure_desc->galois_uninit_field(32);
free(jerasure_desc->matrix);
free(jerasure_desc->bitmatrix);
diff --git a/src/backends/jerasure/jerasure_rs_vand.c b/src/backends/jerasure/jerasure_rs_vand.c
index 3e48e38..9395046 100644
--- a/src/backends/jerasure/jerasure_rs_vand.c
+++ b/src/backends/jerasure/jerasure_rs_vand.c
@@ -56,11 +56,15 @@ typedef int (*jerasure_matrix_decode_func)(int, int, int, int *, int, int*, char
typedef int (*jerasure_make_decoding_matrix_func)(int, int, int, int *, int *, int *, int *);
typedef int * (*jerasure_erasures_to_erased_func)(int, int, int *);
typedef void (*jerasure_matrix_dotprod_func)(int, int, int *,int *, int,char **, char **, int);
+typedef void (*galois_uninit_field_func)(int);
struct jerasure_rs_vand_descriptor {
/* calls required for init */
reed_sol_vandermonde_coding_matrix_func reed_sol_vandermonde_coding_matrix;
-
+
+ /* calls required for free */
+ galois_uninit_field_func galois_uninit_field;
+
/* calls required for encode */
jerasure_matrix_encode_func jerasure_matrix_encode;
@@ -235,6 +239,7 @@ static void * jerasure_rs_vand_init(struct ec_backend_args *args,
*/
union {
reed_sol_vandermonde_coding_matrix_func initp;
+ galois_uninit_field_func uninitp;
jerasure_matrix_encode_func encodep;
jerasure_matrix_decode_func decodep;
jerasure_make_decoding_matrix_func decodematrixp;
@@ -287,6 +292,13 @@ static void * jerasure_rs_vand_init(struct ec_backend_args *args,
goto error;
}
+ func_handle.vptr = NULL;
+ func_handle.vptr = dlsym(backend_sohandle, "galois_uninit_field");
+ desc->galois_uninit_field = func_handle.uninitp;
+ if (NULL == desc->galois_uninit_field) {
+ goto error;
+ }
+
desc->matrix = desc->reed_sol_vandermonde_coding_matrix(
desc->k, desc->m, desc->w);
if (NULL == desc->matrix) {
@@ -323,6 +335,16 @@ static int jerasure_rs_vand_exit(void *desc)
struct jerasure_rs_vand_descriptor *jerasure_desc = NULL;
jerasure_desc = (struct jerasure_rs_vand_descriptor*) desc;
+
+ /*
+ * jerasure allocates some internal data structures for caching
+ * fields. It will allocate one for w, and if we do anything that
+ * needs to xor a region >= 16 bytes, it will also allocate one
+ * for 32. Fortunately we can safely uninit any value; if it
+ * wasn't inited it will be ignored.
+ */
+ jerasure_desc->galois_uninit_field(jerasure_desc->w);
+ jerasure_desc->galois_uninit_field(32);
free(jerasure_desc->matrix);
free(jerasure_desc);
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 542fdb1..fb6d5de 100644
--- a/src/erasurecode.c
+++ b/src/erasurecode.c
@@ -589,6 +589,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(