diff options
| author | Kristian Evers <kristianevers@gmail.com> | 2017-11-01 10:52:31 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2017-11-01 10:52:31 +0100 |
| commit | ceabba0ecd3602c86d84dac6d61209367a2b6a1e (patch) | |
| tree | d9ce85468005c15c4eea15056974e0186ac9593d | |
| parent | 0d1eeb16dd0a574d81ba0eaeea430f1be105a038 (diff) | |
| parent | 7503fbe7511cf9b98f9321ef27ee7d2c05401a1e (diff) | |
| download | PROJ-ceabba0ecd3602c86d84dac6d61209367a2b6a1e.tar.gz PROJ-ceabba0ecd3602c86d84dac6d61209367a2b6a1e.zip | |
Merge pull request #638 from kbevers/gridshift_overflow
Resolves several OSS-Fuzz issues: 3944, 3947, 3955.
| -rw-r--r-- | src/pj_apply_vgridshift.c | 50 |
1 files changed, 25 insertions, 25 deletions
diff --git a/src/pj_apply_vgridshift.c b/src/pj_apply_vgridshift.c index 3c7cc210..6435b954 100644 --- a/src/pj_apply_vgridshift.c +++ b/src/pj_apply_vgridshift.c @@ -92,33 +92,33 @@ static double pj_read_vgrid_value( PJ *defn, LP input, int *gridlist_count_p, PJ return PJD_ERR_FAILED_TO_LOAD_GRID; } - } - /* Interpolation a location within the grid */ - grid_x = (input.lam - ct->ll.lam) / ct->del.lam; - grid_y = (input.phi - ct->ll.phi) / ct->del.phi; - grid_ix = (int) floor(grid_x); - grid_iy = (int) floor(grid_y); - 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] - * (1.0-grid_x) * (1.0-grid_y) - + cvs[grid_ix2 + grid_iy * ct->lim.lam] - * (grid_x) * (1.0-grid_y) - + cvs[grid_ix + grid_iy2 * ct->lim.lam] - * (1.0-grid_x) * (grid_y) - + cvs[grid_ix2 + grid_iy2 * ct->lim.lam] - * (grid_x) * (grid_y); + /* Interpolation a location within the grid */ + grid_x = (input.lam - ct->ll.lam) / ct->del.lam; + grid_y = (input.phi - ct->ll.phi) / ct->del.phi; + grid_ix = (int) floor(grid_x); + grid_iy = (int) floor(grid_y); + 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] + * (1.0-grid_x) * (1.0-grid_y) + + cvs[grid_ix2 + grid_iy * ct->lim.lam] + * (grid_x) * (1.0-grid_y) + + cvs[grid_ix + grid_iy2 * ct->lim.lam] + * (1.0-grid_x) * (grid_y) + + cvs[grid_ix2 + grid_iy2 * ct->lim.lam] + * (grid_x) * (grid_y); + } /* nodata? */ /* GTX official nodata value if -88.88880f, but some grids also */ /* use other big values for nodata (e.g naptrans2008.gtx has */ |
