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,