summaryrefslogtreecommitdiff
path: root/sc
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2015-10-01 10:04:54 +0100
committerEike Rathke <erack@redhat.com>2015-10-01 12:53:22 +0000
commit0cc41a033f74891ac9b47f0d1c0b291f8341a2a1 (patch)
tree8dab391c948085b1e8ecbc22627a12dbde7eac67 /sc
parent13a609e27476f4a9589f95e60417428a4aaa888b (diff)
Related: tdf#40304 extend biff-5 invalid xls loop detection
Change-Id: Ief198f88530d72cde0a253508cdf6de2975b31ab Reviewed-on: https://gerrit.libreoffice.org/19066 Reviewed-by: Eike Rathke <erack@redhat.com> Tested-by: Eike Rathke <erack@redhat.com>
Diffstat (limited to 'sc')
-rw-r--r--sc/source/filter/excel/read.cxx60
1 files changed, 38 insertions, 22 deletions
diff --git a/sc/source/filter/excel/read.cxx b/sc/source/filter/excel/read.cxx
index fae3ffd45184..5e5558e39fc3 100644
--- a/sc/source/filter/excel/read.cxx
+++ b/sc/source/filter/excel/read.cxx
@@ -41,6 +41,28 @@
#include <memory>
+namespace
+{
+ bool TryStartNextRecord(XclImpStream& rIn, sal_Size nProgressBasePos)
+ {
+ bool bValid = true;
+ // i#115255 fdo#40304 BOUNDSHEET doesn't point to a valid
+ // BOF record position. Scan the records manually (from
+ // the BOUNDSHEET position) until we find a BOF. Some 3rd
+ // party Russian programs generate invalid xls docs with
+ // this kind of silliness.
+ if (rIn.PeekRecId(nProgressBasePos) == EXC_ID5_BOF)
+ // BOUNDSHEET points to a valid BOF record. Good.
+ rIn.StartNextRecord(nProgressBasePos);
+ else
+ {
+ while (bValid && rIn.GetRecId() != EXC_ID5_BOF)
+ bValid = rIn.StartNextRecord();
+ }
+ return bValid;
+ }
+}
+
FltError ImportExcel::Read()
{
XclImpPageSettings& rPageSett = GetPageSettings();
@@ -98,7 +120,13 @@ FltError ImportExcel::Read()
{
nProgressBaseSize += (aIn.GetSvStreamPos() - nProgressBasePos);
nProgressBasePos = maSheetOffsets[ nScTab ];
- aIn.StartNextRecord( nProgressBasePos );
+
+ bool bValid = TryStartNextRecord(aIn, nProgressBasePos);
+ if (!bValid)
+ {
+ // Safeguard ourselves from potential infinite loop.
+ eAkt = Z_Ende;
+ }
}
else
eAkt = Z_Ende;
@@ -435,7 +463,7 @@ FltError ImportExcel::Read()
case 0x0223: break; // EXTERNNAME [ 34 ]
case 0x0225: Defrowheight345();break;//DEFAULTROWHEI[ 345]
case 0x0231: rFontBfr.ReadFont( maStrm ); break;
- case 0x0409: // BOF [ 4 ]
+ case EXC_ID4_BOF: // BOF [ 4 ]
Bof4();
if( pExcRoot->eDateiTyp == Biff4 )
{
@@ -527,7 +555,7 @@ FltError ImportExcel::Read()
eAkt = Z_Ende;
break;
case 0x8F: break; // BUNDLEHEADER [ 4 ]
- case 0x0409: // BOF [ 4 ]
+ case EXC_ID4_BOF: // BOF [ 4 ]
Bof4();
NewTable();
if( pExcRoot->eDateiTyp == Biff4 )
@@ -595,7 +623,7 @@ FltError ImportExcel::Read()
case Z_Biff5TPre: // ------------------------------- Z_Biff5Pre -
{
- if( nOpcode == 0x0809 )
+ if (nOpcode == EXC_ID5_BOF)
nBofLevel++;
else if( (nOpcode == 0x000A) && nBofLevel )
nBofLevel--;
@@ -681,7 +709,7 @@ FltError ImportExcel::Read()
case 0xD6: Rstring(); break; // RSTRING [ 5]
case 0x00E5: Cellmerging(); break; // #i62300#
case 0x0236: TableOp(); break; // TABLE [ 5]
- case 0x0809: // BOF [ 5]
+ case EXC_ID5_BOF: // BOF [ 5]
XclTools::SkipSubStream( maStrm );
break;
}
@@ -693,7 +721,7 @@ FltError ImportExcel::Read()
{
switch( nOpcode )
{
- case 0x0809: // BOF [ 5]
+ case EXC_ID5_BOF: // BOF [ 5]
Bof5();
NewTable();
switch( pExcRoot->eDateiTyp )
@@ -836,23 +864,11 @@ FltError ImportExcel8::Read()
nProgressBaseSize += (maStrm.GetSvStreamPos() - nProgressBasePos);
nProgressBasePos = maSheetOffsets[ nScTab ];
- // i#115255 fdo#40304 BOUNDSHEET doesn't point to a valid
- // BOF record position. Scan the records manually (from
- // the BOUNDSHEET position) until we find a BOF. Some 3rd
- // party Russian programs generate invalid xls docs with
- // this kind of silliness.
- if (aIn.PeekRecId(nProgressBasePos) == EXC_ID5_BOF)
- // BOUNDSHEET points to a valid BOF record. Good.
- aIn.StartNextRecord(nProgressBasePos);
- else
+ bool bValid = TryStartNextRecord(aIn, nProgressBasePos);
+ if (!bValid)
{
- bool bValid = true;
- while (bValid && aIn.GetRecId() != EXC_ID5_BOF)
- bValid = aIn.StartNextRecord();
-
- if (!bValid)
- // Safeguard ourselves from potential infinite loop.
- eAkt = EXC_STATE_END;
+ // Safeguard ourselves from potential infinite loop.
+ eAkt = EXC_STATE_END;
}
// import only 256 sheets