Correct fragment size handling

Once we have liberasurecode older than depend-on patch, it could make
an invalid mem access if the backend descripter is not available.
(I'm not sure this situation happen in fact, but any other functions in
liberasurecode expecting that failure actually, FWIW)

To recover this failure, this patch fixes to catch the return value from
liberasurecode and if it's an error code, set an error for the return
value to python.

Depends-On: I489f8b5d049610863b5e0b477b6ff70ead245b55
Change-Id: I47d4ec4fa1647c5a4c8d50f0aa6a2df86ca68c80
This commit is contained in:
Kota Tsuyuzaki 2016-07-12 08:45:49 -07:00
parent 410388392d
commit 1d9cea73cb
1 changed files with 18 additions and 1 deletions

View File

@ -373,6 +373,10 @@ pyeclib_c_get_segment_info(PyObject *self, PyObject *args)
/* The minimum segment size depends on the EC algorithm */
min_segment_size = liberasurecode_get_minimum_encode_size(pyeclib_handle->ec_desc);
if (min_segment_size < 0) {
pyeclib_c_seterr(-EINVALIDPARAMS, "pyeclib_c_get_segment_info ERROR: ");
return NULL;
}
/* Get the number of segments */
num_segments = (int)ceill((double)data_len / segment_size);
@ -396,7 +400,12 @@ pyeclib_c_get_segment_info(PyObject *self, PyObject *args)
* This will retrieve fragment_size calculated by liberasurecode with
* specified backend.
*/
fragment_size = liberasurecode_get_fragment_size(pyeclib_handle->ec_desc, data_len);
if (fragment_size < 0) {
pyeclib_c_seterr(-EINVALIDPARAMS, "pyeclib_c_get_segment_info ERROR: ");
return NULL;
}
/* Segment size is the user-provided segment size */
segment_size = data_len;
@ -409,6 +418,10 @@ pyeclib_c_get_segment_info(PyObject *self, PyObject *args)
*/
fragment_size = liberasurecode_get_fragment_size(pyeclib_handle->ec_desc, segment_size);
if (fragment_size < 0) {
pyeclib_c_seterr(-EINVALIDPARAMS, "pyeclib_c_get_segment_info ERROR: ");
return NULL;
}
last_segment_size = data_len - (segment_size * (num_segments - 1));
@ -425,6 +438,10 @@ pyeclib_c_get_segment_info(PyObject *self, PyObject *args)
}
last_fragment_size = liberasurecode_get_fragment_size(pyeclib_handle->ec_desc, last_segment_size);
if (fragment_size < 0) {
pyeclib_c_seterr(-EINVALIDPARAMS, "pyeclib_c_get_segment_info ERROR: ");
return NULL;
}
}
/* Add header to fragment sizes */
@ -1191,7 +1208,7 @@ pyeclib_c_check_backend_available(PyObject *self, PyObject *args)
}
static PyObject*
pyeclib_c_liberasurecode_version(PyObject *self, PyObject *args){
pyeclib_c_liberasurecode_version(PyObject *self, PyObject *args) {
return PyInt_FromLong(LIBERASURECODE_VERSION);
}