diff options
author | Eike Rathke <erack@redhat.com> | 2014-05-09 00:11:06 +0200 |
---|---|---|
committer | Eike Rathke <erack@redhat.com> | 2014-05-09 01:07:01 +0200 |
commit | e891afeccba8f20f8bdaeacb20f2215cfcb1abfd (patch) | |
tree | 9abe7392f6a9a8f11c2cfb26a34e6d16a08e9389 | |
parent | 37852a02cdb67b6c5665a794deae3efbed6d244a (diff) |
resolve fdo#77509 memory corruption / crash in Consolidate
Regression introduced with c81dec478ab0618f2acd2580654a93d3a7185444
memcpy some sizeof(OUString) is doomed to fail.
Change-Id: I81dc9cc7eaf02607ed05b4d284a7e5e462eeeb0a
-rw-r--r-- | sc/inc/consoli.hxx | 7 | ||||
-rw-r--r-- | sc/source/core/tool/consoli.cxx | 52 |
2 files changed, 22 insertions, 37 deletions
diff --git a/sc/inc/consoli.hxx b/sc/inc/consoli.hxx index ec96a6033c72..8811f5b55b13 100644 --- a/sc/inc/consoli.hxx +++ b/sc/inc/consoli.hxx @@ -80,11 +80,10 @@ private: double** ppCount; double** ppSumSqr; ScReferenceList** ppRefs; - OUString* mpColHeaders; - OUString* mpRowHeaders; + ::std::vector<OUString> maColHeaders; + ::std::vector<OUString> maRowHeaders; + ::std::vector<OUString> maTitles; SCSIZE nDataCount; - SCSIZE nTitleCount; - OUString* mpTitles; SCSIZE** ppTitlePos; bool bCornerUsed; OUString aCornerText; // only for bColByName && bRowByName diff --git a/sc/source/core/tool/consoli.cxx b/sc/source/core/tool/consoli.cxx index 7c897c0a2e4e..5a36fbaf2e4b 100644 --- a/sc/source/core/tool/consoli.cxx +++ b/sc/source/core/tool/consoli.cxx @@ -71,16 +71,9 @@ void ScReferenceList::AddEntry( SCCOL nCol, SCROW nRow, SCTAB nTab ) } template< typename T > -static void lcl_AddString( OUString*& pData, T& nCount, const OUString& rInsert ) +static void lcl_AddString( ::std::vector<OUString>& rData, T& nCount, const OUString& rInsert ) { - OUString* pOldData = pData; - pData = new OUString[ nCount+1 ]; - if (pOldData) - { - memcpy( pData, pOldData, nCount * sizeof(OUString) ); - delete[] pOldData; - } - pData[nCount] = rInsert; + rData.push_back( rInsert); ++nCount; } @@ -96,11 +89,7 @@ ScConsData::ScConsData() : ppCount(NULL), ppSumSqr(NULL), ppRefs(NULL), - mpColHeaders(NULL), - mpRowHeaders(NULL), nDataCount(0), - nTitleCount(0), - mpTitles(NULL), ppTitlePos(NULL), bCornerUsed(false) { @@ -141,16 +130,12 @@ void ScConsData::DeleteData() DELETEARR( ppSumSqr,nColCount ); DELETEARR( ppUsed, nColCount ); // erst nach ppRefs !!! DELETEARR( ppTitlePos, nRowCount ); - delete[] mpColHeaders; - mpColHeaders = NULL; - delete[] mpRowHeaders; - mpRowHeaders = NULL; - delete[] mpTitles; - mpTitles = NULL; - nTitleCount = 0; + ::std::vector<OUString>().swap( maColHeaders); + ::std::vector<OUString>().swap( maRowHeaders); + ::std::vector<OUString>().swap( maTitles); nDataCount = 0; - if (bColByName) nColCount = 0; // sonst stimmt mpColHeaders nicht + if (bColByName) nColCount = 0; // sonst stimmt maColHeaders nicht if (bRowByName) nRowCount = 0; bCornerUsed = false; @@ -254,10 +239,10 @@ void ScConsData::AddFields( ScDocument* pSrcDoc, SCTAB nTab, { bool bFound = false; for (SCSIZE i=0; i<nColCount && !bFound; i++) - if ( mpColHeaders[i] == aTitle ) + if ( maColHeaders[i] == aTitle ) bFound = true; if (!bFound) - lcl_AddString( mpColHeaders, nColCount, aTitle ); + lcl_AddString( maColHeaders, nColCount, aTitle ); } } } @@ -271,10 +256,10 @@ void ScConsData::AddFields( ScDocument* pSrcDoc, SCTAB nTab, { bool bFound = false; for (SCSIZE i=0; i<nRowCount && !bFound; i++) - if ( mpRowHeaders[i] == aTitle ) + if ( maRowHeaders[i] == aTitle ) bFound = true; if (!bFound) - lcl_AddString( mpRowHeaders, nRowCount, aTitle ); + lcl_AddString( maRowHeaders, nRowCount, aTitle ); } } } @@ -287,7 +272,8 @@ void ScConsData::AddName( const OUString& rName ) if (bReference) { - lcl_AddString( mpTitles, nTitleCount, rName ); + maTitles.push_back( rName); + size_t nTitleCount = maTitles.size(); for (nArrY=0; nArrY<nRowCount; nArrY++) { @@ -526,7 +512,7 @@ void ScConsData::AddData( ScDocument* pSrcDoc, SCTAB nTab, { bool bFound = false; for (SCSIZE i=0; i<nColCount && !bFound; i++) - if ( mpColHeaders[i] == aTitle ) + if ( maColHeaders[i] == aTitle ) { nPos = static_cast<SCCOL>(i); bFound = true; @@ -547,7 +533,7 @@ void ScConsData::AddData( ScDocument* pSrcDoc, SCTAB nTab, { bool bFound = false; for (SCSIZE i=0; i<nRowCount && !bFound; i++) - if ( mpRowHeaders[i] == aTitle ) + if ( maRowHeaders[i] == aTitle ) { nPos = static_cast<SCROW>(i); bFound = true; @@ -656,10 +642,10 @@ void ScConsData::OutputToDocument( ScDocument* pDestDoc, SCCOL nCol, SCROW nRow, if (bColByName) for (SCSIZE i=0; i<nColCount; i++) - pDestDoc->SetString( sal::static_int_cast<SCCOL>(nStartCol+i), nRow, nTab, mpColHeaders[i] ); + pDestDoc->SetString( sal::static_int_cast<SCCOL>(nStartCol+i), nRow, nTab, maColHeaders[i] ); if (bRowByName) for (SCSIZE j=0; j<nRowCount; j++) - pDestDoc->SetString( nCol, sal::static_int_cast<SCROW>(nStartRow+j), nTab, mpRowHeaders[j] ); + pDestDoc->SetString( nCol, sal::static_int_cast<SCROW>(nStartRow+j), nTab, maRowHeaders[j] ); nCol = nStartCol; nRow = nStartRow; @@ -769,7 +755,7 @@ void ScConsData::OutputToDocument( ScDocument* pDestDoc, SCCOL nCol, SCROW nRow, // Zwischentitel - if (ppTitlePos && mpTitles && mpRowHeaders) + if (ppTitlePos && !maTitles.empty() && !maRowHeaders.empty()) { OUString aDelim( " / " ); for (SCSIZE nPos=0; nPos<nDataCount; nPos++) @@ -781,9 +767,9 @@ void ScConsData::OutputToDocument( ScDocument* pDestDoc, SCCOL nCol, SCROW nRow, bDo = false; // leer if ( bDo && nTPos < nNeeded ) { - aString = mpRowHeaders[nArrY]; + aString = maRowHeaders[nArrY]; aString += aDelim; - aString += mpTitles[nPos]; + aString += maTitles[nPos]; pDestDoc->SetString( nCol-1, nRow+nArrY+nTPos, nTab, aString ); } } |