Upstream patch that partially fixes bug #460322. The tiffcmp case is still there, but this is a step forward anyhow, so going with it for now. diff -Naur tiff-3.9.2.orig/libtiff/tif_jpeg.c tiff-3.9.2/libtiff/tif_jpeg.c --- tiff-3.9.2.orig/libtiff/tif_jpeg.c 2009-08-30 12:21:46.000000000 -0400 +++ tiff-3.9.2/libtiff/tif_jpeg.c 2009-12-05 16:48:56.000000000 -0500 @@ -1613,7 +1613,11 @@ * Must recalculate cached tile size in case sampling state changed. * Should we really be doing this now if image size isn't set? */ - tif->tif_tilesize = isTiled(tif) ? TIFFTileSize(tif) : (tsize_t) -1; + if( tif->tif_tilesize > 0 ) + tif->tif_tilesize = isTiled(tif) ? TIFFTileSize(tif) : (tsize_t) -1; + + if(tif->tif_scanlinesize > 0 ) + tif->tif_scanlinesize = TIFFScanlineSize(tif); } static int @@ -1741,13 +1745,21 @@ return; } else - { + { if( !TIFFFillStrip( tif, 0 ) ) return; } TIFFSetField( tif, TIFFTAG_YCBCRSUBSAMPLING, (uint16) sp->h_sampling, (uint16) sp->v_sampling ); + + /* + ** We want to clear the loaded strip so the application has time + ** to set JPEGCOLORMODE or other behavior modifiers. This essentially + ** undoes the JPEGPreDecode triggers by TIFFFileStrip(). (#1936) + */ + tif->tif_curstrip = -1; + #endif /* CHECK_JPEG_YCBCR_SUBSAMPLING */ }