diff options
| author | Even Rouault <even.rouault@spatialys.com> | 2017-02-26 19:37:06 +0100 |
|---|---|---|
| committer | Even Rouault <even.rouault@spatialys.com> | 2017-02-26 19:37:06 +0100 |
| commit | d64a5508c1efbc1ca6e126d959e19cf879462863 (patch) | |
| tree | 561c33c76eef4c2d139ddbd73d9d0a193dd98cca /src | |
| parent | feb4a36ebafc905611e088e7359417a4d60ebfd0 (diff) | |
| download | PROJ-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.c | 16 |
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? */ |
