summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKota Tsuyuzaki <tsuyuzaki.kota@lab.ntt.co.jp>2016-07-12 08:45:49 -0700
committerKota Tsuyuzaki <tsuyuzaki.kota@lab.ntt.co.jp>2016-09-06 22:46:44 -0700
commit1d9cea73cb133ce59e1a7d4af14a45fe36b44315 (patch)
tree9f0fcdc927ff64b0ddf56459556abeab966746df /src
parent410388392daf9faccfc239e55e75206044a722ec (diff)
downloadpyeclib-1d9cea73cb133ce59e1a7d4af14a45fe36b44315.tar.gz
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
Diffstat (limited to 'src')
-rw-r--r--src/c/pyeclib_c/pyeclib_c.c19
1 files changed, 18 insertions, 1 deletions
diff --git a/src/c/pyeclib_c/pyeclib_c.c b/src/c/pyeclib_c/pyeclib_c.c
index dc97c38..466fa40 100644
--- a/src/c/pyeclib_c/pyeclib_c.c
+++ b/src/c/pyeclib_c/pyeclib_c.c
@@ -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);
}