diff --git a/frmts/gtiff/gtiffrasterband_read.cpp b/frmts/gtiff/gtiffrasterband_read.cpp index 59806e6e7e2a..c29be2bc98f4 100644 --- a/frmts/gtiff/gtiffrasterband_read.cpp +++ b/frmts/gtiff/gtiffrasterband_read.cpp @@ -1071,9 +1071,17 @@ void *GTiffRasterBand::CacheMultiRange(int nXOff, int nYOff, int nXSize, VSILFILE *fp = VSI_TIFFGetVSILFile(th); - if (VSIFReadMultiRangeL(static_cast(anSizes.size()), + // An error in VSIFReadMultiRangeL() will not be criticial, + // as this method is an optimization, and if it fails, + // tile-by-tile data acquisition will be done, so we can + // temporary turn failures into warnings. + CPLTurnFailureIntoWarning(true); + const bool ok = + VSIFReadMultiRangeL(static_cast(anSizes.size()), &apData[0], &anOffsets[0], &anSizes[0], - fp) == 0) + fp) == 0; + CPLTurnFailureIntoWarning(false); + if (ok) { if (!oMapStrileToOffsetByteCount.empty() && !FillCacheStrileToOffsetByteCount(anOffsets, anSizes, @@ -1093,6 +1101,11 @@ void *GTiffRasterBand::CacheMultiRange(int nXOff, int nYOff, int nXSize, th, static_cast(anSizes.size()), &apData[0], &anOffsets[0], &anSizes[0]); } + else + { + CPLFree(pBufferedData); + pBufferedData = nullptr; + } } } }