On Sun, Jan 12, 2025 at 10:11:47PM +0900, SASANO Takayoshi wrote: > Hi, > > I could not extract GenEi-Latin font (TTF archive) at > https://okoneya.jp/font/GenEiLatin-Separate_v2.1.zip with unzip-6.0p17, > and I found "unzip: backwards memcpy" in /var/log messages. > > Remedy is simple, add -DNOMEMCPY.
It's the memcpy in inflate.c. The (unsigned) cast is wrong. If d is larger than w, unsigned overflow will make the result of (unsigned)w - d larger than UINT_MAX - d, which will almost certainly be larger than e. However, we can't just do memmove() unconditionally, because the fallback in case that w - d < e isn't actually memmove() or memcpy()... Yuck. I think this patch is safer than adding -DNOMEMCPY to the CFLAGS since it will keep using the same tested codepaths as before except that it no longer crashes on your example file (the resulting extracted files are the same). The check in explode.c seems correct since it doesn't have this cast. Index: Makefile =================================================================== RCS file: /cvs/ports/archivers/unzip/Makefile,v diff -u -p -r1.71 Makefile --- Makefile 7 Nov 2023 14:19:18 -0000 1.71 +++ Makefile 12 Jan 2025 15:14:43 -0000 @@ -5,7 +5,7 @@ COMMENT = extract, list & test files in VERSION = 6.0 DISTNAME = unzip${VERSION:S/.//} PKGNAME = unzip-${VERSION} -REVISION = 17 +REVISION = 18 CATEGORIES = archivers SITES = ${SITE_SOURCEFORGE:=infozip/} \ ftp://ftp.info-zip.org/pub/infozip/src/ Index: patches/patch-inflate_c =================================================================== RCS file: patches/patch-inflate_c diff -N patches/patch-inflate_c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ patches/patch-inflate_c 12 Jan 2025 15:35:45 -0000 @@ -0,0 +1,14 @@ +Avoid backward memcpy + +Index: inflate.c +--- inflate.c.orig ++++ inflate.c +@@ -1018,7 +1018,7 @@ unsigned bl, bd; /* number of bits decoded by t + if ((unsigned)w - d >= e) + /* (this test assumes unsigned comparison) */ + { +- memcpy(redirSlide + (unsigned)w, redirSlide + d, e); ++ memmove(redirSlide + (unsigned)w, redirSlide + d, e); + w += e; + d += e; + } Index: patches/patch-unix_zipgrep =================================================================== RCS file: /cvs/ports/archivers/unzip/patches/patch-unix_zipgrep,v diff -u -p -r1.1 patch-unix_zipgrep --- patches/patch-unix_zipgrep 14 Apr 2022 21:23:24 -0000 1.1 +++ patches/patch-unix_zipgrep 12 Jan 2025 15:12:44 -0000 @@ -1,10 +1,9 @@ -Index: unix/zipgrep - CVE-2022-1271 Prevent arbitrary-file-write vulnerability if an archive member name contains shell wild cards that expand to an existing pathname with an exploit pattern. +Index: unix/zipgrep --- unix/zipgrep.orig +++ unix/zipgrep @@ -70,7 +70,7 @@ for i in `unzip -Z1 "$zipfile" ${1+"$@"} | sed -e 's/\