chart2/source/view/axes/ScaleAutomatism.cxx | 2 chart2/source/view/main/ChartView.cxx | 3 dbaccess/source/core/api/RowSetCache.cxx | 2 extensions/source/plugin/base/xplugin.cxx | 93 ++++++++---- extensions/source/plugin/inc/plugin/impl.hxx | 1 include/basegfx/range/b2dconnectedranges.hxx | 2 include/cppuhelper/interfacecontainer.hxx | 2 package/source/zippackage/ZipPackageFolderEnumeration.cxx | 2 sc/source/core/data/dociter.cxx | 4 sd/source/core/shapelist.cxx | 2 sd/source/ui/view/ViewShellManager.cxx | 2 svtools/source/control/calendar.cxx | 18 +- sw/qa/extras/uiwriter/uiwriter.cxx | 2 sw/source/core/access/accmap.cxx | 2 vcl/source/control/field2.cxx | 4 xmloff/source/core/unointerfacetouniqueidentifiermapper.cxx | 2 16 files changed, 89 insertions(+), 54 deletions(-)
New commits: commit 040cf119d184233971b9cbcc9c5478d9089f9157 Author: Michael Stahl <mst...@redhat.com> Date: Fri Mar 13 16:07:36 2015 +0100 extensions: PVS-Studio V595 The 'm_pPlugin' pointer could be null The plugin streams are a bit of a disaster area: there are 2 of them with a common base class and the PluginInputStream is a UNO service. The m_pPlugin gets reset in PluginStream::setMode(-1), which is called by the plugin itself. So those PluginStream/PluginInputStream methods that are called via UNO (including dtors) need to check that m_pPlugin isn't null, but they also lock member access with m_pPlugin's mutex. Try to ensure that that works by ensuring that the plugin is still alive with a WeakReference, *and* checking that m_pPlugin isn't null. Change-Id: I925b30dd7cad3d3587fcc6b10f888e30d45fc38a diff --git a/extensions/source/plugin/base/xplugin.cxx b/extensions/source/plugin/base/xplugin.cxx index 74106a2..62451c7 100644 --- a/extensions/source/plugin/base/xplugin.cxx +++ b/extensions/source/plugin/base/xplugin.cxx @@ -930,8 +930,10 @@ PluginDescription XPlugin_Impl::fitDescription( const OUString& rURL ) PluginStream::PluginStream( XPlugin_Impl* pPlugin, - const char* url, sal_uInt32 len, sal_uInt32 lastmod ) : - m_pPlugin( pPlugin ) + const char* url, sal_uInt32 len, sal_uInt32 lastmod) + : m_wPlugin(static_cast< ::cppu::OWeakObject* >(pPlugin)) + , m_pPlugin(pPlugin) + { memset( &m_aNPStream, 0, sizeof( m_aNPStream ) ); m_aNPStream.url = strdup( url ); @@ -941,14 +943,19 @@ PluginStream::PluginStream( XPlugin_Impl* pPlugin, PluginStream::~PluginStream() { - Guard< Mutex > aGuard( m_pPlugin->getMutex() ); - - if( m_pPlugin && m_pPlugin->getPluginComm() ) + uno::Reference<uno::XInterface> const xPlugin(m_wPlugin); + XPlugin_Impl *const pPlugin(m_pPlugin); + if (xPlugin.is() && pPlugin) { - m_pPlugin->getPluginComm()->NPP_DestroyStream( &m_pPlugin->getNPPInstance(), - &m_aNPStream, NPRES_DONE ); - m_pPlugin->checkListeners( m_aNPStream.url ); - m_pPlugin->getPluginComm()->NPP_SetWindow( m_pPlugin ); + Guard< Mutex > aGuard( pPlugin->getMutex() ); + + if( m_pPlugin && m_pPlugin->getPluginComm() ) + { + m_pPlugin->getPluginComm()->NPP_DestroyStream( &m_pPlugin->getNPPInstance(), + &m_aNPStream, NPRES_DONE ); + m_pPlugin->checkListeners( m_aNPStream.url ); + m_pPlugin->getPluginComm()->NPP_SetWindow( m_pPlugin ); + } } ::free( (void*)m_aNPStream.url ); } @@ -962,6 +969,7 @@ PluginInputStream::PluginInputStream( XPlugin_Impl* pPlugin, m_nMode( NP_NORMAL ), m_nWritePos( 0 ) { + assert(m_pPlugin); Guard< Mutex > aGuard( m_pPlugin->getMutex() ); m_pPlugin->getInputStreams().push_back( this ); @@ -991,30 +999,38 @@ PluginInputStream::PluginInputStream( XPlugin_Impl* pPlugin, PluginInputStream::~PluginInputStream() { - Guard< Mutex > aGuard( m_pPlugin->getMutex() ); - - m_pPlugin->getInputStreams().remove( this ); - OUString aFile( m_aFileStream.GetFileName() ); m_aFileStream.Close(); - if( m_pPlugin ) + + uno::Reference<uno::XInterface> const xPlugin(m_wPlugin); + XPlugin_Impl *const pPlugin(m_pPlugin); + if (xPlugin.is() && pPlugin) { - OString aFileName(OUStringToOString(aFile, m_pPlugin->getTextEncoding())); - if( m_pPlugin->getPluginComm() && m_nMode != -1 ) - // mode -1 means either an error occurred, - // or the plugin is already disposing + Guard< Mutex > aGuard( pPlugin->getMutex() ); + + pPlugin->getInputStreams().remove( this ); + + if( m_pPlugin ) { - m_pPlugin->getPluginComm()->addFileToDelete( aFile ); - if( m_nMode == NP_ASFILE ) + OString aFileName(OUStringToOString(aFile, m_pPlugin->getTextEncoding())); + if( m_pPlugin->getPluginComm() && m_nMode != -1 ) + // mode -1 means either an error occurred, + // or the plugin is already disposing { - m_pPlugin->getPluginComm()-> - NPP_StreamAsFile( &m_pPlugin->getNPPInstance(), - &m_aNPStream, - aFileName.getStr() ); + m_pPlugin->getPluginComm()->addFileToDelete( aFile ); + if( m_nMode == NP_ASFILE ) + { + m_pPlugin->getPluginComm()-> + NPP_StreamAsFile( &m_pPlugin->getNPPInstance(), + &m_aNPStream, + aFileName.getStr() ); + } + m_pPlugin->getPluginComm()->NPP_SetWindow( m_pPlugin ); + m_pPlugin->getInputStreams().remove( this ); } - m_pPlugin->getPluginComm()->NPP_SetWindow( m_pPlugin ); - m_pPlugin->getInputStreams().remove( this ); + else + osl::File::remove( aFile ); } else osl::File::remove( aFile ); @@ -1058,21 +1074,28 @@ void PluginInputStream::load() void PluginInputStream::setMode( sal_Int32 nMode ) { + assert(m_pPlugin); // this is currently only called from two places... Guard< Mutex > aGuard( m_pPlugin->getMutex() ); m_nMode = nMode; // invalidation by plugin - if( m_nMode == -1 && m_pPlugin ) + if (m_nMode == -1) { m_pPlugin->getInputStreams().remove( this ); m_pPlugin = NULL; + m_wPlugin.clear(); } } void PluginInputStream::writeBytes( const Sequence<sal_Int8>& Buffer ) throw(std::exception) { - Guard< Mutex > aGuard( m_pPlugin->getMutex() ); + uno::Reference<uno::XInterface> const xPlugin(m_wPlugin); + XPlugin_Impl *const pPlugin(m_pPlugin); + if (!xPlugin.is() || !pPlugin) + return; + + Guard< Mutex > aGuard( pPlugin->getMutex() ); m_aFileStream.Seek( STREAM_SEEK_TO_END ); m_aFileStream.Write( Buffer.getConstArray(), Buffer.getLength() ); @@ -1120,7 +1143,12 @@ void PluginInputStream::writeBytes( const Sequence<sal_Int8>& Buffer ) throw(std void PluginInputStream::closeOutput() throw(std::exception) { - Guard< Mutex > aGuard( m_pPlugin->getMutex() ); + uno::Reference<uno::XInterface> const xPlugin(m_wPlugin); + XPlugin_Impl *const pPlugin(m_pPlugin); + if (!xPlugin.is() || !pPlugin) + return; + + Guard< Mutex > aGuard( pPlugin->getMutex() ); flush(); m_xSource = uno::Reference< com::sun::star::io::XActiveDataSource >(); @@ -1128,7 +1156,12 @@ void PluginInputStream::closeOutput() throw(std::exception) sal_uInt32 PluginInputStream::read( sal_uInt32 offset, sal_Int8* buffer, sal_uInt32 size ) { - Guard< Mutex > aGuard( m_pPlugin->getMutex() ); + uno::Reference<uno::XInterface> const xPlugin(m_wPlugin); + XPlugin_Impl *const pPlugin(m_pPlugin); + if (!xPlugin.is() || !pPlugin) + return 0; + + Guard< Mutex > aGuard( pPlugin->getMutex() ); if( m_nMode != NP_SEEK ) return 0; diff --git a/extensions/source/plugin/inc/plugin/impl.hxx b/extensions/source/plugin/inc/plugin/impl.hxx index 6f1cc35..7ec12f7 100644 --- a/extensions/source/plugin/inc/plugin/impl.hxx +++ b/extensions/source/plugin/inc/plugin/impl.hxx @@ -331,6 +331,7 @@ enum PluginStreamType { InputStream, OutputStream }; class PluginStream { protected: + css::uno::WeakReference<css::uno::XInterface> m_wPlugin; XPlugin_Impl* m_pPlugin; NPStream m_aNPStream; public: commit 077723111292ea615437f3bc2f1e47cf77d7ad42 Author: Michael Stahl <mst...@redhat.com> Date: Fri Mar 13 14:16:51 2015 +0100 V803 decreased performance postfix increment These are pretty silly anyway, but apparently it complains even about integer variables which make this rather a waste of time. Change-Id: I15e847d33d5decd2adcab04e4f1567d3997d28a2 diff --git a/chart2/source/view/axes/ScaleAutomatism.cxx b/chart2/source/view/axes/ScaleAutomatism.cxx index 5747d81..f58bde4 100644 --- a/chart2/source/view/axes/ScaleAutomatism.cxx +++ b/chart2/source/view/axes/ScaleAutomatism.cxx @@ -570,7 +570,7 @@ void ScaleAutomatism::calculateExplicitIncrementAndScaleForDateTimeAxis( { case DAY: if( rExplicitScale.ShiftedCategoryPosition ) - aMaxDate++;//for explicit scales we need one interval more (maximum excluded) + ++aMaxDate; //for explicit scales we need one interval more (maximum excluded) break; case MONTH: aMinDate.SetDay(1); diff --git a/chart2/source/view/main/ChartView.cxx b/chart2/source/view/main/ChartView.cxx index 7ae6465..ad10fb5 100644 --- a/chart2/source/view/main/ChartView.cxx +++ b/chart2/source/view/main/ChartView.cxx @@ -1888,7 +1888,8 @@ bool ChartView::getExplicitValuesForAxis( switch( rExplicitScale.TimeResolution ) { case ::com::sun::star::chart::TimeUnit::DAY: - aMaxDate--;break; + --aMaxDate; + break; case ::com::sun::star::chart::TimeUnit::MONTH: aMaxDate = DateHelper::GetDateSomeMonthsAway(aMaxDate,-1); break; diff --git a/dbaccess/source/core/api/RowSetCache.cxx b/dbaccess/source/core/api/RowSetCache.cxx index ba588c9..4a10be4 100644 --- a/dbaccess/source/core/api/RowSetCache.cxx +++ b/dbaccess/source/core/api/RowSetCache.cxx @@ -1680,7 +1680,7 @@ bool ORowSetCache::reFillMatrix(sal_Int32 _nNewStartPos, sal_Int32 _nNewEndPos) bool ORowSetCache::fill(ORowSetMatrix::iterator& _aIter, const ORowSetMatrix::const_iterator& _aEnd, sal_Int32& _nPos, bool _bCheck) { const sal_Int32 nColumnCount = m_xMetaData->getColumnCount(); - for(; _bCheck && _aIter != _aEnd; _aIter++, _nPos++) + for (; _bCheck && _aIter != _aEnd; ++_aIter, ++_nPos) { if ( !_aIter->is() ) *_aIter = new ORowSetValueVector(nColumnCount); diff --git a/include/basegfx/range/b2dconnectedranges.hxx b/include/basegfx/range/b2dconnectedranges.hxx index 66a8a94..6473b2d 100644 --- a/include/basegfx/range/b2dconnectedranges.hxx +++ b/include/basegfx/range/b2dconnectedranges.hxx @@ -190,7 +190,7 @@ namespace basegfx } else { - aCurrAggregate++; + ++aCurrAggregate; } } } diff --git a/include/cppuhelper/interfacecontainer.hxx b/include/cppuhelper/interfacecontainer.hxx index d8038ee..ac89d61 100644 --- a/include/cppuhelper/interfacecontainer.hxx +++ b/include/cppuhelper/interfacecontainer.hxx @@ -69,7 +69,7 @@ inline ::com::sun::star::uno::Sequence< key > OMultiTypeInterfaceContainerHelper if( static_cast<OInterfaceContainerHelper*>((*iter).second)->getLength() ) // yes, put the type in the array pArray[i++] = (*iter).first; - iter++; + ++iter; } if( i != nSize ) { // may be empty container, reduce the sequence to the right size diff --git a/package/source/zippackage/ZipPackageFolderEnumeration.cxx b/package/source/zippackage/ZipPackageFolderEnumeration.cxx index 7644cbb..1699ce6 100644 --- a/package/source/zippackage/ZipPackageFolderEnumeration.cxx +++ b/package/source/zippackage/ZipPackageFolderEnumeration.cxx @@ -51,7 +51,7 @@ uno::Any SAL_CALL ZipPackageFolderEnumeration::nextElement( ) if (aIterator == rContents.end() ) throw container::NoSuchElementException(THROW_WHERE ); aAny <<= (*aIterator).second->xTunnel; - aIterator++; + ++aIterator; return aAny; } diff --git a/sc/source/core/data/dociter.cxx b/sc/source/core/data/dociter.cxx index 6ab77bc..46690d7 100644 --- a/sc/source/core/data/dociter.cxx +++ b/sc/source/core/data/dociter.cxx @@ -2029,7 +2029,7 @@ bool ScHorizontalCellIterator::SkipInvalidInRow() { debugiter("skip empty cells at column %d, row %d\n", (int)maColPos->mnCol, (int)nRow); - maColPos++; + ++maColPos; } } @@ -2068,7 +2068,7 @@ void ScHorizontalCellIterator::Advance() assert (mbMore); assert (maColPos != maColPositions.end()); - maColPos++; + ++maColPos; SkipInvalid(); } diff --git a/sd/source/core/shapelist.cxx b/sd/source/core/shapelist.cxx index a265e9c..47ba5e2 100644 --- a/sd/source/core/shapelist.cxx +++ b/sd/source/core/shapelist.cxx @@ -133,7 +133,7 @@ void ShapeList::seekShape( sal_uInt32 nIndex ) { maIter = maShapeList.begin(); while( nIndex-- && (maIter != maShapeList.end()) ) - maIter++; + ++maIter; } bool ShapeList::hasMore() const diff --git a/sd/source/ui/view/ViewShellManager.cxx b/sd/source/ui/view/ViewShellManager.cxx index ad678af..4587c05 100644 --- a/sd/source/ui/view/ViewShellManager.cxx +++ b/sd/source/ui/view/ViewShellManager.cxx @@ -997,7 +997,7 @@ IMPL_LINK(ViewShellManager::Implementation, WindowEventHandler, VclWindowEvent*, { for (ActiveShellList::iterator aI(maActiveViewShells.begin()); aI!=maActiveViewShells.end(); - aI++) + ++aI) { if (pEventWindow == static_cast< ::vcl::Window*>(aI->GetWindow())) { diff --git a/svtools/source/control/calendar.cxx b/svtools/source/control/calendar.cxx index c2dc94a..72f2966 100644 --- a/svtools/source/control/calendar.cxx +++ b/svtools/source/control/calendar.cxx @@ -93,7 +93,7 @@ static void ImplCalendarSelectDateRange( IntDateSet* pTable, while ( aStartDate <= aEndDate ) { pTable->insert( aStartDate.GetDate() ); - aStartDate++; + ++aStartDate; } } else @@ -443,7 +443,7 @@ void Calendar::ImplFormat() aTempDate += nDaysInMonth; } Date aTempDate2 = aTempDate; - aTempDate2--; + --aTempDate2; nDaysInMonth = aTempDate2.GetDaysInMonth(); aTempDate2 -= nDaysInMonth-1; nWeekDay = (sal_uInt16)aTempDate2.GetDayOfWeek(); @@ -1086,7 +1086,7 @@ void Calendar::ImplMouseSelect( const Date& rDate, sal_uInt16 nHitTest, Date aTempDate = rDate; if ( !(nHitTest & CALENDAR_HITTEST_DAY) ) - aTempDate--; + --aTempDate; if ( mbMultiSelection ) { @@ -1231,7 +1231,7 @@ void Calendar::ImplScroll( bool bPrev ) Date aNewFirstMonth = GetFirstMonth(); if ( bPrev ) { - aNewFirstMonth--; + --aNewFirstMonth; aNewFirstMonth -= aNewFirstMonth.GetDaysInMonth()-1; } else @@ -1526,11 +1526,11 @@ void Calendar::KeyInput( const KeyEvent& rKEvt ) break; case KEY_LEFT: - aNewDate--; + --aNewDate; break; case KEY_RIGHT: - aNewDate++; + ++aNewDate; break; case KEY_UP: @@ -1897,7 +1897,7 @@ void Calendar::SetCurDate( const Date& rNewDate ) { Date aFirstDate = GetFirstMonth(); aFirstDate += aFirstDate.GetDaysInMonth(); - aTempDate++; + ++aTempDate; while ( nDateOff > aTempDate.GetDaysInMonth() ) { aFirstDate += aFirstDate.GetDaysInMonth(); @@ -1957,7 +1957,7 @@ Date Calendar::GetLastMonth() const sal_uInt16 nMonthCount = GetMonthCount(); for ( sal_uInt16 i = 0; i < nMonthCount; i++ ) aDate += aDate.GetDaysInMonth(); - aDate--; + --aDate; return aDate; } @@ -2037,7 +2037,7 @@ Rectangle Calendar::GetDateRect( const Date& rDate ) const } else nDayIndex++; - aLastDate++; + ++aLastDate; } } } diff --git a/sw/qa/extras/uiwriter/uiwriter.cxx b/sw/qa/extras/uiwriter/uiwriter.cxx index b285018..d76a27a 100644 --- a/sw/qa/extras/uiwriter/uiwriter.cxx +++ b/sw/qa/extras/uiwriter/uiwriter.cxx @@ -337,7 +337,7 @@ void SwUiWriterTest::testFdo74981() aIdx = SwNodeIndex(pDoc->GetNodes().GetEndOfContent(), -1); pTxtNode = aIdx.GetNode().GetTxtNode(); CPPUNIT_ASSERT(pTxtNode->HasHints()); - aIdx--; + --aIdx; pTxtNode = aIdx.GetNode().GetTxtNode(); CPPUNIT_ASSERT(!pTxtNode->HasHints()); } diff --git a/sw/source/core/access/accmap.cxx b/sw/source/core/access/accmap.cxx index 5b41a9c..398a8a3 100644 --- a/sw/source/core/access/accmap.cxx +++ b/sw/source/core/access/accmap.cxx @@ -1375,7 +1375,7 @@ void SwAccessibleMap::InvalidateShapeInParaSelection() mapTemp.insert( SwAccessibleContextMap_Impl::value_type( pFrm, xAcc ) ); } } - nStartIndex++; + ++nStartIndex; } } } diff --git a/vcl/source/control/field2.cxx b/vcl/source/control/field2.cxx index efd5549..c356a82 100644 --- a/vcl/source/control/field2.cxx +++ b/vcl/source/control/field2.cxx @@ -1239,12 +1239,12 @@ static void ImplDateIncrementDay( Date& rDate, bool bUp ) if ( bUp ) { if ( (rDate.GetDay() != 31) || (rDate.GetMonth() != 12) || (rDate.GetYear() != 9999) ) - rDate++; + ++rDate; } else { if ( (rDate.GetDay() != 1 ) || (rDate.GetMonth() != 1) || (rDate.GetYear() != 0) ) - rDate--; + --rDate; } } diff --git a/xmloff/source/core/unointerfacetouniqueidentifiermapper.cxx b/xmloff/source/core/unointerfacetouniqueidentifiermapper.cxx index be14e0e..0e2a2cb 100644 --- a/xmloff/source/core/unointerfacetouniqueidentifiermapper.cxx +++ b/xmloff/source/core/unointerfacetouniqueidentifiermapper.cxx @@ -127,7 +127,7 @@ bool UnoInterfaceToUniqueIdentifierMapper::findReference( const Reference< XInte if( (*rIter).second.get() == xRef.get() ) return true; - rIter++; + ++rIter; } return false; _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits