]> source.dussan.org Git - poi.git/commitdiff
#65063 - WMF parsing failed on closed empty polygon
authorAndreas Beeker <kiwiwings@apache.org>
Wed, 6 Jan 2021 23:14:45 +0000 (23:14 +0000)
committerAndreas Beeker <kiwiwings@apache.org>
Wed, 6 Jan 2021 23:14:45 +0000 (23:14 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1885215 13f79535-47bb-0310-9956-ffa450edef68

src/scratchpad/src/org/apache/poi/hwmf/record/HwmfDraw.java
src/scratchpad/testcases/org/apache/poi/hwmf/TestHwmfParsing.java
test-data/slideshow/empty-polygon-close.wmf [new file with mode: 0644]

index 12eb580f93ae147fb4899cf4d36b948306b531b8..1c996016420d7fae7b2f298e6915d71d449d7c92 100644 (file)
@@ -143,10 +143,10 @@ public final class HwmfDraw {
         @Override
         public int init(LittleEndianInputStream leis, long recordSize, int recordFunction) throws IOException {
             //A 16-bit signed integer that defines the number of points in the array.
-            int numberofPoints = leis.readShort();
+            int numberOfPoints = leis.readShort();
 
-            poly = new Path2D.Double(Path2D.WIND_EVEN_ODD, numberofPoints);
-            for (int i=0; i<numberofPoints; i++) {
+            poly = new Path2D.Double(Path2D.WIND_EVEN_ODD, numberOfPoints);
+            for (int i=0; i<numberOfPoints; i++) {
                 // A 16-bit signed integer that defines the horizontal (x) coordinate of the point.
                 int x = leis.readShort();
                 // A 16-bit signed integer that defines the vertical (y) coordinate of the point.
@@ -158,12 +158,12 @@ public final class HwmfDraw {
                 }
             }
 
-            if (addClose()) {
+            if (numberOfPoints > 0 && addClose()) {
                 // polygons are closed / polylines not
                 poly.closePath();
             }
 
-            return LittleEndianConsts.SHORT_SIZE+numberofPoints*LittleEndianConsts.INT_SIZE;
+            return LittleEndianConsts.SHORT_SIZE+numberOfPoints*LittleEndianConsts.INT_SIZE;
         }
 
         @Override
index ebb829a9b3a2c61d6c183f2b02cdf136029335bc..d1440c0c32534d7c3ab7a0b044af0c331b474d53 100644 (file)
@@ -39,6 +39,8 @@ import org.apache.poi.util.LocaleUtil;
 import org.apache.poi.util.RecordFormatException;
 import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.CsvSource;
 
 public class TestHwmfParsing {
 
@@ -48,12 +50,17 @@ public class TestHwmfParsing {
     // for manual mass parsing and rendering tests of .wmfs use HemfPictureTest.paint() !
     // ******************************************************************************
 
-    @Test
-    public void parse() throws IOException {
-        try (InputStream fis = samples.openResourceAsStream("santa.wmf")) {
+    @ParameterizedTest
+    @CsvSource({
+        "santa.wmf, 581",
+        /* Bug 65063 */
+        "empty-polygon-close.wmf, 272"
+    })
+    public void parse(String file, int recordCnt) throws IOException {
+        try (InputStream fis = samples.openResourceAsStream(file)) {
             HwmfPicture wmf = new HwmfPicture(fis);
             List<HwmfRecord> records = wmf.getRecords();
-            assertEquals(581, records.size());
+            assertEquals(recordCnt, records.size());
         }
     }
 
diff --git a/test-data/slideshow/empty-polygon-close.wmf b/test-data/slideshow/empty-polygon-close.wmf
new file mode 100644 (file)
index 0000000..44aa7cf
Binary files /dev/null and b/test-data/slideshow/empty-polygon-close.wmf differ