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,
