From ee077eabec9d864d5118ddf232a02af8c3fb7a10 Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Fri, 30 Aug 2002 14:30:49 +0000 Subject: [PATCH] Fixed infinite loop bug, cleaned out tab chars. --- archivers/zip.c | 46 ++++++++++++++++++++++++---------------------- 1 file changed, 24 insertions(+), 22 deletions(-) diff --git a/archivers/zip.c b/archivers/zip.c index 96363c1f..75d5188b 100644 --- a/archivers/zip.c +++ b/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) { 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 @@ static ZIPentry *zip_find_entry(ZIPinfo *info, const char *path, int *isDir) 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 @@ static int zip_parse_end_of_central_dir(void *in, DirHandle *dirh, /* 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 @@ static int zip_parse_end_of_central_dir(void *in, DirHandle *dirh, * 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); /*