Kaydet (Commit) 4cb69cf3 authored tarafından Stephan Bergmann's avatar Stephan Bergmann

Avoid further downstream overflow

...after 004304eb "try to avoid overflows in
some compare functions" had changed the return type of just one function, but
not its callers.  Found with Clang's new -fsanitize=implicit-conversion during
CppunitTest_sd_filters_test:

> Testing file:///home/sbergman/lo/core/sd/qa/unit/data/ppt/pass/hang-17.ppt:
[...]
> sot/source/sdstor/stgdir.cxx:101:19: runtime error: implicit conversion from type 'sal_Int32' (aka 'int') of value -57120 (32-bit, signed) to type 'short' changed the value to 8416 (16-bit, signed)
>  #0 in StgDirEntry::Compare(StgAvlNode const*) const at sot/source/sdstor/stgdir.cxx:101:19 (instdir/program/libsotlo.so +0x217699)
>  #1 in StgAvlNode::Find(StgAvlNode const*) at sot/source/sdstor/stgavl.cxx:43:29 (instdir/program/libsotlo.so +0x1db72b)
>  #2 in StgDirStrm::Find(StgDirEntry&, rtl::OUString const&) at sot/source/sdstor/stgdir.cxx:907:57 (instdir/program/libsotlo.so +0x22f2dc)
>  #3 in Storage::IsStream(rtl::OUString const&) const at sot/source/sdstor/stg.cxx:773:39 (instdir/program/libsotlo.so +0x1d2cdf)
>  #4 in SotStorage::IsStream(rtl::OUString const&) const at sot/source/sdstor/storage.cxx:654:27 (instdir/program/libsotlo.so +0x29ebdb)
>  #5 in PropRead::PropRead(SotStorage&, rtl::OUString const&) at sd/source/filter/ppt/propread.cxx:543:19 (instdir/program/libsdfiltlo.so +0x6b72ee)
>  #6 in ImplSdPPTImport::Import() at sd/source/filter/ppt/pptin.cxx:262:32 (instdir/program/libsdfiltlo.so +0x5d0dc4)
>  #7 in SdPPTImport::Import() at sd/source/filter/ppt/pptin.cxx:167:21 (instdir/program/libsdfiltlo.so +0x5cf733)
>  #8 in ImportPPT at sd/source/filter/ppt/pptin.cxx:2761:26 (instdir/program/libsdfiltlo.so +0x618f64)
>  #9 in SdPPTFilter::Import() at sd/source/filter/sdpptwrp.cxx:106:32 (instdir/program/libsdlo.so +0x2877ed3)
>  #10 in sd::DrawDocShell::ConvertFrom(SfxMedium&) at sd/source/ui/docshell/docshel4.cxx:474:46 (instdir/program/libsdlo.so +0x2e1607c)
>  #11 in SfxObjectShell::DoLoad(SfxMedium*) at sfx2/source/doc/objstor.cxx:786:23 (instdir/program/libsfxlo.so +0x2c8c762)
>  #12 in SdFiltersTest::load(rtl::OUString const&, rtl::OUString const&, rtl::OUString const&, SfxFilterFlags, SotClipboardFormatId, unsigned int) at sd/qa/unit/filters-test.cxx:75:31 (workdir/LinkTarget/CppunitTest/libtest_sd_filters_test.so +0x19771)
>  #13 in test::FiltersTest::recursiveScan(test::filterStatus, rtl::OUString const&, rtl::OUString const&, rtl::OUString const&, SfxFilterFlags, SotClipboardFormatId, unsigned int, bool) at unotest/source/cpp/filters-test.cxx:130:20 (workdir/LinkTarget/CppunitTest/../Library/libunotest.so +0x5724c)
>  #14 in test::FiltersTest::testDir(rtl::OUString const&, rtl::OUString const&, rtl::OUString const&, SfxFilterFlags, SotClipboardFormatId, unsigned int, bool) at unotest/source/cpp/filters-test.cxx:155:5 (workdir/LinkTarget/CppunitTest/../Library/libunotest.so +0x57ec9)
>  #15 in SdFiltersTest::testCVEs() at sd/qa/unit/filters-test.cxx:83:5 (workdir/LinkTarget/CppunitTest/libtest_sd_filters_test.so +0x19d6d)

Change-Id: Iaffd35d33f0e1109195e3bd56538104d395af01b
Reviewed-on: https://gerrit.libreoffice.org/59274
Tested-by: Jenkins
Reviewed-by: 's avatarStephan Bergmann <sbergman@redhat.com>
üst abb78009
......@@ -40,7 +40,7 @@ StgAvlNode* StgAvlNode::Find( StgAvlNode const * pFind )
StgAvlNode* p = this;
while( p )
{
short nRes = p->Compare( pFind );
sal_Int32 nRes = p->Compare( pFind );
if( !nRes )
return p;
else p = ( nRes < 0 ) ? p->m_pLeft : p->m_pRight;
......@@ -52,11 +52,11 @@ StgAvlNode* StgAvlNode::Find( StgAvlNode const * pFind )
// find point to add node to AVL tree and returns
// +/0/- for >/=/< previous
short StgAvlNode::Locate
sal_Int32 StgAvlNode::Locate
( StgAvlNode const * pFind,
StgAvlNode** pPivot, StgAvlNode **pParent, StgAvlNode** pPrev )
{
short nRes = 0;
sal_Int32 nRes = 0;
StgAvlNode* pCur = this;
OSL_ENSURE( pPivot && pParent && pPrev, "The pointers may not be NULL!" );
......@@ -98,7 +98,7 @@ short StgAvlNode::Adjust( StgAvlNode** pHeavy, StgAvlNode const * pNew )
if( pCur == pNew || !pNew )
return m_nBalance;
short nRes = Compare( pNew );
sal_Int32 nRes = Compare( pNew );
if( nRes > 0 )
{
*pHeavy = pCur = m_pRight;
......@@ -221,7 +221,7 @@ StgAvlNode* StgAvlNode::Rem( StgAvlNode** p, StgAvlNode* pDel, bool bPtrs )
if( p && *p && pDel )
{
StgAvlNode* pCur = *p;
short nRes = bPtrs ? short( pCur == pDel ) : pCur->Compare( pDel );
sal_Int32 nRes = bPtrs ? sal_Int32( pCur == pDel ) : pCur->Compare( pDel );
if( !nRes )
{
// Element found: remove
......@@ -295,7 +295,7 @@ bool StgAvlNode::Insert( StgAvlNode** pRoot, StgAvlNode* pIns )
return true;
}
// find insertion point and return if already present
short nRes = (*pRoot)->Locate( pIns, &pPivot, &pParent, &pPrev );
sal_Int32 nRes = (*pRoot)->Locate( pIns, &pPivot, &pParent, &pPrev );
if( !nRes )
return false;
......
......@@ -27,7 +27,7 @@ class StgAvlNode
{
friend class StgAvlIterator;
private:
short Locate( StgAvlNode const *, StgAvlNode**, StgAvlNode**, StgAvlNode** );
sal_Int32 Locate( StgAvlNode const *, StgAvlNode**, StgAvlNode**, StgAvlNode** );
short Adjust( StgAvlNode**, StgAvlNode const * );
StgAvlNode* RotLL();
StgAvlNode* RotLR();
......@@ -45,7 +45,7 @@ public:
StgAvlNode* Find( StgAvlNode const * );
static bool Insert( StgAvlNode**, StgAvlNode* );
static bool Remove( StgAvlNode**, StgAvlNode*, bool bDel );
virtual short Compare( const StgAvlNode* ) const = 0;
virtual sal_Int32 Compare( const StgAvlNode* ) const = 0;
};
// The iterator class provides single stepping through an AVL tree.
......
......@@ -92,9 +92,9 @@ StgDirEntry::~StgDirEntry()
// Comparison function
short StgDirEntry::Compare( const StgAvlNode* p ) const
sal_Int32 StgDirEntry::Compare( const StgAvlNode* p ) const
{
short nResult = -1;
sal_Int32 nResult = -1;
if ( p )
{
const StgDirEntry* pEntry = static_cast<const StgDirEntry*>(p);
......
......@@ -45,7 +45,7 @@ class StgDirEntry : public StgAvlNode
bool m_bDirty; // dirty directory entry
bool m_bRemoved; // removed per Invalidate()
void InitMembers(); // ctor helper
virtual short Compare( const StgAvlNode* ) const override;
virtual sal_Int32 Compare( const StgAvlNode* ) const override;
bool StoreStream( StgIo& ); // store the stream
bool StoreStreams( StgIo& ); // store all streams
void RevertAll(); // revert the whole tree
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment