Sanitize fragments_to_string() errorcodes, add tests for frags w/o fmetadata

Addresses issue#10
This commit is contained in:
Tushar Gohad 2015-03-28 16:23:11 -07:00
parent a2f17bcd63
commit 9a24890f9c
4 changed files with 64 additions and 13 deletions

View File

@ -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

View File

@ -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;
}

View File

@ -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;
}
}

View File

@ -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);