From ef34e71d89c299e7078fe45a5f0be0b522a4a8b1 Mon Sep 17 00:00:00 2001 From: Sergei Trofimovich Date: Wed, 25 Oct 2023 22:48:10 +0100 Subject: [PATCH 1/2] zsnes: fix build against zlib-1.3 Without the change builda fails on `master` as https://hydra.nixos.org/build/238481288/nixlog/3: checking for zlib - version >= 1.2.3... 1.3, bad version string given by zlib, sometimes due to very old zlibs that didnt correctly define their version. Please upgrade if you are running an old zlib... no The failure happens due to 2-digit zlib version string. Add a trivial change to allow 2-digit support in addition to existing 3-digit ones.. --- pkgs/applications/emulators/zsnes/default.nix | 2 + .../emulators/zsnes/zlib-1.3.patch | 41 +++++++++++++++++++ 2 files changed, 43 insertions(+) create mode 100644 pkgs/applications/emulators/zsnes/zlib-1.3.patch diff --git a/pkgs/applications/emulators/zsnes/default.nix b/pkgs/applications/emulators/zsnes/default.nix index 1583777a058f..059c069d6069 100644 --- a/pkgs/applications/emulators/zsnes/default.nix +++ b/pkgs/applications/emulators/zsnes/default.nix @@ -23,6 +23,8 @@ in stdenv.mkDerivation { sha256 = "1gy79d5wdaacph0cc1amw7mqm7i0716n6mvav16p1svi26iz193v"; }; + patches = [ ./zlib-1.3.patch ]; + buildInputs = [ nasm SDL zlib libpng ncurses libGLU libGL ]; prePatch = '' diff --git a/pkgs/applications/emulators/zsnes/zlib-1.3.patch b/pkgs/applications/emulators/zsnes/zlib-1.3.patch new file mode 100644 index 000000000000..0c4771f08925 --- /dev/null +++ b/pkgs/applications/emulators/zsnes/zlib-1.3.patch @@ -0,0 +1,41 @@ +Add support for 2-digit zlib version like "1.3". +--- a/src/acinclude.m4 ++++ b/src/acinclude.m4 +@@ -67,7 +67,7 @@ char* my_strdup (char *str) + + int main (int argc, char *argv[]) + { +- int major, minor, micro, zlib_major_version, zlib_minor_version, zlib_micro_version; ++ int major, minor, micro, zlib_major_version, zlib_minor_version, zlib_micro_version = 0; + + char *zlibver, *tmp_version; + +@@ -85,7 +85,7 @@ int main (int argc, char *argv[]) + printf("%s, bad version string for\n\tmin_zlib_version... ", "$min_zlib_version"); + exit(1); + } +- if (sscanf(zlibver, "%d.%d.%d", &zlib_major_version, &zlib_minor_version, &zlib_micro_version) != 3) { ++ if (sscanf(zlibver, "%d.%d.%d", &zlib_major_version, &zlib_minor_version, &zlib_micro_version) != 3 && sscanf(zlibver, "%d.%d", &zlib_major_version, &zlib_minor_version) != 2) { + printf("%s, bad version string given\n", zlibver); + puts("\tby zlib, sometimes due to very old zlibs that didnt correctly"); + printf("\tdefine their version. Please upgrade if you are running an\n\told zlib... "); +--- a/src/configure ++++ b/src/configure +@@ -3817,7 +3817,7 @@ char* my_strdup (char *str) + + int main (int argc, char *argv[]) + { +- int major, minor, micro, zlib_major_version, zlib_minor_version, zlib_micro_version; ++ int major, minor, micro, zlib_major_version, zlib_minor_version, zlib_micro_version = 0; + + char *zlibver, *tmp_version; + +@@ -3835,7 +3835,7 @@ int main (int argc, char *argv[]) + printf("%s, bad version string for\n\tmin_zlib_version... ", "$min_zlib_version"); + exit(1); + } +- if (sscanf(zlibver, "%d.%d.%d", &zlib_major_version, &zlib_minor_version, &zlib_micro_version) != 3) { ++ if (sscanf(zlibver, "%d.%d.%d", &zlib_major_version, &zlib_minor_version, &zlib_micro_version) != 3 && sscanf(zlibver, "%d.%d", &zlib_major_version, &zlib_minor_version) != 2) { + printf("%s, bad version string given\n", zlibver); + puts("\tby zlib, sometimes due to very old zlibs that didnt correctly"); + printf("\tdefine their version. Please upgrade if you are running an\n\told zlib... "); From 0e0863ee3848fe855fd02e6111b83836e5690021 Mon Sep 17 00:00:00 2001 From: Sergei Trofimovich Date: Thu, 2 Nov 2023 12:13:28 +0000 Subject: [PATCH 2/2] zsnes: fix buffer size marking to avoid crash on _FORTIFY_SOURCE=3 Without the change `zsnesn` startup crashes with: $ gdb zsnes *** buffer overflow detected ***: terminated ... #7 0x08057c14 in memset (__len=2, __ch=255, __dest=) at ...-glibc-2.38-23-dev/include/bits/string_fortified.h:59 --- pkgs/applications/emulators/zsnes/default.nix | 5 +++- .../emulators/zsnes/fortify3.patch | 29 +++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 pkgs/applications/emulators/zsnes/fortify3.patch diff --git a/pkgs/applications/emulators/zsnes/default.nix b/pkgs/applications/emulators/zsnes/default.nix index 059c069d6069..8e12d7cd7bb3 100644 --- a/pkgs/applications/emulators/zsnes/default.nix +++ b/pkgs/applications/emulators/zsnes/default.nix @@ -23,7 +23,10 @@ in stdenv.mkDerivation { sha256 = "1gy79d5wdaacph0cc1amw7mqm7i0716n6mvav16p1svi26iz193v"; }; - patches = [ ./zlib-1.3.patch ]; + patches = [ + ./zlib-1.3.patch + ./fortify3.patch + ]; buildInputs = [ nasm SDL zlib libpng ncurses libGLU libGL ]; diff --git a/pkgs/applications/emulators/zsnes/fortify3.patch b/pkgs/applications/emulators/zsnes/fortify3.patch new file mode 100644 index 000000000000..83a67b8b7e87 --- /dev/null +++ b/pkgs/applications/emulators/zsnes/fortify3.patch @@ -0,0 +1,29 @@ +pal16bxcl is an array of 256 dwords, not bytes: + src/endmem.asm:NEWSYM pal16bxcl, resd 256 + +While at it fixes off-by-4 out of bounds exit. + +Detected by _FORTIFY_SOURCE=3: + *** buffer overflow detected ***: terminated + #7 0x08057c14 in memset (__len=2, __ch=255, __dest=) at ...-glibc-2.38-23-dev/include/bits/string_fortified.h:59 +#8 clearmem () at initc.c:1461 +--- a/src/initc.c ++++ b/src/initc.c +@@ -1389,7 +1389,7 @@ extern unsigned char vidmemch8[4096]; + extern unsigned char pal16b[1024]; + extern unsigned char pal16bcl[1024]; + extern unsigned char pal16bclha[1024]; +-extern unsigned char pal16bxcl[256]; ++extern unsigned char pal16bxcl[1024]; + extern unsigned char SPCRAM[65472]; + unsigned char *SPCState = SPCRAM; + +@@ -1456,7 +1456,7 @@ void clearmem() + memset(pal16b, 0, 1024); + memset(pal16bcl, 0, 1024); + memset(pal16bclha, 0, 1024); +- for (i=0 ; i<1024 ; i+=4) ++ for (i=0 ; i<1024-4 ; i+=4) + { + memset(pal16bxcl+i, 255, 2); + memset(pal16bxcl+i+2, 0, 2);