mirror of
git://git.yoctoproject.org/poky.git
synced 2025-07-19 21:09:03 +02:00
ghostscript: Fix CVE-2025-27831
Upstream-Status: Backport [https://cgit.ghostscript.com/cgi-bin/cgit.cgi/ghostpdl.git/commit/?id=bf79b61cb1677d6865c45d397435848a21e8a647 & https://cgit.ghostscript.com/cgi-bin/cgit.cgi/ghostpdl.git/commit/?id=bf79b61cb1677d6865c45d397435848a21e8a647] (From OE-Core rev: 810795d2f1d7798c52675efd94917bf99fb940d0) Signed-off-by: Vijay Anusuri <vanusuri@mvista.com> Signed-off-by: Steve Sakoman <steve@sakoman.com>
This commit is contained in:
parent
d80ece64ab
commit
09870c8cce
|
@ -0,0 +1,50 @@
|
|||
Partial backport of:
|
||||
|
||||
From bf79b61cb1677d6865c45d397435848a21e8a647 Mon Sep 17 00:00:00 2001
|
||||
From: Ken Sharp <ken.sharp@artifex.com>
|
||||
Date: Tue, 27 Sep 2022 13:03:57 +0100
|
||||
Subject: [PATCH] PCL interpreter - fix decode_glyph for Unicode
|
||||
|
||||
The text extraction (and pdfwrite family) expect that decode_glyph
|
||||
should always return pairs of bytes (an assumption that Unicode code
|
||||
points are 2 bytes), and the return value from the routine should be
|
||||
the number of bytes required to hold the value.
|
||||
|
||||
The PCL decode_glyph routine however was simply returning 1, which
|
||||
caused the text extraction code some difficulty since it wasn't
|
||||
expecting that.
|
||||
|
||||
This commit firstly alters the text extraction code to cope 'better'
|
||||
with a decode_glyph routine which returns an odd value (basically
|
||||
ignore it and fall back to using the character code).
|
||||
|
||||
We also alter the pl_decode_glyph routine to return 2 instead of 1,
|
||||
so that it correctly tells the caller that it is returning 2 bytes.
|
||||
Finally we make sure that the returned value is big-endian, because the
|
||||
text extraction code assumes it will be.
|
||||
|
||||
Upstream-Status: Backport [https://cgit.ghostscript.com/cgi-bin/cgit.cgi/ghostpdl.git/commit/?id=bf79b61cb1677d6865c45d397435848a21e8a647]
|
||||
CVE: CVE-2025-27831 #Dependency Patch
|
||||
Signed-off-by: Vijay Anusuri <vanusuri@mvista.com>
|
||||
---
|
||||
devices/vector/doc_common.c | 8 ++++++++
|
||||
pcl/pl/plfont.c | 12 +++++++++---
|
||||
2 files changed, 17 insertions(+), 3 deletions(-)
|
||||
|
||||
--- a/devices/vector/doc_common.c
|
||||
+++ b/devices/vector/doc_common.c
|
||||
@@ -513,6 +513,14 @@ int txt_get_unicode(gx_device *dev, gs_f
|
||||
char *b, *u;
|
||||
int l = length - 1;
|
||||
|
||||
+ /* Real Unicode values should be at least 2 bytes. In fact I think the code assumes exactly
|
||||
+ * 2 bytes. If we got an odd number, give up and return the character code.
|
||||
+ */
|
||||
+ if (length & 1) {
|
||||
+ *Buffer = fallback;
|
||||
+ return 1;
|
||||
+ }
|
||||
+
|
||||
unicode = (ushort *)gs_alloc_bytes(dev->memory, length, "temporary Unicode array");
|
||||
length = font->procs.decode_glyph((gs_font *)font, glyph, ch, unicode, length);
|
||||
#if ARCH_IS_BIG_ENDIAN
|
|
@ -0,0 +1,84 @@
|
|||
From d6e713dda4f8d75c6a4ed8c7568a0d4f532dcb17 Mon Sep 17 00:00:00 2001
|
||||
From: Zdenek Hutyra <zhutyra@centrum.cz>
|
||||
Date: Thu, 21 Nov 2024 10:04:17 +0000
|
||||
Subject: Prevent Unicode decoding overrun
|
||||
|
||||
Bug #708132 "Text buffer overflow with long characters"
|
||||
|
||||
The txt_get_unicode function was copying too few bytes from the
|
||||
fixed glyph name to unicode mapping tables. This was probably
|
||||
causing incorrect Unicode code points in relatively rare cases but
|
||||
not otherwise a problem.
|
||||
|
||||
However, a badly formed GlyphNames2Unicode array attached to a font
|
||||
could cause the decoding to spill over the assigned buffer.
|
||||
|
||||
We really should rewrite the Unicode handling, but until we do just
|
||||
checking that the length is no more than 4 Unicode code points is
|
||||
enough to prevent an overrun. All the current clients allocate at least
|
||||
4 code points per character code.
|
||||
|
||||
Added a comment to explain the magic number.
|
||||
|
||||
CVE-2025-27831
|
||||
|
||||
Upstream-Status: Backport [https://cgit.ghostscript.com/cgi-bin/cgit.cgi/ghostpdl.git/commit/?id=d6e713dda4f8d75c6a4ed8c7568a0d4f532dcb17]
|
||||
CVE: CVE-2025-27831
|
||||
Signed-off-by: Vijay Anusuri <vanusuri@mvista.com>
|
||||
---
|
||||
devices/vector/doc_common.c | 14 +++++++++-----
|
||||
1 file changed, 9 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/devices/vector/doc_common.c b/devices/vector/doc_common.c
|
||||
index 690f8eaed..05fb3d51f 100644
|
||||
--- a/devices/vector/doc_common.c
|
||||
+++ b/devices/vector/doc_common.c
|
||||
@@ -479,7 +479,7 @@ int txt_get_unicode(gx_device *dev, gs_font *font, gs_glyph glyph, gs_char ch, u
|
||||
}
|
||||
if (strlen(dentry->Glyph) == gnstr.size) {
|
||||
if(memcmp(gnstr.data, dentry->Glyph, gnstr.size) == 0) {
|
||||
- memcpy(Buffer, dentry->Unicode, 2);
|
||||
+ memcpy(Buffer, dentry->Unicode, 2 * sizeof(unsigned short));
|
||||
return 2;
|
||||
}
|
||||
}
|
||||
@@ -497,7 +497,7 @@ int txt_get_unicode(gx_device *dev, gs_font *font, gs_glyph glyph, gs_char ch, u
|
||||
}
|
||||
if (strlen(tentry->Glyph) == gnstr.size) {
|
||||
if(memcmp(gnstr.data, tentry->Glyph, gnstr.size) == 0) {
|
||||
- memcpy(Buffer, tentry->Unicode, 3);
|
||||
+ memcpy(Buffer, tentry->Unicode, 3 * sizeof(unsigned short));
|
||||
return 3;
|
||||
}
|
||||
}
|
||||
@@ -515,7 +515,7 @@ int txt_get_unicode(gx_device *dev, gs_font *font, gs_glyph glyph, gs_char ch, u
|
||||
}
|
||||
if (strlen(qentry->Glyph) == gnstr.size) {
|
||||
if(memcmp(gnstr.data, qentry->Glyph, gnstr.size) == 0) {
|
||||
- memcpy(Buffer, qentry->Unicode, 4);
|
||||
+ memcpy(Buffer, qentry->Unicode, 4 * sizeof(unsigned short));
|
||||
return 4;
|
||||
}
|
||||
}
|
||||
@@ -527,12 +527,16 @@ int txt_get_unicode(gx_device *dev, gs_font *font, gs_glyph glyph, gs_char ch, u
|
||||
return 1;
|
||||
} else {
|
||||
char *b, *u;
|
||||
- int l = length - 1;
|
||||
+ int l;
|
||||
|
||||
/* Real Unicode values should be at least 2 bytes. In fact I think the code assumes exactly
|
||||
* 2 bytes. If we got an odd number, give up and return the character code.
|
||||
+ *
|
||||
+ * The magic number here is due to the clients calling this code. Currently txtwrite and docxwrite
|
||||
+ * allow up to 4 Unicode values per character/glyph, if the length would exceed that we can't
|
||||
+ * write it. For now, again, fall back to the character code.
|
||||
*/
|
||||
- if (length & 1) {
|
||||
+ if (length & 1 || length > 4 * sizeof(unsigned short)) {
|
||||
*Buffer = fallback;
|
||||
return 1;
|
||||
}
|
||||
--
|
||||
cgit v1.2.3
|
||||
|
|
@ -63,6 +63,8 @@ SRC_URI_BASE = "https://github.com/ArtifexSoftware/ghostpdl-downloads/releases/d
|
|||
file://CVE-2024-46955.patch \
|
||||
file://CVE-2024-46956.patch \
|
||||
file://CVE-2025-27830.patch \
|
||||
file://CVE-2025-27831-pre1.patch \
|
||||
file://CVE-2025-27831.patch \
|
||||
"
|
||||
|
||||
SRC_URI = "${SRC_URI_BASE} \
|
||||
|
|
Loading…
Reference in New Issue
Block a user