You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xmlgraphics.apache.org by jg...@apache.org on 2026/10/05 17:13:15 UTC

(xmlgraphics-fop) 01/01: FOP-3352 Avoid exception when checking contour data on empty glyphs

This is an automated email from the ASF dual-hosted git repository.

joao12021996 pushed a commit to branch temp/jgoncalves-bad-font
in repository https://gitbox.apache.org/repos/asf/xmlgraphics-fop.git

commit 50d1e613d701868208edfe8c9460599bed1adce7
Author: Joao Andre Goncalves <jg...@smartcommunications.com>
AuthorDate: Mon Oct 5 12:12:47 2026 -0500

    FOP-3352 Avoid exception when checking contour data on empty glyphs
---
 .../org/apache/fop/fonts/truetype/GlyfTable.java     | 15 +++++++++++++++
 .../apache/fop/fonts/truetype/GlyfTableTestCase.java | 20 ++++++++++++++++++++
 2 files changed, 35 insertions(+)

diff --git a/fop-core/src/main/java/org/apache/fop/fonts/truetype/GlyfTable.java b/fop-core/src/main/java/org/apache/fop/fonts/truetype/GlyfTable.java
index c5380b82e..9e44ee18d 100644
--- a/fop-core/src/main/java/org/apache/fop/fonts/truetype/GlyfTable.java
+++ b/fop-core/src/main/java/org/apache/fop/fonts/truetype/GlyfTable.java
@@ -35,6 +35,8 @@ public class GlyfTable {
 
     private final long tableOffset;
 
+    private final long tableLength;
+
     private final Set<Long> remappedComposites;
 
     protected final Map<Integer, Integer> subset;
@@ -51,6 +53,7 @@ public class GlyfTable {
                         Map<Integer, Integer> glyphs) throws IOException {
         mtxTab = metrics;
         tableOffset = dirTableEntry.getOffset();
+        tableLength = dirTableEntry.getLength();
         remappedComposites = new HashSet<Long>();
         this.subset = glyphs;
         this.in = in;
@@ -203,10 +206,22 @@ public class GlyfTable {
     }
 
     public boolean isComposite(int indexInOriginal) throws IOException {
+        if (isLastGlyphEmpty(indexInOriginal)) {
+            return false;
+        }
+
         int numberOfContours = in.readTTFShort(tableOffset + mtxTab[indexInOriginal].getOffset());
         return numberOfContours < 0;
     }
 
+    private boolean isLastGlyphEmpty(int indexInOriginal) {
+        if (indexInOriginal != mtxTab.length - 1) {
+            return false;
+        }
+
+        return tableLength == mtxTab[indexInOriginal].getOffset();
+    }
+
     /**
      * Reads a composite glyph at a given index and retrieves all the glyph indices of contingent
      * composed glyphs.
diff --git a/fop-core/src/test/java/org/apache/fop/fonts/truetype/GlyfTableTestCase.java b/fop-core/src/test/java/org/apache/fop/fonts/truetype/GlyfTableTestCase.java
index 0ca861ea3..efa2dafcb 100644
--- a/fop-core/src/test/java/org/apache/fop/fonts/truetype/GlyfTableTestCase.java
+++ b/fop-core/src/test/java/org/apache/fop/fonts/truetype/GlyfTableTestCase.java
@@ -29,6 +29,7 @@ import java.util.Map;
 
 import org.junit.Before;
 import org.junit.Test;
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
 /**
@@ -131,6 +132,25 @@ public class GlyfTableTestCase {
         assertArrayEquals(expected, composedIndices);
     }
 
+    @Test
+    public void testIsCompositeOnEmptyGlyph() throws IOException {
+        int glyphLength = 12;
+
+        OFMtxEntry glyph = new OFMtxEntry();
+        glyph.setOffset(glyphLength);
+
+        OFMtxEntry[] mtx = new OFMtxEntry[] {glyph};
+        OFDirTabEntry dirTab = new OFDirTabEntry(0, glyphLength);
+
+        byte[] glyf = new byte[glyphLength];
+        glyf[0] = 0x00;
+
+        FontFileReader reader = new FontFileReader(new ByteArrayInputStream(glyf));
+        GlyfTable glyfTable = new GlyfTable(reader, mtx, dirTab, new HashMap<Integer, Integer>());
+
+        assertFalse("An empty glyph must not be reported as composite", glyfTable.isComposite(0));
+    }
+
     private int[] setupTest(int... glyphIndices) throws IOException {
         Map<Integer, Integer> glyphs = new HashMap<Integer, Integer>();
         int index = 0;


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@xmlgraphics.apache.org
For additional commands, e-mail: commits-help@xmlgraphics.apache.org