From 95cbce0a6f3d1ae2068a56ca2aafc5d4e44b475d Mon Sep 17 00:00:00 2001 From: Even Rouault Date: Mon, 30 Dec 2024 16:28:55 +0100 Subject: [PATCH] GTiff: CacheMultiRange(): properly react to errors in VSIFReadMultiRangeL() Fixes #11552 --- frmts/gtiff/gtiffrasterband_read.cpp | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) 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; + } } } }