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

Caolán McNamara caolanm at redhat.com
Wed Nov 22 09:51:42 UTC 2017


 sc/source/core/data/segmenttree.cxx |   19 +++++++++++++++----
 1 file changed, 15 insertions(+), 4 deletions(-)

New commits:
commit 9ffa900cb4d0381587162e3deb9d910965b69d58
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Tue Nov 21 17:20:11 2017 +0000

    ofz#4361 Integer-overflow
    
    Change-Id: I7b41a53622e2e87dc0998a4a181bb8e49ef8d277
    Reviewed-on: https://gerrit.libreoffice.org/45046
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>
    Tested-by: Caolán McNamara <caolanm at redhat.com>

diff --git a/sc/source/core/data/segmenttree.cxx b/sc/source/core/data/segmenttree.cxx
index ed9937ba7424..c7fbcb547835 100644
--- a/sc/source/core/data/segmenttree.cxx
+++ b/sc/source/core/data/segmenttree.cxx
@@ -18,9 +18,8 @@
  */
 
 #include <segmenttree.hxx>
-
+#include <o3tl/safeint.hxx>
 #include <mdds/flat_segment_tree.hpp>
-
 #include <algorithm>
 #include <limits>
 
@@ -144,7 +143,13 @@ ScFlatSegmentsImpl<ValueType_, ExtValueType_>::getSumValue(SCCOLROW nPos1, SCCOL
     SCROW nEndPos = aData.mnPos2;
     while (nEndPos <= nPos2)
     {
-        nValue += aData.mnValue * (nEndPos - nCurPos + 1);
+        sal_uInt32 nRes;
+        if (o3tl::checked_multiply<sal_uInt32>(aData.mnValue, nEndPos - nCurPos + 1, nRes))
+        {
+            SAL_WARN("sc.core", "row height overflow");
+            nRes = SAL_MAX_INT32;
+        }
+        nValue = o3tl::saturating_add(nValue, nRes);
         nCurPos = nEndPos + 1;
         if (!getRangeData(nCurPos, aData))
             break;
@@ -154,7 +159,13 @@ ScFlatSegmentsImpl<ValueType_, ExtValueType_>::getSumValue(SCCOLROW nPos1, SCCOL
     if (nCurPos <= nPos2)
     {
         nEndPos = ::std::min(nEndPos, nPos2);
-        nValue += aData.mnValue * (nEndPos - nCurPos + 1);
+        sal_uInt32 nRes;
+        if (o3tl::checked_multiply<sal_uInt32>(aData.mnValue, nEndPos - nCurPos + 1, nRes))
+        {
+            SAL_WARN("sc.core", "row height overflow");
+            nRes = SAL_MAX_INT32;
+        }
+        nValue = o3tl::saturating_add(nValue, nRes);
     }
     return nValue;
 }


More information about the Libreoffice-commits mailing list