From 71a80959bf6f51de58540ed9b39b8913ccf5f9ee Mon Sep 17 00:00:00 2001 From: Jürgen Knödlseder Date: Wed, 25 Nov 2015 00:01:43 +0100 Subject: [PATCH] Check for index validity in GSkyMap::__getitem__() method (#1581). --- pyext/GSkyMap.i | 24 ++++++++++++++++++++++-- test/test_GSky.py | 6 ++++++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/pyext/GSkyMap.i b/pyext/GSkyMap.i index 50f3dce..1922686 100644 --- a/pyext/GSkyMap.i +++ b/pyext/GSkyMap.i @@ -183,11 +183,21 @@ public: ***************************************************************************/ %extend GSkyMap { double __getitem__(int GSkyMapInx[]) { + if (GSkyMapInx[1] < 0 || GSkyMapInx[1] >= self->npix()) { + throw GException::out_of_range("__getitem__(int)", "Sky map index", + GSkyMapInx[1], self->npix()); + } if (GSkyMapInx[0] == 1) { return (*self)(GSkyMapInx[1]); } else { - return (*self)(GSkyMapInx[1], GSkyMapInx[2]); + if (GSkyMapInx[2] >= 0 && GSkyMapInx[2] < self->nmaps()) { + return (*self)(GSkyMapInx[1], GSkyMapInx[2]); + } + else { + throw GException::out_of_range("__getitem__(int)", "Sky map number", + GSkyMapInx[2], self->nmaps()); + } } } /* @@ -196,11 +206,21 @@ public: } */ void __setitem__(int GSkyMapInx[], double value) { + if (GSkyMapInx[1] < 0 || GSkyMapInx[1] >= self->npix()) { + throw GException::out_of_range("__setitem__(int)", "Sky map index", + GSkyMapInx[1], self->npix()); + } if (GSkyMapInx[0] == 1) { (*self)(GSkyMapInx[1]) = value; } else { - (*self)(GSkyMapInx[1], GSkyMapInx[2]) = value; + if (GSkyMapInx[2] >= 0 && GSkyMapInx[2] < self->nmaps()) { + (*self)(GSkyMapInx[1], GSkyMapInx[2]) = value; + } + else { + throw GException::out_of_range("__setitem__(int)", "Sky map number", + GSkyMapInx[2], self->nmaps()); + } } } /* diff --git a/test/test_GSky.py b/test/test_GSky.py index 4f21ac9..b6b5cf6 100755 --- a/test/test_GSky.py +++ b/test/test_GSky.py @@ -370,6 +370,12 @@ class Test(gammalib.GPythonTestSuite): self.test_value(map[1], 3.0) self.test_value(map[2], 5.0) self.test_value(map[3], 7.0) + + # Access operator (tests also proper iteration) + sum = 0.0 + for pix in map: + sum += pix + self.test_value(sum, 16.0) # Return return -- libgit2 0.21.4