diff options
author | Caolán McNamara <caolanm@redhat.com> | 2014-08-17 16:21:31 +0100 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2014-08-17 16:24:44 +0100 |
commit | 43b39d3e47ffd179071732c0a8fc201c31b2bb46 (patch) | |
tree | 73677c4f2e04191f753d5bc2c9b28d76c741a7ca /vcl | |
parent | b9623def050f8276d2d4160c01198fba201011fa (diff) |
check that AddToTable can be done validly
Change-Id: I0ee69279e3bb1d9871feba17b908b8307f0ec5b4
Diffstat (limited to 'vcl')
-rw-r--r-- | vcl/source/filter/igif/decode.cxx | 20 | ||||
-rw-r--r-- | vcl/source/filter/igif/decode.hxx | 2 |
2 files changed, 16 insertions, 6 deletions
diff --git a/vcl/source/filter/igif/decode.cxx b/vcl/source/filter/igif/decode.cxx index 3a00834eca82..d50ac7c3bd15 100644 --- a/vcl/source/filter/igif/decode.cxx +++ b/vcl/source/filter/igif/decode.cxx @@ -107,7 +107,7 @@ HPBYTE GIFLZWDecompressor::DecompressBlock( HPBYTE pSrc, sal_uInt8 cBufSize, return pTarget; } -void GIFLZWDecompressor::AddToTable( sal_uInt16 nPrevCode, sal_uInt16 nCodeFirstData ) +bool GIFLZWDecompressor::AddToTable( sal_uInt16 nPrevCode, sal_uInt16 nCodeFirstData ) { GIFLZWTableEntry* pE; @@ -116,12 +116,16 @@ void GIFLZWDecompressor::AddToTable( sal_uInt16 nPrevCode, sal_uInt16 nCodeFirst pE = pTable + nTableSize; pE->pPrev = pTable + nPrevCode; pE->pFirst = pE->pPrev->pFirst; - pE->nData = pTable[ nCodeFirstData ].pFirst->nData; + GIFLZWTableEntry *pEntry = pTable[nCodeFirstData].pFirst; + if (!pEntry) + return false; + pE->nData = pEntry->nData; nTableSize++; if ( ( nTableSize == (sal_uInt16) (1 << nCodeSize) ) && ( nTableSize < 4096 ) ) nCodeSize++; } + return true; } bool GIFLZWDecompressor::ProcessOneCode() @@ -153,17 +157,23 @@ bool GIFLZWDecompressor::ProcessOneCode() if ( nCode < nClearCode ) { + bool bOk = true; if ( nOldCode != 0xffff ) - AddToTable( nOldCode, nCode ); + bOk = AddToTable(nOldCode, nCode); + if (!bOk) + return false; } else if ( ( nCode > nEOICode ) && ( nCode <= nTableSize ) ) { if ( nOldCode != 0xffff ) { + bool bOk; if ( nCode == nTableSize ) - AddToTable( nOldCode, nOldCode ); + bOk = AddToTable( nOldCode, nOldCode ); else - AddToTable( nOldCode, nCode ); + bOk = AddToTable( nOldCode, nCode ); + if (!bOk) + return false; } } else diff --git a/vcl/source/filter/igif/decode.hxx b/vcl/source/filter/igif/decode.hxx index 542532673359..ee093bfaa2c5 100644 --- a/vcl/source/filter/igif/decode.hxx +++ b/vcl/source/filter/igif/decode.hxx @@ -43,7 +43,7 @@ class GIFLZWDecompressor sal_uInt8 nBlockBufSize; sal_uInt8 nBlockBufPos; - void AddToTable(sal_uInt16 nPrevCode, sal_uInt16 nCodeFirstData); + bool AddToTable(sal_uInt16 nPrevCode, sal_uInt16 nCodeFirstData); bool ProcessOneCode(); public: |