blob: cdc3c2d1b9f1f1b265998831e5b08808d57a0dbb [file] [log] [blame]
diff --git a/third_party/libtiff/tif_getimage.c b/third_party/libtiff/tif_getimage.c
index 41f7dfd77..8603ff026 100644
--- a/third_party/libtiff/tif_getimage.c
+++ b/third_party/libtiff/tif_getimage.c
@@ -723,6 +723,7 @@ static int gtTileContig(TIFFRGBAImage *img, uint32_t *raster, uint32_t w,
uint32_t this_tw, tocol;
int32_t this_toskew, leftmost_toskew;
int32_t leftmost_fromskew;
+ int64_t safeskew;
uint32_t leftmost_tw;
tmsize_t bufsize;
@@ -792,9 +793,28 @@ static int gtTileContig(TIFFRGBAImage *img, uint32_t *raster, uint32_t w,
/*
* Rightmost tile is clipped on right side.
*/
- fromskew = tw - (w - tocol);
+ safeskew = tw;
+ safeskew -= w;
+ safeskew += tocol;
+ if (safeskew > INT_MAX || safeskew < INT_MIN)
+ {
+ _TIFFfree(buf);
+ TIFFErrorExt(tif->tif_clientdata, TIFFFileName(tif), "%s",
+ "Invalid skew");
+ return (0);
+ }
+ fromskew = safeskew;
this_tw = tw - fromskew;
- this_toskew = toskew + fromskew;
+ safeskew = toskew;
+ safeskew += fromskew;
+ if (safeskew > INT_MAX || safeskew < INT_MIN)
+ {
+ _TIFFfree(buf);
+ TIFFErrorExt(tif->tif_clientdata, TIFFFileName(tif), "%s",
+ "Invalid skew");
+ return (0);
+ }
+ this_toskew = safeskew;
}
tmsize_t roffset = (tmsize_t)y * w + tocol;
(*put)(img, raster + roffset, tocol, y, this_tw, nrow, fromskew,