Pick patch according to [2]

[1] https://nvd.nist.gov/vuln/detail/CVE-2026-56002
[2] https://security-tracker.debian.org/tracker/CVE-2026-56002

Signed-off-by: Vijay Anusuri <[email protected]>
---
 .../xorg-lib/libxfont/CVE-2026-56002.patch    | 147 ++++++++++++++++++
 .../xorg-lib/libxfont_1.5.4.bb                |   1 +
 2 files changed, 148 insertions(+)
 create mode 100644 meta/recipes-graphics/xorg-lib/libxfont/CVE-2026-56002.patch

diff --git a/meta/recipes-graphics/xorg-lib/libxfont/CVE-2026-56002.patch 
b/meta/recipes-graphics/xorg-lib/libxfont/CVE-2026-56002.patch
new file mode 100644
index 0000000000..a615c21a2f
--- /dev/null
+++ b/meta/recipes-graphics/xorg-lib/libxfont/CVE-2026-56002.patch
@@ -0,0 +1,147 @@
+From b4389e0b1d84a690b819bb27b1439968811a3674 Mon Sep 17 00:00:00 2001
+From: Peter Hutterer <[email protected]>
+Date: Mon, 1 Jun 2026 16:48:40 +1000
+Subject: [PATCH] pcfread: validate bitmap sizes and offsets against per-glyph
+ metrics
+
+pcfReadFont() uses bitmapSizes[] read directly from the PCF file to
+allocate the repadded bitmap buffer. However, per-glyph metrics (also
+from the file) control how much data RepadBitmap() writes. A malicious
+PCF font can declare a small bitmapSizes[] value while having per-glyph
+metrics that require more space, causing a heap buffer overflow.
+
+A similar issue happens with the encoding offsets: pcfReadFont reads
+encoding offsets from the PCF file and uses them to index into the
+metrics array without bounds checking.  A crafted font can set an
+encoding offset larger than nmetrics, causing an out-of-bounds pointer
+that is later dereferenced when glyphs are accessed through the encoding
+table.
+
+And the no-repad bitmap path (when PCF_GLYPH_PAD matches the requested
+glyph pad) only validated that each glyph's offset was within the bitmap
+buffer, but did not check that the full glyph extent (offset +
+BYTES_PER_ROW * height) fits within the buffer.  A crafted font with a
+glyph offset near the end of a small bitmap buffer but large glyph
+metrics causes a heap buffer over-read when the glyph is later rendered.
+
+This vulnerability was discovered by:
+  Anonymous working with TrendAI Zero Day Initiative
+
+CVE-2026-56002/ZDI-CAN-30559
+
+Assisted-by: Claude:claude-opus-4-6
+Signed-off-by: Peter Hutterer <[email protected]>
+Part-of: <https://gitlab.freedesktop.org/xorg/lib/libxfont/-/merge_requests/34>
+
+Upstream-Status: Backport [import from debian libxfont1 1.5.2-4+deb9u1
+Upstream commit 
https://gitlab.freedesktop.org/xorg/lib/libxfont/-/commit/b4389e0b1d84a690b819bb27b1439968811a3674]
+CVE: CVE-2026-56002
+Signed-off-by: Vijay Anusuri <[email protected]>
+---
+ src/bitmap/pcfread.c | 60 +++++++++++++++++++++++++++++++++++++++++---
+ 1 file changed, 57 insertions(+), 3 deletions(-)
+
+diff --git a/src/bitmap/pcfread.c b/src/bitmap/pcfread.c
+index 4a372c5..0cc9777 100644
+--- a/src/bitmap/pcfread.c
++++ b/src/bitmap/pcfread.c
+@@ -45,6 +45,7 @@ from The Open Group.
+ #include <stdarg.h>
+ #include <stdint.h>
+ #include <string.h>
++#include <limits.h>
+ 
+ void
+ pcfError(const char* message, ...)
+@@ -529,25 +530,74 @@ pcfReadFont(FontPtr pFont, FontFilePtr file,
+       int         old,
+                   new;
+       xCharInfo  *metric;
++      int         srcPad = PCF_GLYPH_PAD(format);
+ 
+-      sizepadbitmaps = bitmapSizes[PCF_SIZE_TO_INDEX(glyph)];
+-      padbitmaps = malloc(sizepadbitmaps);
++      /* Compute the actual required size from per-glyph metrics instead
++       * of trusting the file's bitmapSizes[] value, which may be smaller
++       * than the actual data written by RepadBitmap. */
++      sizepadbitmaps = 0;
++      for (i = 0; i < nbitmaps; i++) {
++          int w, h, glyphBytes;
++          metric = &metrics[i].metrics;
++          w = metric->rightSideBearing - metric->leftSideBearing;
++          h = metric->ascent + metric->descent;
++          glyphBytes = BYTES_PER_ROW(w, glyph) * h;
++          if (glyphBytes < 0 || (glyphBytes > 0 && sizepadbitmaps > INT_MAX - 
glyphBytes)) {
++              pcfError("pcfReadFont(): bitmap size overflow\n");
++              goto Bail;
++          }
++          sizepadbitmaps += glyphBytes;
++      }
++      padbitmaps = malloc(sizepadbitmaps ? sizepadbitmaps : 1);
+       if (!padbitmaps) {
+           pcfError("pcfReadFont(): Couldn't allocate padbitmaps (%d)\n", 
sizepadbitmaps);
+           goto Bail;
+       }
+       new = 0;
+       for (i = 0; i < nbitmaps; i++) {
++          int srcGlyphBytes;
++
+           old = offsets[i];
+           metric = &metrics[i].metrics;
++
++          /* Validate source offset and source glyph size against the
++           * source bitmap buffer to prevent out-of-bounds reads. */
++          srcGlyphBytes = BYTES_PER_ROW(
++              metric->rightSideBearing - metric->leftSideBearing,
++              srcPad) * (metric->ascent + metric->descent);
++          if (old < 0 || old > sizebitmaps ||
++              srcGlyphBytes < 0 || srcGlyphBytes > sizebitmaps - old) {
++              pcfError("pcfReadFont(): bitmap offset/size out of bounds\n");
++              free(padbitmaps);
++              goto Bail;
++          }
++
+           offsets[i] = new;
+           new += RepadBitmap(bitmaps + old, padbitmaps + new,
+-                             PCF_GLYPH_PAD(format), glyph,
++                             srcPad, glyph,
+                         metric->rightSideBearing - metric->leftSideBearing,
+                              metric->ascent + metric->descent);
+       }
+       free(bitmaps);
+       bitmaps = padbitmaps;
++    } else {
++      /* Validate offsets and full glyph extents against bitmap buffer */
++      for (i = 0; i < nbitmaps; i++) {
++          int glyphBytes;
++          xCharInfo *metric = &metrics[i].metrics;
++
++          glyphBytes = BYTES_PER_ROW(
++              metric->rightSideBearing - metric->leftSideBearing,
++              glyph) * (metric->ascent + metric->descent);
++          if (offsets[i] >= (CARD32)sizebitmaps ||
++              glyphBytes < 0 ||
++              glyphBytes > sizebitmaps - (int)offsets[i]) {
++              pcfError("pcfReadFont(): bitmap offset/size out of bounds "
++                       "(offset %u, size %d, total %d)\n",
++                       offsets[i], glyphBytes, sizebitmaps);
++              goto Bail;
++          }
++      }
+     }
+     for (i = 0; i < nbitmaps; i++)
+       metrics[i].bits = bitmaps + offsets[i];
+@@ -622,6 +672,10 @@ pcfReadFont(FontPtr pFont, FontFilePtr file,
+       if (IS_EOF(file)) goto Bail;
+       if (encodingOffset == 0xFFFF) {
+           pFont->info.allExist = FALSE;
++      } else if (encodingOffset >= nmetrics) {
++          pcfError("pcfReadFont(): encoding offset %d out of range 
(nmetrics=%d)\n",
++                   encodingOffset, nmetrics);
++          goto Bail;
+       } else {
+             if(!encoding[SEGMENT_MAJOR(i)]) {
+                 encoding[SEGMENT_MAJOR(i)]=
+-- 
+2.43.0
+
diff --git a/meta/recipes-graphics/xorg-lib/libxfont_1.5.4.bb 
b/meta/recipes-graphics/xorg-lib/libxfont_1.5.4.bb
index 59c489b785..08c96fdac8 100644
--- a/meta/recipes-graphics/xorg-lib/libxfont_1.5.4.bb
+++ b/meta/recipes-graphics/xorg-lib/libxfont_1.5.4.bb
@@ -20,6 +20,7 @@ XORG_EXT = "tar.bz2"
 BBCLASSEXTEND = "native"
 
 SRC_URI += "file://CVE-2026-56001.patch \
+            file://CVE-2026-56002.patch \
            "
 
 SRC_URI[sha256sum] = 
"1a7f7490774c87f2052d146d1e0e64518d32e6848184a18654e8d0bb57883242"
-- 
2.43.0

-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.
View/Reply Online (#244067): 
https://lists.openembedded.org/g/openembedded-core/message/244067
Mute This Topic: https://lists.openembedded.org/mt/120899336/21656
Group Owner: [email protected]
Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub 
[[email protected]]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to