summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKota Tsuyuzaki <bloodeagle40234@gmail.com>2015-08-18 08:16:07 +0000
committerTushar Gohad <tushar.gohad@intel.com>2015-08-18 08:30:34 +0000
commitc9ce822825a55e3254c2f9e74a139fc89310ddc0 (patch)
treef74557392be088077f23b7af2f8568b128303555
parent63829197d588c536898b6499a58639ae8029ac50 (diff)
downloadliberasurecode-c9ce822825a55e3254c2f9e74a139fc89310ddc0.tar.gz
Enforce the (k + m < 32) limit, add unit tests
-rw-r--r--include/erasurecode/erasurecode.h2
-rw-r--r--src/erasurecode.c6
-rw-r--r--test/liberasurecode_test.c35
3 files changed, 41 insertions, 2 deletions
diff --git a/include/erasurecode/erasurecode.h b/include/erasurecode/erasurecode.h
index cfceb7b..7bdad5d 100644
--- a/include/erasurecode/erasurecode.h
+++ b/include/erasurecode/erasurecode.h
@@ -33,6 +33,8 @@
#include "erasurecode_stdinc.h"
#include "erasurecode_version.h"
+#define EC_MAX_FRAGMENTS 32
+
#ifdef __cplusplus
extern "C" {
#endif
diff --git a/src/erasurecode.c b/src/erasurecode.c
index 57054b9..7379524 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) > EC_MAX_FRAGMENTS) {
+ log_error("Total number of fragments (k + m) must be less than %d\n",
+ EC_MAX_FRAGMENTS);
+ return -EINVALIDPARAMS;
+ }
+
/* Allocate memory for ec_backend instance */
instance = calloc(1, sizeof(*instance));
if (NULL == instance)
diff --git a/test/liberasurecode_test.c b/test/liberasurecode_test.c
index ff4641a..875ab96 100644
--- a/test/liberasurecode_test.c
+++ b/test/liberasurecode_test.c
@@ -487,6 +487,15 @@ static void test_create_backend_invalid_args()
fprintf (stderr, "Backend library not available!\n");
return;
}
+ 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);
}
@@ -905,8 +914,11 @@ static void encode_decode_test_impl(const ec_backend_id_t be_id,
if (-EBACKENDNOTAVAIL == desc) {
fprintf (stderr, "Backend library not available!\n");
return;
- }
- assert(desc > 0);
+ } else if ((args->k + args->m) > EC_MAX_FRAGMENTS) {
+ assert(-EINVALIDPARAMS == desc);
+ return;
+ } else
+ assert(desc > 0);
orig_data = create_buffer(orig_data_size, 'x');
assert(orig_data != NULL);
@@ -1316,6 +1328,21 @@ 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,
+ };
+
+ int *skip = create_skips_array(&over32_args, 1);
+ assert(skip != NULL);
+ // should return an error
+ 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)
{
@@ -1594,6 +1621,10 @@ struct testcase testcases[] = {
test_verify_stripe_metadata_be_ver_mismatch,
EC_BACKEND_FLAT_XOR_HD, 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 Vand backend tests
{"create_and_destroy_backend",
test_create_and_destroy_backend,