diff --git a/src/Variable.c b/src/Variable.c index b3cbaa4..2aca29f 100644 --- a/src/Variable.c +++ b/src/Variable.c @@ -699,6 +699,14 @@ static PyObject *Variable_GetSingleValue(udt_Variable *var, uint32_t arrayPos) PyObject *value, *result; dpiData *data; + // ensure we do not exceed the number of allocated elements + if (arrayPos >= var->allocatedElements) { + PyErr_SetString(PyExc_IndexError, + "Variable_GetSingleValue: array size exceeded"); + return NULL; + } + + // return the value data = &var->data[arrayPos]; if (data->isNull) Py_RETURN_NONE; diff --git a/test/StringVar.py b/test/StringVar.py index 4b6f944..3a5e5cb 100644 --- a/test/StringVar.py +++ b/test/StringVar.py @@ -49,6 +49,11 @@ class TestStringVar(BaseTestCase): retval = retval_2) self.assertEqual(retval_2.getvalue(), "Called") + def testExceedsNumElements(self): + "test exceeding the number of elements returns IndexError" + var = self.cursor.var(str) + self.assertRaises(IndexError, var.getvalue, 1) + def testBindStringAfterNumber(self): "test binding in a string after setting input sizes to a number" self.cursor.setinputsizes(value = cx_Oracle.NUMBER)