oox/source/drawingml/fillproperties.cxx |   12 ++++++++----
 sd/qa/unit/data/pptx/croppedTo0.pptx    |binary
 sd/qa/unit/import-tests2.cxx            |    1 +
 3 files changed, 9 insertions(+), 4 deletions(-)

New commits:
commit 22f7ec23550d4d7015f5b503fb707b2303f2fc7b
Author:     Mike Kaganski <mike.kagan...@collabora.com>
AuthorDate: Mon Jun 27 15:29:25 2022 +0300
Commit:     Xisco Fauli <xiscofa...@libreoffice.org>
CommitDate: Tue Jun 28 00:27:29 2022 +0200

    Integer division could cancel small values of wrong sign
    
    ... as seen at some documents where the values are like -1. There
    the checks in pushToPropMap may pass (the division result would be 0),
    but the original small negative values would fail the asserts that
    were introduced in commit 5772cef244dbee5834efbc693bc714d89ae6301d
      Author Mike Kaganski <mike.kagan...@collabora.com>
      Date   Wed Jun 15 18:33:38 2022 +0300
        tdf#134210: Reimplement cropping from srcRect and fillRect
    
    Change-Id: I114588862b5cfd2b2e4491424430cc139bdbaae9
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/136492
    Tested-by: Jenkins
    Reviewed-by: Caolán McNamara <caol...@redhat.com>
    (cherry picked from commit 2d9f3c066a065d6aa98f1e594dcf8a091fec2bde)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/136471
    Reviewed-by: Xisco Fauli <xiscofa...@libreoffice.org>

diff --git a/oox/source/drawingml/fillproperties.cxx 
b/oox/source/drawingml/fillproperties.cxx
index 2f50d666451c..36f14066a082 100644
--- a/oox/source/drawingml/fillproperties.cxx
+++ b/oox/source/drawingml/fillproperties.cxx
@@ -97,8 +97,10 @@ Quotients getQuotients(geometry::IntegerRectangle2D 
aRelRect, double hDiv, doubl
 // ECMA-376 Part 1 20.1.8.55 srcRect (Source Rectangle)
 std::optional<Quotients> CropQuotientsFromSrcRect(geometry::IntegerRectangle2D 
aSrcRect)
 {
-    // Currently the following precondition is guaranteed in 
GraphicProperties::pushToPropMap
-    assert(aSrcRect.X1 >= 0 && aSrcRect.X2 >= 0 && aSrcRect.Y1 >= 0 && 
aSrcRect.Y2 >= 0);
+    aSrcRect.X1 = std::max(aSrcRect.X1, sal_Int32(0));
+    aSrcRect.X2 = std::max(aSrcRect.X2, sal_Int32(0));
+    aSrcRect.Y1 = std::max(aSrcRect.Y1, sal_Int32(0));
+    aSrcRect.Y2 = std::max(aSrcRect.Y2, sal_Int32(0));
     if (aSrcRect.X1 + aSrcRect.X2 >= 100'000 || aSrcRect.Y1 + aSrcRect.Y2 >= 
100'000)
         return {}; // Cropped everything
     return getQuotients(aSrcRect, 100'000.0, 100'000.0);
@@ -107,8 +109,10 @@ std::optional<Quotients> 
CropQuotientsFromSrcRect(geometry::IntegerRectangle2D a
 // ECMA-376 Part 1 20.1.8.30 fillRect (Fill Rectangle)
 std::optional<Quotients> 
CropQuotientsFromFillRect(geometry::IntegerRectangle2D aFillRect)
 {
-    // Currently the following precondition is guaranteed in 
FillProperties::pushToPropMap
-    assert(aFillRect.X1 <= 0 && aFillRect.X2 <= 0 && aFillRect.Y1 <= 0 && 
aFillRect.Y2 <= 0);
+    aFillRect.X1 = std::min(aFillRect.X1, sal_Int32(0));
+    aFillRect.X2 = std::min(aFillRect.X2, sal_Int32(0));
+    aFillRect.Y1 = std::min(aFillRect.Y1, sal_Int32(0));
+    aFillRect.Y2 = std::min(aFillRect.Y2, sal_Int32(0));
     // Negative divisor and negative relative offset give positive value 
wanted in lclCropGraphic
     return getQuotients(aFillRect, -100'000.0 + aFillRect.X1 + aFillRect.X2,
                         -100'000.0 + aFillRect.Y1 + aFillRect.Y2);
diff --git a/sd/qa/unit/data/pptx/croppedTo0.pptx 
b/sd/qa/unit/data/pptx/croppedTo0.pptx
index fecf53559b1f..081661f48601 100644
Binary files a/sd/qa/unit/data/pptx/croppedTo0.pptx and 
b/sd/qa/unit/data/pptx/croppedTo0.pptx differ
diff --git a/sd/qa/unit/import-tests2.cxx b/sd/qa/unit/import-tests2.cxx
index 62067a94be28..6c7dfe5a5a64 100644
--- a/sd/qa/unit/import-tests2.cxx
+++ b/sd/qa/unit/import-tests2.cxx
@@ -2037,6 +2037,7 @@ void SdImportTest2::testDefaultTabStop()
 void SdImportTest2::testCropToZero()
 {
     // Must not crash because of division by zero
+    // Also must not fail assertions because of passing negative value to 
CropQuotientsFromSrcRect
     
loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/croppedTo0.pptx"), 
PPTX);
 }
 

Reply via email to