[Libreoffice-commits] core.git: basctl/source

Mike Kaganski (via logerrit) logerrit at kemper.freedesktop.org
Mon Jan 13 18:24:55 UTC 2020


 basctl/source/basicide/baside2b.cxx |   26 ++++++++++++++++----------
 1 file changed, 16 insertions(+), 10 deletions(-)

New commits:
commit 96ab492b74d9e64051d82f220f65cadedf34a878
Author:     Mike Kaganski <mike.kaganski at collabora.com>
AuthorDate: Mon Jan 13 18:48:30 2020 +0300
Commit:     Mike Kaganski <mike.kaganski at collabora.com>
CommitDate: Mon Jan 13 19:24:19 2020 +0100

    tdf#129360: fix old unsigned underflow
    
    ... discovered thanks to 62f3f3d92aa204eaaa063b30d7ade44df501b997:
    properties count may be 0, and unconditionally subtracting 3 from
    that will give a big number. Previously this was masked by a "Very
    Hot Fix" in SbxArray::GetRef that was dropped in the said commit.
    
    This unifies property count correction in the two places that use
    it: in WatchTreeListBox::RequestingChildren, where it was correct,
    and in WatchTreeListBox::UpdateWatches, where underflow happened.
    
    Change-Id: Ie980bc9571b2555cc2f643e770d824d5e2eb3731
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/86700
    Tested-by: Jenkins
    Reviewed-by: Mike Kaganski <mike.kaganski at collabora.com>

diff --git a/basctl/source/basicide/baside2b.cxx b/basctl/source/basicide/baside2b.cxx
index 83fe6a481768..c6c954d36013 100644
--- a/basctl/source/basicide/baside2b.cxx
+++ b/basctl/source/basicide/baside2b.cxx
@@ -2119,6 +2119,19 @@ void WatchTreeListBox::SetTabs()
     }
 }
 
+static sal_uInt32 getCorrectedPropCount(SbxArray* p)
+{
+    sal_uInt32 nPropCount = p->Count32();
+    if (nPropCount >= 3
+        && p->Get32(nPropCount - 1)->GetName().equalsIgnoreAsciiCase("Dbg_Methods")
+        && p->Get32(nPropCount - 2)->GetName().equalsIgnoreAsciiCase("Dbg_Properties")
+        && p->Get32(nPropCount - 3)->GetName().equalsIgnoreAsciiCase("Dbg_SupportedInterfaces"))
+    {
+        nPropCount -= 3;
+    }
+    return nPropCount;
+}
+
 void WatchTreeListBox::RequestingChildren( SvTreeListEntry * pParent )
 {
     if( !StarBASIC::IsRunning() )
@@ -2144,14 +2157,7 @@ void WatchTreeListBox::RequestingChildren( SvTreeListEntry * pParent )
     {
         createAllObjectProperties( pObj );
         SbxArray* pProps = pObj->GetProperties();
-        sal_uInt32 nPropCount = pProps->Count32();
-        if ( nPropCount >= 3 &&
-             pProps->Get32( nPropCount -1 )->GetName().equalsIgnoreAsciiCase( "Dbg_Methods" ) &&
-             pProps->Get32( nPropCount -2 )->GetName().equalsIgnoreAsciiCase( "Dbg_Properties" ) &&
-             pProps->Get32( nPropCount -3 )->GetName().equalsIgnoreAsciiCase( "Dbg_SupportedInterfaces" ) )
-        {
-            nPropCount -= 3;
-        }
+        const sal_uInt32 nPropCount = getCorrectedPropCount(pProps);
         pItem->maMemberList.reserve(nPropCount);
 
         for( sal_uInt32 i = 0 ; i < nPropCount ; ++i )
@@ -2488,8 +2494,8 @@ void WatchTreeListBox::UpdateWatches( bool bBasicStopped )
                         {
                             bool bObjChanged = false; // Check if member list has changed
                             SbxArray* pProps = pObj->GetProperties();
-                            sal_uInt32 nPropCount = pProps->Count32();
-                            for( sal_uInt32 i = 0 ; i < nPropCount - 3 ; i++ )
+                            const sal_uInt32 nPropCount = getCorrectedPropCount(pProps);
+                            for( sal_uInt32 i = 0 ; i < nPropCount ; i++ )
                             {
                                 SbxVariable* pVar_ = pProps->Get32( i );
                                 if( pItem->maMemberList[i] != pVar_->GetName() )


More information about the Libreoffice-commits mailing list