Fixed infinite loop bug, cleaned out tab chars.
authorRyan C. Gordon <icculus@icculus.org>
Fri, 30 Aug 2002 14:30:49 +0000
changeset 491 b8853d8a09cb
parent 490 5c6485aa62c3
child 492 1521940ca54c
Fixed infinite loop bug, cleaned out tab chars.
archivers/zip.c
--- a/archivers/zip.c	Fri Aug 30 04:15:51 2002 +0000
+++ b/archivers/zip.c	Fri Aug 30 14:30:49 2002 +0000
@@ -549,18 +549,18 @@
 static ZIPentry *zip_find_entry(ZIPinfo *info, const char *path, int *isDir)
 {
     ZIPentry *a = info->entries;
-	PHYSFS_sint32 pathlen = strlen(path);
-	PHYSFS_sint32 lo = 0;
+    PHYSFS_sint32 pathlen = strlen(path);
+    PHYSFS_sint32 lo = 0;
     PHYSFS_sint32 hi = (PHYSFS_sint32) (info->entryCount - 1);
     PHYSFS_sint32 middle;
-	const char *thispath = NULL;
+    const char *thispath = NULL;
     int rc;
 
     while (lo <= hi)
     {
-		middle = lo + ((hi - lo) / 2);
-		thispath = a[middle].name;
-		rc = strncmp(path, thispath, pathlen);
+        middle = lo + ((hi - lo) / 2);
+        thispath = a[middle].name;
+        rc = strncmp(path, thispath, pathlen);
 
         if (rc > 0)
             lo = middle + 1;
@@ -568,19 +568,21 @@
         else if (rc < 0)
             hi = middle - 1;
 
-		else  /* substring match...might be dir or entry or nothing. */
-		{
+        else /* substring match...might be dir or entry or nothing. */
+        {
             if (isDir != NULL)
             {
-			    *isDir = (thispath[pathlen] == '/');
-    			if (*isDir)
+                *isDir = (thispath[pathlen] == '/');
+                if (*isDir)
                     return(NULL);
             } /* if */
 
             if (thispath[pathlen] == '\0') /* found entry? */
-				return(&a[middle]);
-		} /* else */
-	} /* while */
+                return(&a[middle]);
+            else
+                hi = middle - 1;  /* adjust search params, try again. */
+        } /* if */
+    } /* while */
 
     if (isDir != NULL)
         *isDir = 0;
@@ -1024,31 +1026,31 @@
     /* find the end-of-central-dir record, and seek to it. */
     pos = zip_find_end_of_central_dir(in, &len);
     BAIL_IF_MACRO(pos == -1, NULL, 0);
-	BAIL_IF_MACRO(!__PHYSFS_platformSeek(in, pos), NULL, 0);
+    BAIL_IF_MACRO(!__PHYSFS_platformSeek(in, pos), NULL, 0);
 
     /* check signature again, just in case. */
     BAIL_IF_MACRO(!readui32(in, &ui32), NULL, 0);
     BAIL_IF_MACRO(ui32 != ZIP_END_OF_CENTRAL_DIR_SIG, ERR_NOT_AN_ARCHIVE, 0);
 
-	/* number of this disk */
+    /* number of this disk */
     BAIL_IF_MACRO(!readui16(in, &ui16), NULL, 0);
     BAIL_IF_MACRO(ui16 != 0, ERR_UNSUPPORTED_ARCHIVE, 0);
 
-	/* number of the disk with the start of the central directory */
+    /* number of the disk with the start of the central directory */
     BAIL_IF_MACRO(!readui16(in, &ui16), NULL, 0);
     BAIL_IF_MACRO(ui16 != 0, ERR_UNSUPPORTED_ARCHIVE, 0);
 
-	/* total number of entries in the central dir on this disk */
+    /* total number of entries in the central dir on this disk */
     BAIL_IF_MACRO(!readui16(in, &ui16), NULL, 0);
 
-	/* total number of entries in the central dir */
+    /* total number of entries in the central dir */
     BAIL_IF_MACRO(!readui16(in, &zipinfo->entryCount), NULL, 0);
     BAIL_IF_MACRO(ui16 != zipinfo->entryCount, ERR_UNSUPPORTED_ARCHIVE, 0);
 
-	/* size of the central directory */
+    /* size of the central directory */
     BAIL_IF_MACRO(!readui32(in, &ui32), NULL, 0);
 
-	/* offset of central directory */
+    /* offset of central directory */
     BAIL_IF_MACRO(!readui32(in, central_dir_ofs), NULL, 0);
     BAIL_IF_MACRO(pos < *central_dir_ofs + ui32, ERR_UNSUPPORTED_ARCHIVE, 0);
 
@@ -1060,12 +1062,12 @@
      *  sizeof central dir)...the difference in bytes is how much arbitrary
      *  data is at the start of the physical file.
      */
-	*data_start = pos - (*central_dir_ofs + ui32);
+    *data_start = pos - (*central_dir_ofs + ui32);
 
     /* Now that we know the difference, fix up the central dir offset... */
     *central_dir_ofs += *data_start;
 
-	/* zipfile comment length */
+    /* zipfile comment length */
     BAIL_IF_MACRO(!readui16(in, &ui16), NULL, 0);
 
     /*