From 38cd5bd4054f163d9c2e2fbc853bcc8dc314df4e Mon Sep 17 00:00:00 2001 From: Simon Marchetto Date: Tue, 11 Mar 2014 15:46:47 +0100 Subject: [PATCH] scilab: check overflow in array typemaps --- .../test-suite/scilab/arrays_global_runme.sci | 3 +++ Lib/scilab/sciarray.swg | 19 +++++++++++++++---- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/Examples/test-suite/scilab/arrays_global_runme.sci b/Examples/test-suite/scilab/arrays_global_runme.sci index 24af3377c..e6c323eeb 100644 --- a/Examples/test-suite/scilab/arrays_global_runme.sci +++ b/Examples/test-suite/scilab/arrays_global_runme.sci @@ -40,6 +40,9 @@ testArray("array_d", array_d_set, array_d_get, [-10.5, 20.4], [-10.5, 20.4]); if array_const_i_get() <> [10, 20] then swigtesterror(); end +ierr = execstr('array_i_set([0:10]', 'errcatch'); +if ierr == 0 then swigtesterror("Overflow error expected"); end + if BeginString_FIX44a_get() <> "FIX.a.a" then swigtesterror(); end if BeginString_FIX44b_get() <> "FIX.b.b" then swigtesterror(); end if BeginString_FIX44c_get() <> "FIX.c.c" then swigtesterror(); end diff --git a/Lib/scilab/sciarray.swg b/Lib/scilab/sciarray.swg index a180b2127..c01299aa5 100644 --- a/Lib/scilab/sciarray.swg +++ b/Lib/scilab/sciarray.swg @@ -4,6 +4,10 @@ * * --------------------------------------------------------------------------*/ +%{ +#include +%} + %define %scilab_asarray_withcopy(TYPEMAPTYPE, FRAGMENTNAME, CTYPE, TEMPDATATYPE) %typemap(TYPEMAPTYPE, fragment="FRAGMENTNAME") CTYPE { size_t i = 0; @@ -21,16 +25,23 @@ %enddef %define %scilab_asarrayandsize_withcopy(TYPEMAPTYPE, FRAGMENTNAME, CTYPE, TEMPDATATYPE) %typemap(TYPEMAPTYPE, fragment="FRAGMENTNAME") CTYPE { - size_t i = 0; int iRows = 0; int iCols = 0; TEMPDATATYPE *pTempData = NULL; if (FRAGMENTNAME(pvApiCtx, $input, &iRows, &iCols, &pTempData, fname)) { return SWIG_ERROR; } - // TODO: add check to be sure iRows*iCols==$1_dim0 - for (i = 0; i < $1_dim0; i++) { - $1[i] = ($*1_ltype) pTempData[i]; + if (iRows*iCols <= $1_dim0) { + size_t i; + for (i = 0; i < $1_dim0; i++) { + $1[i] = ($*1_ltype) pTempData[i]; + } + } + else { + char errmsg[100]; + sprintf(errmsg, "Size of input data (%d) is too big (maximum is %d)", + iRows*iCols, $1_dim0); + SWIG_exception_fail(SWIG_OverflowError, errmsg); } } %enddef