diff options
author | Caolán McNamara <caolanm@redhat.com> | 2015-07-17 09:23:17 +0100 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2015-07-17 09:29:14 +0100 |
commit | 290465b0effecb6d620adc20ca279f8057eeab9a (patch) | |
tree | 66d147338094cf81440484ba4c10fb7c9b0337e8 | |
parent | 7ea6f476cb4f3a21904db5a5d7170e8dbae804a1 (diff) |
detect loop in tif format
Change-Id: I27645566cd9fc0ac8cf753f0217ae6cf0fa9929e
-rw-r--r-- | filter/qa/cppunit/data/tiff/fail/loop.tif | bin | 0 -> 17 bytes | |||
-rw-r--r-- | filter/source/graphicfilter/itiff/itiff.cxx | 12 |
2 files changed, 11 insertions, 1 deletions
diff --git a/filter/qa/cppunit/data/tiff/fail/loop.tif b/filter/qa/cppunit/data/tiff/fail/loop.tif Binary files differnew file mode 100644 index 000000000000..6d8cee732e2c --- /dev/null +++ b/filter/qa/cppunit/data/tiff/fail/loop.tif diff --git a/filter/source/graphicfilter/itiff/itiff.cxx b/filter/source/graphicfilter/itiff/itiff.cxx index 84bff7336f52..9ae2a0639eab 100644 --- a/filter/source/graphicfilter/itiff/itiff.cxx +++ b/filter/source/graphicfilter/itiff/itiff.cxx @@ -1210,9 +1210,19 @@ bool TIFFReader::ReadTIFF(SvStream & rTIFF, Graphic & rGraphic ) } while( nOffset ); + std::vector<sal_uInt32> aSeenIfds; + for ( sal_uInt32 nNextIfd = nFirstIfd; nNextIfd && bStatus; ) { - pTIFF->Seek( nOrigPos + nNextIfd ); + if (std::find(aSeenIfds.begin(), aSeenIfds.end(), nNextIfd) != aSeenIfds.end()) + { + SAL_WARN("filter.tiff", "Parsing error: " << nNextIfd << + " already processed, format loop"); + bStatus = false; + break; + } + pTIFF->Seek(nOrigPos + nNextIfd); + aSeenIfds.push_back(nNextIfd); { bByteSwap = false; |