diff options
author | Luboš Luňák <l.lunak@collabora.com> | 2022-02-07 18:06:12 +0100 |
---|---|---|
committer | Luboš Luňák <l.lunak@collabora.com> | 2022-02-08 12:26:18 +0100 |
commit | fd4384c59eefc8f34d5fe90929d7cb44ee15b27f (patch) | |
tree | 8543618389781675cafc6fabf88165d6e99b80ab /sc | |
parent | abc32f115ffd8df20ed122f6a769027b68da13f2 (diff) |
avoid overflows in ScFlatUInt16RowSegments
Loading a document with >1024 columns caused overflow warnings.
Change-Id: I723185eadf0ed1e806c9fd693ed35dc47d8c2135
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/129632
Tested-by: Jenkins
Reviewed-by: Luboš Luňák <l.lunak@collabora.com>
Diffstat (limited to 'sc')
-rw-r--r-- | sc/inc/segmenttree.hxx | 2 | ||||
-rw-r--r-- | sc/source/core/data/segmenttree.cxx | 30 |
2 files changed, 16 insertions, 16 deletions
diff --git a/sc/inc/segmenttree.hxx b/sc/inc/segmenttree.hxx index 8dbebaf749d1..c980f9db56a0 100644 --- a/sc/inc/segmenttree.hxx +++ b/sc/inc/segmenttree.hxx @@ -149,7 +149,7 @@ public: void setValueIf(SCROW nRow1, SCROW nRow2, sal_uInt16 nValue, const std::function<bool(sal_uInt16)>& rPredicate); sal_uInt16 getValue(SCROW nRow); - sal_uInt32 getSumValue(SCROW nRow1, SCROW nRow2); + sal_uInt64 getSumValue(SCROW nRow1, SCROW nRow2); bool getRangeData(SCROW nRow, RangeData& rData); void removeSegment(SCROW nRow1, SCROW nRow2); void insertSegment(SCROW nRow, SCROW nSize); diff --git a/sc/source/core/data/segmenttree.cxx b/sc/source/core/data/segmenttree.cxx index f57578149e0f..a71e310ab641 100644 --- a/sc/source/core/data/segmenttree.cxx +++ b/sc/source/core/data/segmenttree.cxx @@ -162,17 +162,17 @@ ScFlatSegmentsImpl<ValueType_, ExtValueType_>::getSumValue(SCCOLROW nPos1, SCCOL return 0; aData.mnPos2 = aData.mnPos2-1; // end point is not inclusive. - sal_uInt32 nValue = 0; + sal_uInt64 nValue = 0; SCROW nCurPos = nPos1; SCROW nEndPos = aData.mnPos2; while (nEndPos <= nPos2) { - sal_uInt32 nRes; - if (o3tl::checked_multiply<sal_uInt32>(aData.mnValue, nEndPos - nCurPos + 1, nRes)) + sal_uInt64 nRes; + if (o3tl::checked_multiply<sal_uInt64>(aData.mnValue, nEndPos - nCurPos + 1, nRes)) { SAL_WARN("sc.core", "row height overflow"); - nRes = SAL_MAX_INT32; + nRes = SAL_MAX_INT64; } nValue = o3tl::saturating_add(nValue, nRes); nCurPos = nEndPos + 1; @@ -186,11 +186,11 @@ ScFlatSegmentsImpl<ValueType_, ExtValueType_>::getSumValue(SCCOLROW nPos1, SCCOL if (nCurPos <= nPos2) { nEndPos = ::std::min(nEndPos, nPos2); - sal_uInt32 nRes; - if (o3tl::checked_multiply<sal_uInt32>(aData.mnValue, nEndPos - nCurPos + 1, nRes)) + sal_uInt64 nRes; + if (o3tl::checked_multiply<sal_uInt64>(aData.mnValue, nEndPos - nCurPos + 1, nRes)) { SAL_WARN("sc.core", "row height overflow"); - nRes = SAL_MAX_INT32; + nRes = SAL_MAX_INT64; } nValue = o3tl::saturating_add(nValue, nRes); } @@ -202,17 +202,17 @@ ScFlatSegmentsImpl<ValueType_, ExtValueType_>::getSumValue(SCCOLROW nPos1, SCCOL if (!getRangeDataLeaf(nPos1, aData)) return 0; - sal_uInt32 nValue = 0; + sal_uInt64 nValue = 0; SCROW nCurPos = nPos1; SCROW nEndPos = aData.mnPos2; while (nEndPos <= nPos2) { - sal_uInt32 nRes; - if (o3tl::checked_multiply<sal_uInt32>(aData.mnValue, nEndPos - nCurPos + 1, nRes)) + sal_uInt64 nRes; + if (o3tl::checked_multiply<sal_uInt64>(aData.mnValue, nEndPos - nCurPos + 1, nRes)) { SAL_WARN("sc.core", "row height overflow"); - nRes = SAL_MAX_INT32; + nRes = SAL_MAX_INT64; } nValue = o3tl::saturating_add(nValue, nRes); nCurPos = nEndPos + 1; @@ -224,11 +224,11 @@ ScFlatSegmentsImpl<ValueType_, ExtValueType_>::getSumValue(SCCOLROW nPos1, SCCOL if (nCurPos <= nPos2) { nEndPos = ::std::min(nEndPos, nPos2); - sal_uInt32 nRes; - if (o3tl::checked_multiply<sal_uInt32>(aData.mnValue, nEndPos - nCurPos + 1, nRes)) + sal_uInt64 nRes; + if (o3tl::checked_multiply<sal_uInt64>(aData.mnValue, nEndPos - nCurPos + 1, nRes)) { SAL_WARN("sc.core", "row height overflow"); - nRes = SAL_MAX_INT32; + nRes = SAL_MAX_INT64; } nValue = o3tl::saturating_add(nValue, nRes); } @@ -645,7 +645,7 @@ sal_uInt16 ScFlatUInt16RowSegments::getValue(SCROW nRow) return mpImpl->getValue(static_cast<SCCOLROW>(nRow)); } -sal_uInt32 ScFlatUInt16RowSegments::getSumValue(SCROW nRow1, SCROW nRow2) +sal_uInt64 ScFlatUInt16RowSegments::getSumValue(SCROW nRow1, SCROW nRow2) { return mpImpl->getSumValue(static_cast<SCCOLROW>(nRow1), static_cast<SCCOLROW>(nRow2)); } |