f325b2
From f24a98badcc637ed32ce2f31e623f651c69057e3 Mon Sep 17 00:00:00 2001
f325b2
From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= <caolanm@redhat.com>
f325b2
Date: Mon, 2 Jan 2017 11:53:31 +0000
f325b2
Subject: [PATCH] ofz#372 check if ImplSplit succeeded
f325b2
f325b2
Change-Id: I1e34295fe3ee5f77e787f583616d52fa92a0eca4
f325b2
---
f325b2
 tools/inc/poly.h              |  2 +-
f325b2
 tools/source/generic/poly.cxx | 23 +++++++++++++++--------
f325b2
 2 files changed, 16 insertions(+), 9 deletions(-)
f325b2
f325b2
diff --git a/tools/inc/poly.h b/tools/inc/poly.h
f325b2
index d677bcd8b0ac..c614401f122c 100644
f325b2
--- a/tools/inc/poly.h
f325b2
+++ b/tools/inc/poly.h
f325b2
@@ -42,7 +42,7 @@ public:
f325b2
 
f325b2
     void            ImplSetSize( sal_uInt16 nSize, bool bResize = true );
f325b2
     void            ImplCreateFlagArray();
f325b2
-    void            ImplSplit( sal_uInt16 nPos, sal_uInt16 nSpace, ImplPolygon* pInitPoly = NULL );
f325b2
+    bool            ImplSplit( sal_uInt16 nPos, sal_uInt16 nSpace, ImplPolygon* pInitPoly = NULL );
f325b2
 };
f325b2
 
f325b2
 #define MAX_POLYGONS        ((sal_uInt16)0x3FF0)
f325b2
diff --git a/tools/source/generic/poly.cxx b/tools/source/generic/poly.cxx
f325b2
index 457a05b4d112..2c89775e79d0 100644
f325b2
--- a/tools/source/generic/poly.cxx
f325b2
+++ b/tools/source/generic/poly.cxx
f325b2
@@ -208,13 +208,16 @@ void ImplPolygon::ImplSetSize( sal_uInt16 nNewSize, bool bResize )
f325b2
     mnPoints   = nNewSize;
f325b2
 }
f325b2
 
f325b2
-void ImplPolygon::ImplSplit( sal_uInt16 nPos, sal_uInt16 nSpace, ImplPolygon* pInitPoly )
f325b2
+bool ImplPolygon::ImplSplit( sal_uInt16 nPos, sal_uInt16 nSpace, ImplPolygon* pInitPoly )
f325b2
 {
f325b2
     const sal_uIntPtr   nSpaceSize = nSpace * sizeof( Point );
f325b2
 
f325b2
     //Can't fit this in :-(, throw ?
f325b2
     if (mnPoints + nSpace > USHRT_MAX)
f325b2
-        return;
f325b2
+    {
f325b2
+        SAL_WARN("tools", "Polygon needs " << mnPoints + nSpace << " points, but only " << USHRT_MAX << " possible");
f325b2
+        return false;
f325b2
+    }
f325b2
 
f325b2
     const sal_uInt16    nNewSize = mnPoints + nSpace;
f325b2
 
f325b2
@@ -269,6 +272,8 @@ void ImplPolygon::ImplSplit( sal_uInt16 nPos, sal_uInt16 nSpace, ImplPolygon* pI
f325b2
         mpPointAry = pNewAry;
f325b2
         mnPoints   = nNewSize;
f325b2
     }
f325b2
+
f325b2
+    return true;
f325b2
 }
f325b2
 
f325b2
 void ImplPolygon::ImplCreateFlagArray()
f325b2
@@ -1444,13 +1449,15 @@ void Polygon::Insert( sal_uInt16 nPos, const Point& rPt, PolyFlags eFlags )
f325b2
     if( nPos >= mpImplPolygon->mnPoints )
f325b2
         nPos = mpImplPolygon->mnPoints;
f325b2
 
f325b2
-    mpImplPolygon->ImplSplit( nPos, 1 );
f325b2
-    mpImplPolygon->mpPointAry[ nPos ] = rPt;
f325b2
-
f325b2
-    if( POLY_NORMAL != eFlags )
f325b2
+    if (mpImplPolygon->ImplSplit(nPos, 1))
f325b2
     {
f325b2
-        mpImplPolygon->ImplCreateFlagArray();
f325b2
-        mpImplPolygon->mpFlagAry[ nPos ] = (sal_uInt8) eFlags;
f325b2
+        mpImplPolygon->mpPointAry[ nPos ] = rPt;
f325b2
+
f325b2
+        if( POLY_NORMAL != eFlags )
f325b2
+        {
f325b2
+            mpImplPolygon->ImplCreateFlagArray();
f325b2
+            mpImplPolygon->mpFlagAry[ nPos ] = (sal_uInt8) eFlags;
f325b2
+        }
f325b2
     }
f325b2
 }
f325b2
 
f325b2
-- 
f325b2
2.12.2
f325b2