Kaynağa Gözat

Fixed infinite loop bug, cleaned out tab chars.

Ryan C. Gordon 23 yıl önce
ebeveyn
işleme
ee077eabec
1 değiştirilmiş dosya ile 24 ekleme ve 22 silme
  1. 24 22
      archivers/zip.c

+ 24 - 22
archivers/zip.c

@@ -549,18 +549,18 @@ static void zip_free_entries(ZIPentry *entries, PHYSFS_uint32 max)
 static ZIPentry *zip_find_entry(ZIPinfo *info, const char *path, int *isDir)
 static ZIPentry *zip_find_entry(ZIPinfo *info, const char *path, int *isDir)
 {
 {
     ZIPentry *a = info->entries;
     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 hi = (PHYSFS_sint32) (info->entryCount - 1);
     PHYSFS_sint32 middle;
     PHYSFS_sint32 middle;
-	const char *thispath = NULL;
+    const char *thispath = NULL;
     int rc;
     int rc;
 
 
     while (lo <= hi)
     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)
         if (rc > 0)
             lo = middle + 1;
             lo = middle + 1;
@@ -568,19 +568,21 @@ static ZIPentry *zip_find_entry(ZIPinfo *info, const char *path, int *isDir)
         else if (rc < 0)
         else if (rc < 0)
             hi = middle - 1;
             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)
             if (isDir != NULL)
             {
             {
-			    *isDir = (thispath[pathlen] == '/');
-    			if (*isDir)
+                *isDir = (thispath[pathlen] == '/');
+                if (*isDir)
                     return(NULL);
                     return(NULL);
             } /* if */
             } /* if */
 
 
             if (thispath[pathlen] == '\0') /* found entry? */
             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)
     if (isDir != NULL)
         *isDir = 0;
         *isDir = 0;
@@ -1024,31 +1026,31 @@ static int zip_parse_end_of_central_dir(void *in, DirHandle *dirh,
     /* find the end-of-central-dir record, and seek to it. */
     /* find the end-of-central-dir record, and seek to it. */
     pos = zip_find_end_of_central_dir(in, &len);
     pos = zip_find_end_of_central_dir(in, &len);
     BAIL_IF_MACRO(pos == -1, NULL, 0);
     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. */
     /* check signature again, just in case. */
     BAIL_IF_MACRO(!readui32(in, &ui32), NULL, 0);
     BAIL_IF_MACRO(!readui32(in, &ui32), NULL, 0);
     BAIL_IF_MACRO(ui32 != ZIP_END_OF_CENTRAL_DIR_SIG, ERR_NOT_AN_ARCHIVE, 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(!readui16(in, &ui16), NULL, 0);
     BAIL_IF_MACRO(ui16 != 0, ERR_UNSUPPORTED_ARCHIVE, 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(!readui16(in, &ui16), NULL, 0);
     BAIL_IF_MACRO(ui16 != 0, ERR_UNSUPPORTED_ARCHIVE, 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);
     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(!readui16(in, &zipinfo->entryCount), NULL, 0);
     BAIL_IF_MACRO(ui16 != zipinfo->entryCount, ERR_UNSUPPORTED_ARCHIVE, 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);
     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(!readui32(in, central_dir_ofs), NULL, 0);
     BAIL_IF_MACRO(pos < *central_dir_ofs + ui32, ERR_UNSUPPORTED_ARCHIVE, 0);
     BAIL_IF_MACRO(pos < *central_dir_ofs + ui32, ERR_UNSUPPORTED_ARCHIVE, 0);
 
 
@@ -1060,12 +1062,12 @@ static int zip_parse_end_of_central_dir(void *in, DirHandle *dirh,
      *  sizeof central dir)...the difference in bytes is how much arbitrary
      *  sizeof central dir)...the difference in bytes is how much arbitrary
      *  data is at the start of the physical file.
      *  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... */
     /* Now that we know the difference, fix up the central dir offset... */
     *central_dir_ofs += *data_start;
     *central_dir_ofs += *data_start;
 
 
-	/* zipfile comment length */
+    /* zipfile comment length */
     BAIL_IF_MACRO(!readui16(in, &ui16), NULL, 0);
     BAIL_IF_MACRO(!readui16(in, &ui16), NULL, 0);
 
 
     /*
     /*