summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNoel Power <noel.power@novell.com>2011-01-10 15:26:47 +0000
committerThorsten Behrens <tbehrens@novell.com>2011-01-10 17:49:55 +0100
commit2b7b205993f27fac8c204bc3cb93ee7235a898bb (patch)
treeb88ab68050a7b0843fb952d49f9ac6ac2ab7c29b
parent33ccd99de501dfe9be979a5fac850b844c0e9aa2 (diff)
fdo#32600# fix specific core dump on read
Seems like the REFERENCENAME record has some optional parts ( when Reserved is not eh expected 0x003E ) Ultimately thow we should get rid of filter/source/msfilter/msvbasic.cxx in favour of the oox filter. (cherry picked from commit 3dafb0e3f67b676169238b565890d88258377eb4) Signed-off-by: Thorsten Behrens <tbehrens@novell.com>
-rw-r--r--filter/source/msfilter/msvbasic.cxx17
1 files changed, 15 insertions, 2 deletions
diff --git a/filter/source/msfilter/msvbasic.cxx b/filter/source/msfilter/msvbasic.cxx
index 11ed8b762932..ce937dd61dab 100644
--- a/filter/source/msfilter/msvbasic.cxx
+++ b/filter/source/msfilter/msvbasic.cxx
@@ -435,7 +435,8 @@ ReferenceNameRecord() : Id( 0x16 ), SizeOfName( 0 ), Reserved( 0x3E ), SizeOfNam
void read( SvStream* pStream )
{
- OSL_TRACE("NameRecord [0x%x]", pStream->Tell() );
+ long nPos = pStream->Tell();
+ OSL_TRACE("NameRecord [0x%x]", nPos );
*pStream >> Id >> SizeOfName;
boost::scoped_array< sal_uInt8 > pName( new sal_uInt8[ SizeOfName ] );
@@ -443,7 +444,19 @@ void read( SvStream* pStream )
pStream->Read( pName.get(), SizeOfName );
Name = svt::BinFilterUtils::CreateOUStringFromStringArray( reinterpret_cast< const char* >( pName.get() ), SizeOfName );
- *pStream >> Reserved >> SizeOfNameUnicode;
+ nPos = pStream->Tell();
+ *pStream >> Reserved;
+
+ if ( Reserved != 0x3E )
+ {
+ // it seems the spec here is incorrect and the Unicode portion
+ // looks like it can be optional ( if 'Reserved' isn't the expected
+ // 0x34 ) - return stream here to point before Reserved
+ pStream->Seek( nPos );
+ return;
+ }
+
+ *pStream >> SizeOfNameUnicode;
boost::scoped_array< sal_uInt8 > pNameUnicode( new sal_uInt8[ SizeOfNameUnicode ] );
pStream->Read( pNameUnicode.get(), SizeOfNameUnicode );