sc/inc/dptabres.hxx              |    4 +-
 sc/source/core/data/dptabres.cxx |   56 ++++++++++++++-------------------------
 2 files changed, 23 insertions(+), 37 deletions(-)

New commits:
commit d385c6379ae7805abec28e30dec6c10fcb1a6006
Author: Kohei Yoshida <kohei.yosh...@gmail.com>
Date:   Thu Jan 3 15:38:14 2013 -0500

    fdo#58004: Fix out-of-bound access to std::vector.
    
    Two things were wrong with the old code:
    
    1) it didn't check for out-of-bound access, and
    2) used SC_DP_MAX_FIELDS as the upper bound of dimension members, when
       in fact SC_DP_MAX_FIELDS was the upper bound of dimensions themselves,.
       not their members.  We shouldn't impose such upper bounds actually,
       at least not in the core implementation.  We should do that in the
       UI code if we really have to.
    
    Change-Id: I307d4f34d2b0be84f0fd2b93a6270ffce2448bdf

diff --git a/sc/inc/dptabres.hxx b/sc/inc/dptabres.hxx
index b49ee2c..81c3c01 100644
--- a/sc/inc/dptabres.hxx
+++ b/sc/inc/dptabres.hxx
@@ -294,7 +294,7 @@ private:
     bool                    bDataAtRow:1;
 
     //! add "displayed values" settings
-    mutable std::vector< ResultMembers* > mpDimMembers;
+    mutable std::vector<ResultMembers*> maDimMembers;
 public:
                         ScDPResultData( ScDPSource* pSrc );     //! Ref
                         ~ScDPResultData();
diff --git a/sc/source/core/data/dptabres.cxx b/sc/source/core/data/dptabres.cxx
index 5522587..01c256d 100644
--- a/sc/source/core/data/dptabres.cxx
+++ b/sc/source/core/data/dptabres.cxx
@@ -72,17 +72,7 @@ static sal_uInt16 nFuncStrIds[12] =     // passend zum enum 
ScSubTotalFunc
     STR_FUN_TEXT_VAR                // SUBTOTAL_FUNC_VARP
 };
 namespace {
-    template < typename T >
-    void lcl_ResizePointVector( T & vec, size_t nSize )
-    {
 
-        for ( size_t i = 0 ; i < vec.size(); i++ )
-        {
-            if ( vec[i] )
-                delete vec[i];
-        }
-        vec.resize( nSize, NULL );
-    }
     sal_Bool lcl_SearchMember( const std::vector <ScDPResultMember *>& list, 
SCROW nOrder, SCROW& rIndex)
     {
         rIndex = list.size();
@@ -740,8 +730,6 @@ ScDPResultData::ScDPResultData( ScDPSource* pSrc ) :        
//! Ref
     bDataAtCol( false ),
     bDataAtRow( false )
 {
-
-    lcl_ResizePointVector( mpDimMembers , SC_DP_MAX_FIELDS );
 }
 
 ScDPResultData::~ScDPResultData()
@@ -750,7 +738,7 @@ ScDPResultData::~ScDPResultData()
     delete[] pMeasRefs;
     delete[] pMeasRefOrient;
 
-      lcl_ResizePointVector( mpDimMembers , 0 );
+    std::for_each(maDimMembers.begin(), maDimMembers.end(), 
ScDeleteObjectByPtr<ResultMembers>());
 }
 
 void ScDPResultData::SetMeasureData( long nCount, const ScSubTotalFunc* 
pFunctions,
@@ -924,8 +912,10 @@ const ScDPSource* ScDPResultData::GetSource() const
 
 ResultMembers* ScDPResultData::GetDimResultMembers(long nDim, ScDPDimension* 
pDim, ScDPLevel* pLevel) const
 {
-    if (mpDimMembers[nDim])
-        return mpDimMembers[nDim];
+    if (nDim < static_cast<long>(maDimMembers.size()) && maDimMembers[nDim])
+        return maDimMembers[nDim];
+
+    maDimMembers.resize(nDim+1, NULL);
 
     ResultMembers* pResultMembers = new ResultMembers();
     // global order is used to initialize aMembers, so it doesn't have to be 
looked at later
@@ -944,8 +934,8 @@ ResultMembers* ScDPResultData::GetDimResultMembers(long 
nDim, ScDPDimension* pDi
         }
     }
 
-    mpDimMembers[nDim] = pResultMembers;
-    return mpDimMembers[nDim];
+    maDimMembers[nDim] = pResultMembers;
+    return maDimMembers[nDim];
 }
 
 // -----------------------------------------------------------------------
commit e49ce23c354bc3b57c2bc94ff07ba612824c35ad
Author: Kohei Yoshida <kohei.yosh...@gmail.com>
Date:   Thu Jan 3 15:17:45 2013 -0500

    Let's first fix this horrible formatting.
    
    Change-Id: I562ad42818fa7a6bfc765b7484a28ff1800b2949

diff --git a/sc/inc/dptabres.hxx b/sc/inc/dptabres.hxx
index 77fbd64..b49ee2c 100644
--- a/sc/inc/dptabres.hxx
+++ b/sc/inc/dptabres.hxx
@@ -330,7 +330,7 @@ public:
     bool                HasCommonElement( SCROW nFirstDataId, long nFirstIndex,
                                           const ScDPItemData& rSecondData, 
long nSecondIndex ) const;
 
-    ResultMembers* GetDimResultMembers( long nDim , ScDPDimension* pDim , 
ScDPLevel*   pLevel) const ;
+    ResultMembers* GetDimResultMembers(long nDim, ScDPDimension* pDim, 
ScDPLevel* pLevel) const;
 
     const ScDPSource*   GetSource() const;
 };
diff --git a/sc/source/core/data/dptabres.cxx b/sc/source/core/data/dptabres.cxx
index 4dc58b4..5522587 100644
--- a/sc/source/core/data/dptabres.cxx
+++ b/sc/source/core/data/dptabres.cxx
@@ -922,34 +922,30 @@ const ScDPSource* ScDPResultData::GetSource() const
     return pSource;
 }
 
-ResultMembers* ScDPResultData::GetDimResultMembers( long nDim ,  
ScDPDimension* pDim, ScDPLevel*   pLevel) const
+ResultMembers* ScDPResultData::GetDimResultMembers(long nDim, ScDPDimension* 
pDim, ScDPLevel* pLevel) const
 {
-      if ( mpDimMembers[ nDim ] == NULL )
-        {
-
-                //long nDimSource = pDim->GetDimension();
+    if (mpDimMembers[nDim])
+        return mpDimMembers[nDim];
 
-                ResultMembers* pResultMembers = new ResultMembers();
-                // global order is used to initialize aMembers, so it doesn't 
have to be looked at later
-                const ScMemberSortOrder& rGlobalOrder = 
pLevel->GetGlobalOrder();
-
-                ScDPMembers* pMembers = pLevel->GetMembersObject();
-                long nMembCount = pMembers->getCount();
-                for ( long i=0; i<nMembCount; i++ )
-                {
-                    long nSorted = rGlobalOrder.empty() ? i : rGlobalOrder[i];
-                    ScDPMember* pMember = pMembers->getByIndex(nSorted);
-                    if ( NULL == pResultMembers->FindMember( 
pMember->GetItemDataId() ) )
-                    {
-                            ScDPParentDimData* pNew = new ScDPParentDimData( 
i, pDim, pLevel, pMember );
-                                    pResultMembers->InsertMember(  pNew );
-                    }
-                }
+    ResultMembers* pResultMembers = new ResultMembers();
+    // global order is used to initialize aMembers, so it doesn't have to be 
looked at later
+    const ScMemberSortOrder& rGlobalOrder = pLevel->GetGlobalOrder();
 
-                mpDimMembers[ nDim ] = pResultMembers;
+    ScDPMembers* pMembers = pLevel->GetMembersObject();
+    long nMembCount = pMembers->getCount();
+    for (long i = 0; i < nMembCount; ++i)
+    {
+        long nSorted = rGlobalOrder.empty() ? i : rGlobalOrder[i];
+        ScDPMember* pMember = pMembers->getByIndex(nSorted);
+        if (!pResultMembers->FindMember(pMember->GetItemDataId()))
+        {
+            ScDPParentDimData* pNew = new ScDPParentDimData(i, pDim, pLevel, 
pMember);
+            pResultMembers->InsertMember(pNew);
         }
-        return   mpDimMembers[ nDim ];
+    }
 
+    mpDimMembers[nDim] = pResultMembers;
+    return mpDimMembers[nDim];
 }
 
 // -----------------------------------------------------------------------
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to