summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/erasurecode/erasurecode.h4
-rw-r--r--src/erasurecode.c14
-rw-r--r--src/erasurecode_helpers.c1
-rw-r--r--src/erasurecode_preprocessing.c15
-rw-r--r--test/liberasurecode_test.c32
5 files changed, 53 insertions, 13 deletions
diff --git a/include/erasurecode/erasurecode.h b/include/erasurecode/erasurecode.h
index cfceb7b..9b4d129 100644
--- a/include/erasurecode/erasurecode.h
+++ b/include/erasurecode/erasurecode.h
@@ -32,6 +32,10 @@
#include "list.h"
#include "erasurecode_stdinc.h"
#include "erasurecode_version.h"
+#include <stdint.h>
+
+#define BASE_64BIT (uint64_t)1
+#define MAX_FRAGMENTS_NUM 64
#ifdef __cplusplus
extern "C" {
diff --git a/src/erasurecode.c b/src/erasurecode.c
index 57054b9..7d8ef7d 100644
--- a/src/erasurecode.c
+++ b/src/erasurecode.c
@@ -253,6 +253,12 @@ int liberasurecode_instance_create(const ec_backend_id_t id,
if (id >= EC_BACKENDS_MAX)
return -EBACKENDNOTSUPP;
+ if ((args->k + args->m) > MAX_FRAGMENTS_NUM){
+ log_error("Fragments sum (k + m) must be less than %d\n",
+ MAX_FRAGMENTS_NUM);
+ return -EINVALIDPARAMS;
+ }
+
/* Allocate memory for ec_backend instance */
instance = calloc(1, sizeof(*instance));
if (NULL == instance)
@@ -683,13 +689,13 @@ out:
/* Free the buffers allocated in prepare_fragments_for_decode */
if (realloc_bm != 0) {
for (i = 0; i < k; i++) {
- if (realloc_bm & (1 << i)) {
+ if (realloc_bm & (BASE_64BIT << i)) {
free(data[i]);
}
}
for (i = 0; i < m; i++) {
- if (realloc_bm & (1 << (i + k))) {
+ if (realloc_bm & (BASE_64BIT << (i + k))) {
free(parity[i]);
}
}
@@ -873,13 +879,13 @@ out:
/* Free the buffers allocated in prepare_fragments_for_decode */
if (realloc_bm != 0) {
for (i = 0; i < k; i++) {
- if (realloc_bm & (1 << i)) {
+ if (realloc_bm & (BASE_64BIT << i)) {
free(data[i]);
}
}
for (i = 0; i < m; i++) {
- if (realloc_bm & (1 << (i + k))) {
+ if (realloc_bm & (BASE_64BIT << (i + k))) {
free(parity[i]);
}
}
diff --git a/src/erasurecode_helpers.c b/src/erasurecode_helpers.c
index 522766e..560dc34 100644
--- a/src/erasurecode_helpers.c
+++ b/src/erasurecode_helpers.c
@@ -123,7 +123,6 @@ char *alloc_fragment_buffer(int size)
size += sizeof(fragment_header_t);
buf = get_aligned_buffer16(size);
-
if (buf) {
header = (fragment_header_t *) buf;
header->magic = LIBERASURECODE_FRAG_HEADER_MAGIC;
diff --git a/src/erasurecode_preprocessing.c b/src/erasurecode_preprocessing.c
index 06fd1cc..61258b5 100644
--- a/src/erasurecode_preprocessing.c
+++ b/src/erasurecode_preprocessing.c
@@ -116,11 +116,11 @@ int prepare_fragments_for_decode(
uint64_t *realloc_bm)
{
int i; /* a counter */
- unsigned long long missing_bm; /* bitmap form of missing indexes list */
+ uint64_t missing_bm; /* bitmap form of missing indexes list */
int orig_data_size = -1;
int payload_size = -1;
- missing_bm = convert_list_to_bitmap(missing_idxs);
+ missing_bm = (uint64_t)convert_list_to_bitmap(missing_idxs);
/*
* Determine if each data fragment is:
@@ -141,7 +141,7 @@ int prepare_fragments_for_decode(
log_error("Could not allocate data buffer!");
return -ENOMEM;
}
- *realloc_bm = *realloc_bm | (1 << i);
+ *realloc_bm = *realloc_bm | (BASE_64BIT << i);
} else if (!is_addr_aligned((unsigned long)data[i], 16)) {
char *tmp_buf = alloc_fragment_buffer(fragment_size - sizeof(fragment_header_t));
if (NULL == tmp_buf) {
@@ -150,11 +150,11 @@ int prepare_fragments_for_decode(
}
memcpy(tmp_buf, data[i], fragment_size);
data[i] = tmp_buf;
- *realloc_bm = *realloc_bm | (1 << i);
+ *realloc_bm = *realloc_bm | (BASE_64BIT << i);
}
/* Need to determine the size of the original data */
- if (((missing_bm & (1 << i)) == 0) && orig_data_size < 0) {
+ if (((missing_bm & (BASE_64BIT << i)) == 0) && orig_data_size < 0) {
orig_data_size = get_orig_data_size(data[i]);
if (orig_data_size < 0) {
log_error("Invalid orig_data_size in fragment header!");
@@ -180,7 +180,7 @@ int prepare_fragments_for_decode(
log_error("Could not allocate parity buffer!");
return -ENOMEM;
}
- *realloc_bm = *realloc_bm | (1 << (k + i));
+ *realloc_bm = *realloc_bm | (BASE_64BIT << (k + i));
} else if (!is_addr_aligned((unsigned long)parity[i], 16)) {
char *tmp_buf = alloc_fragment_buffer(fragment_size-sizeof(fragment_header_t));
if (NULL == tmp_buf) {
@@ -189,7 +189,7 @@ int prepare_fragments_for_decode(
}
memcpy(tmp_buf, parity[i], fragment_size);
parity[i] = tmp_buf;
- *realloc_bm = *realloc_bm | (1 << (k + i));
+ *realloc_bm = *realloc_bm | (BASE_64BIT << (k + i));
}
/* Need to determine the size of the original data */
@@ -210,7 +210,6 @@ int prepare_fragments_for_decode(
*orig_size = orig_data_size;
*fragment_payload_size = payload_size;
-
return 0;
}
diff --git a/test/liberasurecode_test.c b/test/liberasurecode_test.c
index ff4641a..77d4b73 100644
--- a/test/liberasurecode_test.c
+++ b/test/liberasurecode_test.c
@@ -488,6 +488,18 @@ static void test_create_backend_invalid_args()
return;
}
assert(desc < 0);
+
+ struct ec_args invalid_args = {
+ .k = 100,
+ .m = 100,
+ };
+
+ desc = liberasurecode_instance_create(EC_BACKEND_NULL, &invalid_args);
+ if (-EBACKENDNOTAVAIL == desc) {
+ fprintf (stderr, "Backend library not available!\n");
+ return;
+ }
+ assert(desc < 0);
}
static void test_destroy_backend_invalid_args()
@@ -1316,6 +1328,22 @@ static void test_simple_encode_decode(const ec_backend_id_t be_id,
free(skip);
}
+static void test_simple_encode_decode_over32()
+{
+ struct ec_args over32_args = {
+ .k = 30,
+ .m = 20,
+ };
+
+ // k + m > 32 condition must not free any other fragments
+ // memory except missing fragment 1
+ int *skip = create_skips_array(&over32_args, 1);
+ assert(skip != NULL);
+ encode_decode_test_impl(EC_BACKEND_JERASURE_RS_VAND,
+ &over32_args, skip);
+ free(skip);
+}
+
static void test_simple_reconstruct(const ec_backend_id_t be_id,
struct ec_args *args)
{
@@ -1655,6 +1683,10 @@ struct testcase testcases[] = {
test_verify_stripe_metadata_be_ver_mismatch,
EC_BACKEND_JERASURE_RS_VAND, CHKSUM_CRC32,
.skip = false},
+ {"test_simple_encode_decode_over32",
+ test_simple_encode_decode_over32,
+ EC_BACKEND_JERASURE_RS_VAND, CHKSUM_CRC32,
+ .skip = false},
// Jerasure RS Cauchy backend tests
{"create_and_destroy_backend",
test_create_and_destroy_backend,