Sanitize fragments_to_string() errorcodes, add tests for frags w/o fmetadata
Addresses issue#10
This commit is contained in:
parent
a2f17bcd63
commit
9a24890f9c
|
@ -35,12 +35,12 @@ test: check
|
|||
$(eval LD_LIBRARY_PATH := LD_LIBRARY_PATH="$(subst / ,/:,$(SODIRS))")
|
||||
$(eval DYLD_LIBRARY_PATH := DYLD_LIBRARY_PATH="$(subst / ,/:,$(SODIRS))")
|
||||
$(eval DYLD_FALLBACK_LIBRARY_PATH := DYLD_FALLBACK_LIBRARY_PATH="$(subst / ,/:,$(SODIRS))")
|
||||
@$(LD_LIBRARY_PATH) $(DYLD_LIBRARY_PATH) $(DYLD_FALLBACK_LIBRARY_PATH) \
|
||||
./test/liberasurecode_test
|
||||
@$(LD_LIBRARY_PATH) $(DYLD_LIBRARY_PATH) $(DYLD_FALLBACK_LIBRARY_PATH) \
|
||||
./test/alg_sig_test
|
||||
@$(LD_LIBRARY_PATH) $(DYLD_LIBRARY_PATH) $(DYLD_FALLBACK_LIBRARY_PATH) \
|
||||
./test/test_xor_hd_code
|
||||
@$(LD_LIBRARY_PATH) $(DYLD_LIBRARY_PATH) $(DYLD_FALLBACK_LIBRARY_PATH) \
|
||||
./test/liberasurecode_test
|
||||
@$(LD_LIBRARY_PATH) $(DYLD_LIBRARY_PATH) $(DYLD_FALLBACK_LIBRARY_PATH) \
|
||||
./test/libec_slap
|
||||
|
||||
|
|
|
@ -566,7 +566,10 @@ int liberasurecode_decode(int desc,
|
|||
available_fragments, num_fragments,
|
||||
out_data, out_data_len);
|
||||
|
||||
if (ret == 0) {
|
||||
if (ret == -1) {
|
||||
/* Ignore - not necessarily an error
|
||||
* (see fragments_to_string() in src/erasurecode_preprocessing.c) */
|
||||
} else if (ret <= 0) {
|
||||
/* We were able to get the original data without decoding! */
|
||||
goto out;
|
||||
}
|
||||
|
|
|
@ -139,14 +139,14 @@ int prepare_fragments_for_decode(
|
|||
data[i] = alloc_fragment_buffer(fragment_size - sizeof(fragment_header_t));
|
||||
if (NULL == data[i]) {
|
||||
log_error("Could not allocate data buffer!");
|
||||
return -1;
|
||||
return -ENOMEM;
|
||||
}
|
||||
*realloc_bm = *realloc_bm | (1 << 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) {
|
||||
log_error("Could not allocate temp buffer!");
|
||||
return -1;
|
||||
return -ENOMEM;
|
||||
}
|
||||
memcpy(tmp_buf, data[i], fragment_size);
|
||||
data[i] = tmp_buf;
|
||||
|
@ -158,12 +158,12 @@ int prepare_fragments_for_decode(
|
|||
orig_data_size = get_orig_data_size(data[i]);
|
||||
if (orig_data_size < 0) {
|
||||
log_error("Invalid orig_data_size in fragment header!");
|
||||
return -1;
|
||||
return -EBADHEADER;
|
||||
}
|
||||
payload_size = get_fragment_payload_size(data[i]);
|
||||
if (orig_data_size < 0) {
|
||||
log_error("Invalid fragment_size in fragment header!");
|
||||
return -1;
|
||||
return -EBADHEADER;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -178,14 +178,14 @@ int prepare_fragments_for_decode(
|
|||
parity[i] = alloc_fragment_buffer(fragment_size-sizeof(fragment_header_t));
|
||||
if (NULL == parity[i]) {
|
||||
log_error("Could not allocate parity buffer!");
|
||||
return -1;
|
||||
return -ENOMEM;
|
||||
}
|
||||
*realloc_bm = *realloc_bm | (1 << (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) {
|
||||
log_error("Could not allocate temp buffer!");
|
||||
return -1;
|
||||
return -ENOMEM;
|
||||
}
|
||||
memcpy(tmp_buf, parity[i], fragment_size);
|
||||
parity[i] = tmp_buf;
|
||||
|
@ -286,7 +286,7 @@ int fragments_to_string(int k, int m,
|
|||
data_size = get_fragment_payload_size(fragments[i]);
|
||||
if ((index < 0) || (data_size < 0)) {
|
||||
log_error("Invalid fragment header information!");
|
||||
ret = -EINVALIDPARAMS;
|
||||
ret = -EBADHEADER;
|
||||
goto out;
|
||||
}
|
||||
|
||||
|
@ -296,7 +296,7 @@ int fragments_to_string(int k, int m,
|
|||
} else {
|
||||
if (get_orig_data_size(fragments[i]) != orig_data_size) {
|
||||
log_error("Inconsistent orig_data_size in fragment header!");
|
||||
ret = -EINVALIDPARAMS;
|
||||
ret = -EBADHEADER;
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -177,6 +177,31 @@ int *create_skips_array(struct ec_args *args, int skip)
|
|||
return buf;
|
||||
}
|
||||
|
||||
static int create_fake_frags_no_meta(char ***array, int num_frags,
|
||||
const char *data, int data_len)
|
||||
{
|
||||
int _num_frags = 0;
|
||||
int i = 0;
|
||||
char **ptr = NULL;
|
||||
|
||||
*array = malloc(num_frags * sizeof(char *));
|
||||
if (array == NULL) {
|
||||
_num_frags = -1;
|
||||
goto out;
|
||||
}
|
||||
|
||||
// add data and parity frags
|
||||
ptr = *array;
|
||||
for (i = 0; i < num_frags; i++) {
|
||||
*ptr = (char *) malloc(data_len);
|
||||
strncpy(*ptr++, data, data_len);
|
||||
_num_frags++;
|
||||
}
|
||||
|
||||
out:
|
||||
return _num_frags;
|
||||
}
|
||||
|
||||
static int create_frags_array(char ***array,
|
||||
char **data,
|
||||
char **parity,
|
||||
|
@ -391,6 +416,7 @@ static void test_decode_invalid_args()
|
|||
int *skips = create_skips_array(&null_args, -1);
|
||||
char *decoded_data = NULL;
|
||||
uint64_t decoded_data_len = 0;
|
||||
const char *fake_data = " ";
|
||||
|
||||
desc = liberasurecode_instance_create(EC_BACKEND_NULL, &null_args);
|
||||
if (-EBACKENDNOTAVAIL == desc) {
|
||||
|
@ -398,12 +424,34 @@ static void test_decode_invalid_args()
|
|||
return;
|
||||
}
|
||||
assert(desc > 0);
|
||||
|
||||
// test with invalid fragments (no metadata headers)
|
||||
num_avail_frags = create_fake_frags_no_meta(&avail_frags, (null_args.k +
|
||||
null_args.m),
|
||||
fake_data, strlen(fake_data));
|
||||
assert(num_avail_frags > 0);
|
||||
|
||||
rc = liberasurecode_decode(desc, avail_frags, num_avail_frags,
|
||||
strlen(fake_data), 1,
|
||||
&decoded_data, &decoded_data_len);
|
||||
assert(rc == -EBADHEADER);
|
||||
|
||||
// test with num_fragments < (k)
|
||||
num_avail_frags = create_fake_frags_no_meta(&avail_frags, (null_args.k - 1),
|
||||
" ", 1);
|
||||
assert(num_avail_frags > 0);
|
||||
rc = liberasurecode_decode(desc, avail_frags, num_avail_frags,
|
||||
strlen(fake_data), 1,
|
||||
&decoded_data, &decoded_data_len);
|
||||
assert(rc == -EINSUFFFRAGS);
|
||||
|
||||
rc = liberasurecode_encode(desc, orig_data, orig_data_size,
|
||||
&encoded_data, &encoded_parity, &encoded_fragment_len);
|
||||
assert(0 == rc);
|
||||
assert(rc == 0);
|
||||
|
||||
num_avail_frags = create_frags_array(&avail_frags, encoded_data,
|
||||
encoded_parity, &null_args, skips);
|
||||
assert(num_avail_frags > 0);
|
||||
|
||||
rc = liberasurecode_decode(-1, avail_frags, num_avail_frags,
|
||||
encoded_fragment_len, 1,
|
||||
|
@ -698,7 +746,7 @@ static void encode_decode_test_impl(const ec_backend_id_t be_id,
|
|||
|
||||
num_avail_frags = create_frags_array(&avail_frags, encoded_data,
|
||||
encoded_parity, args, skip);
|
||||
assert(num_avail_frags != -1);
|
||||
assert(num_avail_frags > 0);
|
||||
rc = liberasurecode_decode(desc, avail_frags, num_avail_frags,
|
||||
encoded_fragment_len, 1,
|
||||
&decoded_data, &decoded_data_len);
|
||||
|
|
Loading…
Reference in New Issue