aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEven Rouault <even.rouault@spatialys.com>2017-02-26 19:37:06 +0100
committerEven Rouault <even.rouault@spatialys.com>2017-02-26 19:37:06 +0100
commitd64a5508c1efbc1ca6e126d959e19cf879462863 (patch)
tree561c33c76eef4c2d139ddbd73d9d0a193dd98cca /src
parentfeb4a36ebafc905611e088e7359417a4d60ebfd0 (diff)
downloadPROJ-d64a5508c1efbc1ca6e126d959e19cf879462863.tar.gz
PROJ-d64a5508c1efbc1ca6e126d959e19cf879462863.zip
Vertical grids: avoid out-of-bounds read on east and south edges (#396)
Diffstat (limited to 'src')
-rw-r--r--src/pj_apply_vgridshift.c16
1 files changed, 12 insertions, 4 deletions
diff --git a/src/pj_apply_vgridshift.c b/src/pj_apply_vgridshift.c
index 7c498085..5b81a26d 100644
--- a/src/pj_apply_vgridshift.c
+++ b/src/pj_apply_vgridshift.c
@@ -90,6 +90,7 @@ int pj_apply_vgridshift( PJ *defn, const char *listname,
struct CTABLE *ct = gi->ct;
double grid_x, grid_y;
int grid_ix, grid_iy;
+ int grid_ix2, grid_iy2;
float *cvs;
/* skip tables that don't match our point at all. */
@@ -141,14 +142,21 @@ int pj_apply_vgridshift( PJ *defn, const char *listname,
grid_x -= grid_ix;
grid_y -= grid_iy;
+ grid_ix2 = grid_ix + 1;
+ if( grid_ix2 >= ct->lim.lam )
+ grid_ix2 = ct->lim.lam - 1;
+ grid_iy2 = grid_iy + 1;
+ if( grid_iy2 >= ct->lim.phi )
+ grid_iy2 = ct->lim.phi - 1;
+
cvs = (float *) ct->cvs;
- value = cvs[grid_ix + grid_iy * ct->lim.lam]
+ value = cvs[grid_ix + grid_iy * ct->lim.lam]
* (1.0-grid_x) * (1.0-grid_y)
- + cvs[grid_ix + 1 + grid_iy * ct->lim.lam]
+ + cvs[grid_ix2 + grid_iy * ct->lim.lam]
* (grid_x) * (1.0-grid_y)
- + cvs[grid_ix + (grid_iy+1) * ct->lim.lam]
+ + cvs[grid_ix + grid_iy2 * ct->lim.lam]
* (1.0-grid_x) * (grid_y)
- + cvs[grid_ix + 1 + (grid_iy+1) * ct->lim.lam]
+ + cvs[grid_ix2 + grid_iy2 * ct->lim.lam]
* (grid_x) * (grid_y);
/* nodata? */