Fixed infinite loop bug, cleaned out tab chars.
This commit is contained in:
parent
b28af63f2f
commit
ee077eabec
|
@ -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 pathlen = strlen(path);
|
||||||
PHYSFS_sint32 lo = 0;
|
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);
|
middle = lo + ((hi - lo) / 2);
|
||||||
thispath = a[middle].name;
|
thispath = a[middle].name;
|
||||||
rc = strncmp(path, thispath, pathlen);
|
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] == '/');
|
*isDir = (thispath[pathlen] == '/');
|
||||||
if (*isDir)
|
if (*isDir)
|
||||||
return(NULL);
|
return(NULL);
|
||||||
} /* if */
|
} /* if */
|
||||||
|
|
||||||
if (thispath[pathlen] == '\0') /* found entry? */
|
if (thispath[pathlen] == '\0') /* found entry? */
|
||||||
return(&a[middle]);
|
return(&a[middle]);
|
||||||
} /* else */
|
else
|
||||||
} /* while */
|
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);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in New Issue