diff options
author | Kota Tsuyuzaki <tsuyuzaki.kota@lab.ntt.co.jp> | 2016-07-12 08:45:49 -0700 |
---|---|---|
committer | Kota Tsuyuzaki <tsuyuzaki.kota@lab.ntt.co.jp> | 2016-09-06 22:46:44 -0700 |
commit | 1d9cea73cb133ce59e1a7d4af14a45fe36b44315 (patch) | |
tree | 9f0fcdc927ff64b0ddf56459556abeab966746df /src | |
parent | 410388392daf9faccfc239e55e75206044a722ec (diff) | |
download | pyeclib-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.c | 19 |
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); } |