Bug#1125962: trixie-pu: package pcsx2/1.6.0+dfsg-3

Christopher Obbard obbardc at debian.org
Mon Jan 19 15:35:56 GMT 2026


Package: release.debian.org
Severity: normal
Tags: trixie
X-Debbugs-Cc: pcsx2 at packages.debian.org, obbardc at debian.org, Sébastien Noel <sebastien at twolife.be>
Control: affects -1 + src:pcsx2
User: release.debian.org at packages.debian.org
Usertags: pu

[ Reason ]
pcsx2 in trixie is subject to CVE-2025-49589 (#1107756). Backport patch
from upstream to fix the security issue.

[ Impact ]
Fixes CVE-2025-49589 (#1107756).

[ Tests ]
No regressions when manually running pcsx2.

[ Risks ]
Limited risk - backport of patch from upstream to fix CVE.

[ Checklist ]
  [x] *all* changes are documented in the d/changelog
  [x] I reviewed all changes and I approve them
  [x] attach debdiff against the package in (old)stable
  [x] the issue is verified as fixed in unstable

[ Changes ]
Backport security fix for CVE-2025-49589.

[ Other info ]
I am uploading this stable fix on behalf of Sébastien Noel
<sebastien at twolife.be> (in CC).
-------------- next part --------------
diff -Nru pcsx2-1.6.0+dfsg/debian/changelog pcsx2-1.6.0+dfsg/debian/changelog
--- pcsx2-1.6.0+dfsg/debian/changelog	2024-12-23 15:57:26.000000000 +0100
+++ pcsx2-1.6.0+dfsg/debian/changelog	2026-01-19 09:55:23.000000000 +0100
@@ -1,3 +1,9 @@
+pcsx2 (1.6.0+dfsg-3+deb13u1) trixie-security; urgency=medium
+
+  * Backport security fix for CVE-2025-49589.
+
+ -- Sébastien Noel <sebastien at twolife.be>  Mon, 19 Jan 2026 09:55:23 +0100
+
 pcsx2 (1.6.0+dfsg-3) unstable; urgency=medium
 
   * Team Upload
diff -Nru pcsx2-1.6.0+dfsg/debian/patches/CVE-2025-49589.patch pcsx2-1.6.0+dfsg/debian/patches/CVE-2025-49589.patch
--- pcsx2-1.6.0+dfsg/debian/patches/CVE-2025-49589.patch	1970-01-01 01:00:00.000000000 +0100
+++ pcsx2-1.6.0+dfsg/debian/patches/CVE-2025-49589.patch	2026-01-19 09:55:23.000000000 +0100
@@ -0,0 +1,124 @@
+Description: CVE-2025-49589
+ backport the following upstream commit:
+  4c9d2f99b17b1e6f281a264b673f39d95ede6c21
+  6eac0bbcb1d59197a1aa99e41dfae0f87bc23848
+Origin: upstream
+Forwarded: not-needed
+Last-Update: 2026-01-19
+
+--- a/pcsx2/IopBios.cpp
++++ b/pcsx2/IopBios.cpp
+@@ -20,6 +20,7 @@
+ 
+ #include <ctype.h>
+ #include <string.h>
++#include <algorithm>
+ 
+ #ifndef O_BINARY
+ #define O_BINARY 0
+@@ -490,8 +491,12 @@ namespace sysmem {
+ 
+ 		if (!SysConsole.iopConsole.IsActive()) return 1;
+ 
+-		char tmp[1024], tmp2[1024];
++		// maximum allowed size for our buffer before we truncate
++		const unsigned int max_len = 4096;
++		char tmp[max_len], tmp2[max_len];
+ 		char *ptmp = tmp;
++		unsigned int printed_bytes = 0;
++		int remaining_buf = max_len - 1;
+ 		int n=1, i=0, j = 0;
+ 
+ 		while (fmt[i])
+@@ -502,35 +507,50 @@ namespace sysmem {
+ 					j = 0;
+ 					tmp2[j++] = '%';
+ _start:
+-					switch (fmt[++i])
++					// let's check whether this is our null terminator
++					// before allowing the parser to proceed
++					if (fmt[i + 1])
+ 					{
+-						case '.':
+-						case 'l':
+-							tmp2[j++] = fmt[i];
+-							goto _start;
+-						default:
+-							if (fmt[i] >= '0' && fmt[i] <= '9')
+-							{
++						switch (fmt[++i])
++						{
++							case '.':
++							case 'l':
++								if (j >= max_len)
++									break;
+ 								tmp2[j++] = fmt[i];
+ 								goto _start;
+-							}
+-							break;
++							default:
++								if (fmt[i] >= '0' && fmt[i] <= '9')
++								{
++									if (j >= max_len)
++										break;
++									tmp2[j++] = fmt[i];
++									goto _start;
++								}
++								break;
++						}
+ 					}
+ 
++					if (j >= max_len)
++						break;
+ 					tmp2[j++] = fmt[i];
+ 					tmp2[j] = 0;
+ 
+ 					switch (fmt[i])
+ 					{
+ 						case 'f': case 'F':
+-							ptmp+= sprintf(ptmp, tmp2, (float)iopMemRead32(sp + n * 4));
++							printed_bytes = std::min(remaining_buf, snprintf(ptmp, remaining_buf, tmp2, (float)iopMemRead32(sp + n * 4)));
++							remaining_buf -= printed_bytes;
++							ptmp += printed_bytes;
+ 							n++;
+ 							break;
+ 
+ 						case 'a': case 'A':
+ 						case 'e': case 'E':
+ 						case 'g': case 'G':
+-							ptmp+= sprintf(ptmp, tmp2, (double)iopMemRead32(sp + n * 4));
++							printed_bytes = std::min(remaining_buf, snprintf(ptmp, remaining_buf, tmp2, (double)iopMemRead32(sp + n * 4)));
++							remaining_buf -= printed_bytes;
++							ptmp += printed_bytes;
+ 							n++;
+ 							break;
+ 
+@@ -539,19 +559,25 @@ _start:
+ 						case 'd': case 'D':
+ 						case 'o': case 'O':
+ 						case 'x': case 'X':
+-							ptmp+= sprintf(ptmp, tmp2, (u32)iopMemRead32(sp + n * 4));
++							printed_bytes = std::min(remaining_buf, snprintf(ptmp, remaining_buf, tmp2, (u32)iopMemRead32(sp + n * 4)));
++							remaining_buf -= printed_bytes;
++							ptmp += printed_bytes;
+ 							n++;
+ 							break;
+ 
+ 						case 'c':
+-							ptmp+= sprintf(ptmp, tmp2, (u8)iopMemRead32(sp + n * 4));
++							printed_bytes = std::min(remaining_buf, snprintf(ptmp, remaining_buf, tmp2, (u8)iopMemRead32(sp + n * 4)));
++							remaining_buf -= printed_bytes;
++							ptmp += printed_bytes;
+ 							n++;
+ 							break;
+ 
+ 						case 's':
+ 							{
+ 								std::string s = iopMemReadString(iopMemRead32(sp + n * 4));
+-								ptmp += sprintf(ptmp, tmp2, s.data());
++								printed_bytes = std::min(remaining_buf, snprintf(ptmp, remaining_buf, tmp2, s.data()));
++								remaining_buf -= printed_bytes;
++								ptmp += printed_bytes;
+ 								n++;
+ 							}
+ 							break;
diff -Nru pcsx2-1.6.0+dfsg/debian/patches/series pcsx2-1.6.0+dfsg/debian/patches/series
--- pcsx2-1.6.0+dfsg/debian/patches/series	2024-12-23 15:37:39.000000000 +0100
+++ pcsx2-1.6.0+dfsg/debian/patches/series	2026-01-19 09:55:23.000000000 +0100
@@ -1,2 +1,3 @@
 wxwidgets3.2.patch
 cpp_error_ftbfs.patch
+CVE-2025-49589.patch


More information about the Pkg-games-devel mailing list