Commit 71a80959bf6f51de58540ed9b39b8913ccf5f9ee
1 parent
a9ec30d3
Check for index validity in GSkyMap::__getitem__() method (#1581).
This is needed for correct catching of exceptions by the SWIG interface on some operating systems.
Showing
2 changed files
with
28 additions
and
2 deletions
pyext/GSkyMap.i
| @@ -183,11 +183,21 @@ public: | @@ -183,11 +183,21 @@ public: | ||
| 183 | ***************************************************************************/ | 183 | ***************************************************************************/ |
| 184 | %extend GSkyMap { | 184 | %extend GSkyMap { |
| 185 | double __getitem__(int GSkyMapInx[]) { | 185 | double __getitem__(int GSkyMapInx[]) { |
| 186 | + if (GSkyMapInx[1] < 0 || GSkyMapInx[1] >= self->npix()) { | ||
| 187 | + throw GException::out_of_range("__getitem__(int)", "Sky map index", | ||
| 188 | + GSkyMapInx[1], self->npix()); | ||
| 189 | + } | ||
| 186 | if (GSkyMapInx[0] == 1) { | 190 | if (GSkyMapInx[0] == 1) { |
| 187 | return (*self)(GSkyMapInx[1]); | 191 | return (*self)(GSkyMapInx[1]); |
| 188 | } | 192 | } |
| 189 | else { | 193 | else { |
| 190 | - return (*self)(GSkyMapInx[1], GSkyMapInx[2]); | 194 | + if (GSkyMapInx[2] >= 0 && GSkyMapInx[2] < self->nmaps()) { |
| 195 | + return (*self)(GSkyMapInx[1], GSkyMapInx[2]); | ||
| 196 | + } | ||
| 197 | + else { | ||
| 198 | + throw GException::out_of_range("__getitem__(int)", "Sky map number", | ||
| 199 | + GSkyMapInx[2], self->nmaps()); | ||
| 200 | + } | ||
| 191 | } | 201 | } |
| 192 | } | 202 | } |
| 193 | /* | 203 | /* |
| @@ -196,11 +206,21 @@ public: | @@ -196,11 +206,21 @@ public: | ||
| 196 | } | 206 | } |
| 197 | */ | 207 | */ |
| 198 | void __setitem__(int GSkyMapInx[], double value) { | 208 | void __setitem__(int GSkyMapInx[], double value) { |
| 209 | + if (GSkyMapInx[1] < 0 || GSkyMapInx[1] >= self->npix()) { | ||
| 210 | + throw GException::out_of_range("__setitem__(int)", "Sky map index", | ||
| 211 | + GSkyMapInx[1], self->npix()); | ||
| 212 | + } | ||
| 199 | if (GSkyMapInx[0] == 1) { | 213 | if (GSkyMapInx[0] == 1) { |
| 200 | (*self)(GSkyMapInx[1]) = value; | 214 | (*self)(GSkyMapInx[1]) = value; |
| 201 | } | 215 | } |
| 202 | else { | 216 | else { |
| 203 | - (*self)(GSkyMapInx[1], GSkyMapInx[2]) = value; | 217 | + if (GSkyMapInx[2] >= 0 && GSkyMapInx[2] < self->nmaps()) { |
| 218 | + (*self)(GSkyMapInx[1], GSkyMapInx[2]) = value; | ||
| 219 | + } | ||
| 220 | + else { | ||
| 221 | + throw GException::out_of_range("__setitem__(int)", "Sky map number", | ||
| 222 | + GSkyMapInx[2], self->nmaps()); | ||
| 223 | + } | ||
| 204 | } | 224 | } |
| 205 | } | 225 | } |
| 206 | /* | 226 | /* |
test/test_GSky.py
| @@ -370,6 +370,12 @@ class Test(gammalib.GPythonTestSuite): | @@ -370,6 +370,12 @@ class Test(gammalib.GPythonTestSuite): | ||
| 370 | self.test_value(map[1], 3.0) | 370 | self.test_value(map[1], 3.0) |
| 371 | self.test_value(map[2], 5.0) | 371 | self.test_value(map[2], 5.0) |
| 372 | self.test_value(map[3], 7.0) | 372 | self.test_value(map[3], 7.0) |
| 373 | + | ||
| 374 | + # Access operator (tests also proper iteration) | ||
| 375 | + sum = 0.0 | ||
| 376 | + for pix in map: | ||
| 377 | + sum += pix | ||
| 378 | + self.test_value(sum, 16.0) | ||
| 373 | 379 | ||
| 374 | # Return | 380 | # Return |
| 375 | return | 381 | return |