From 1affc7423017eb20bec2352534a764ffa75d68cf Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Sat, 23 Jul 2005 21:46:46 +0000 Subject: [PATCH] From: Jorg Walter To: icculus@clutteredmind.org Subject: Bug in zip archiver Date: Sat, 23 Jul 2005 22:19:09 +0200 Hi! PhysFS has a bug in the ZIP archive module, function zip_find_start_of_dir. Upon encountering a substring match, rc is set to a wrong value. The fix is simple: swap both assignments like this: [patch below --Ed.] Some additional info for testing: Symptoms when you encounter this bug: A dir is reported as empty although it has files in it; prerequisites or encountering it: two dirs, one a substring of another, like "data/txt" and "data/txt2", laid out in a way so that variable "middle" points to a file in txt2 at some point during zip_find_start_of_dir By the way, if you're interested in where PhysFS is used: I found this bug while writing a patch for DOSBox (http://dosbox.sourceforge.net) to support ZIP files. And I'd love to see that enhanced PHYSFS_mount syntax in an official release soon *hint* ;);) --- CHANGELOG | 1 + CREDITS | 3 +++ archivers/zip.c | 4 ++-- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 01451550..75364461 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -4,6 +4,7 @@ -- stuff in the stable-1.0 branch, backported from 2.0.0 dev branch, etc --- +07232005 - Fixed bug in zip archiver (thanks, Jörg Walter!). 07132005 - Moved to zlib122, and security fix discussed here: http://www.cve.mitre.org/cgi-bin/cvename.cgi?name=CAN-2005-2096 06122005 - Added support for mingw to Unix build process (thanks, Matze!). diff --git a/CREDITS b/CREDITS index 9beb45a8..990a2feb 100644 --- a/CREDITS +++ b/CREDITS @@ -76,6 +76,9 @@ Spanish translation: Mingw support: Matze Braun +Bug fixes: + Jörg Walter + Other stuff: Your name here! Patches go to icculus@clutteredmind.org ... diff --git a/archivers/zip.c b/archivers/zip.c index 5cc2f7eb..2ace62cf 100644 --- a/archivers/zip.c +++ b/archivers/zip.c @@ -1208,9 +1208,9 @@ static PHYSFS_sint32 zip_find_start_of_dir(ZIPinfo *info, const char *path, if (rc == 0) { char ch = name[dlen]; - if (ch < '/') /* make sure this isn't just a substr match. */ + if ('/' < ch) /* make sure this isn't just a substr match. */ rc = -1; - else if (ch > '/') + else if ('/' > ch) rc = 1; else {