]> git.saurik.com Git - wxWidgets.git/commitdiff
Avoid double free in wxComboBox::SetClientObject.
authorMattia Barbon <mbarbon@cpan.org>
Sun, 23 Nov 2003 08:17:57 +0000 (08:17 +0000)
committerMattia Barbon <mbarbon@cpan.org>
Sun, 23 Nov 2003 08:17:57 +0000 (08:17 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@24640 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/mac/choice.h
include/wx/mac/combobox.h
src/mac/carbon/combobox.cpp
src/mac/combobox.cpp

index ea9756f1a4c7fe77aa422c5d5677d01f9f9b9914..26ac3359c0766f78447bcd7b9bc4b7c3fbc77eb8 100644 (file)
@@ -72,11 +72,14 @@ public:
 
 protected:
     virtual wxSize DoGetBestSize() const ;
+
+public: // for wxComboBox only
     virtual void DoSetItemClientData( int n, void* clientData );
     virtual void* DoGetItemClientData( int n ) const;
     virtual void DoSetItemClientObject( int n, wxClientData* clientData );
     virtual wxClientData* DoGetItemClientObject( int n ) const;
 
+protected:
     // free all memory we have (used by Clear() and dtor)
     // prevent collision with some BSD definitions of macro Free()   
     void FreeData();
index e07db8a96251f2a463f3fe3078e7dec07660db5b..d2528db2375ee17a4bc7a074b947f420001ab6c4 100644 (file)
@@ -106,6 +106,8 @@ protected:
     virtual void DoSetItemClientObject(int n, wxClientData* clientData) ;
     virtual wxClientData* DoGetItemClientObject(int n) const ;
 
+    void FreeData();
+
     // the subcontrols
     wxTextCtrl*     m_text;
     wxChoice*       m_choice;
index 830e8564a77c5e1a1895c39b4366c3b6f0c278b4..c3c5660bbf5163b8502539f6e28406182488d670 100644 (file)
@@ -414,31 +414,47 @@ int wxComboBox::DoInsert(const wxString& item, int pos)
 
 void wxComboBox::DoSetItemClientData(int n, void* clientData) 
 {
-    return m_choice->SetClientData( n , clientData ) ;
+    return m_choice->DoSetItemClientData( n , clientData ) ;
 }
 
 void* wxComboBox::DoGetItemClientData(int n) const
 {
-    return m_choice->GetClientData( n ) ;
+    return m_choice->DoGetItemClientData( n ) ;
 }
 
 void wxComboBox::DoSetItemClientObject(int n, wxClientData* clientData)
 {
-    return m_choice->SetClientObject( n , clientData ) ;
+    return m_choice->DoSetItemClientObject( n , clientData ) ;
 }
 
 wxClientData* wxComboBox::DoGetItemClientObject(int n) const 
 {
-    return m_choice->GetClientObject( n ) ;
+    return m_choice->DoGetItemClientObject( n ) ;
+}
+
+void wxComboBox::FreeData()
+{
+    if ( HasClientObjectData() )
+    {
+        size_t count = GetCount();
+        for ( size_t n = 0; n < count; n++ )
+        {
+            SetClientObject( n, NULL );
+        }
+    }
 }
 
 void wxComboBox::Delete(int n)
 {
+    // force client object deletion
+    if( HasClientObjectData() )
+        SetClientObject( n, NULL );
     m_choice->Delete( n );
 }
 
 void wxComboBox::Clear()
 {
+    FreeData();
     m_choice->Clear();
 }
 
index 830e8564a77c5e1a1895c39b4366c3b6f0c278b4..c3c5660bbf5163b8502539f6e28406182488d670 100644 (file)
@@ -414,31 +414,47 @@ int wxComboBox::DoInsert(const wxString& item, int pos)
 
 void wxComboBox::DoSetItemClientData(int n, void* clientData) 
 {
-    return m_choice->SetClientData( n , clientData ) ;
+    return m_choice->DoSetItemClientData( n , clientData ) ;
 }
 
 void* wxComboBox::DoGetItemClientData(int n) const
 {
-    return m_choice->GetClientData( n ) ;
+    return m_choice->DoGetItemClientData( n ) ;
 }
 
 void wxComboBox::DoSetItemClientObject(int n, wxClientData* clientData)
 {
-    return m_choice->SetClientObject( n , clientData ) ;
+    return m_choice->DoSetItemClientObject( n , clientData ) ;
 }
 
 wxClientData* wxComboBox::DoGetItemClientObject(int n) const 
 {
-    return m_choice->GetClientObject( n ) ;
+    return m_choice->DoGetItemClientObject( n ) ;
+}
+
+void wxComboBox::FreeData()
+{
+    if ( HasClientObjectData() )
+    {
+        size_t count = GetCount();
+        for ( size_t n = 0; n < count; n++ )
+        {
+            SetClientObject( n, NULL );
+        }
+    }
 }
 
 void wxComboBox::Delete(int n)
 {
+    // force client object deletion
+    if( HasClientObjectData() )
+        SetClientObject( n, NULL );
     m_choice->Delete( n );
 }
 
 void wxComboBox::Clear()
 {
+    FreeData();
     m_choice->Clear();
 }