Sfoglia il codice sorgente

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* ;);)

Ryan C. Gordon 20 anni fa
parent
commit
8f3ab12d22
3 ha cambiato i file con 6 aggiunte e 2 eliminazioni
  1. 1 0
      CHANGELOG
  2. 3 0
      CREDITS
  3. 2 2
      archivers/zip.c

+ 1 - 0
CHANGELOG

@@ -2,6 +2,7 @@
  * CHANGELOG.
  */
 
+07232005 - Fixed bug in zip archiver (thanks, Jörg Walter!).
 07212005 - Patched to compile on OS/2 again.
 07132005 - Updated zlib to 1.2.2, and patched it for this security hole:
            http://www.cve.mitre.org/cgi-bin/cvename.cgi?name=CAN-2005-2096

+ 3 - 0
CREDITS

@@ -87,6 +87,9 @@ MPW support:
 Mingw support:
     Matze Braun
 
+Bug fixes:
+    Jörg Walter
+
 Other stuff:
     Your name here! Patches go to icculus@clutteredmind.org ...
 

+ 2 - 2
archivers/zip.c

@@ -1146,9 +1146,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 
             {