mirror of
https://github.com/ZDoom/gzdoom-gles.git
synced 2024-11-24 05:01:41 +00:00
- Fixed misaligned pointer access error in zipdir.
It happens if zipdir is compiled with GCC/Clang UBSan and is run on an already existing zdoom.pk3.
This commit is contained in:
parent
72edd7d455
commit
a65b0d7d4c
1 changed files with 9 additions and 5 deletions
|
@ -232,6 +232,9 @@ int Quiet;
|
||||||
|
|
||||||
// PRIVATE DATA DEFINITIONS ------------------------------------------------
|
// PRIVATE DATA DEFINITIONS ------------------------------------------------
|
||||||
|
|
||||||
|
static const UINT32 centralfile = ZIP_CENTRALFILE;
|
||||||
|
static const UINT32 endofdir = ZIP_ENDOFDIR;
|
||||||
|
|
||||||
static int no_mem;
|
static int no_mem;
|
||||||
|
|
||||||
static ISzAlloc Alloc = { SzAlloc, SzFree };
|
static ISzAlloc Alloc = { SzAlloc, SzFree };
|
||||||
|
@ -1305,7 +1308,8 @@ int compress_ppmd(Byte *out, unsigned int *outlen, const Byte *in, unsigned int
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
*(short *)out = LittleShort((maxorder - 1) + ((sasize - 1) << 4) + (cutoff << 12));
|
const short outval = LittleShort((maxorder - 1) + ((sasize - 1) << 4) + (cutoff << 12));
|
||||||
|
memcpy(out, (const Byte *)&outval, sizeof(short));
|
||||||
*outlen = *outlen - ppsout.buffersize;
|
*outlen = *outlen - ppsout.buffersize;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -1420,12 +1424,12 @@ BYTE *find_central_dir(FILE *fin)
|
||||||
free(dir);
|
free(dir);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
if (*(UINT32 *)dir != ZIP_CENTRALFILE)
|
if (memcmp(dir, (const BYTE *)¢ralfile, sizeof(UINT32)) != 0)
|
||||||
{
|
{
|
||||||
free(dir);
|
free(dir);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
*(UINT32 *)(dir + LittleLong(eod.DirectorySize)) = ZIP_ENDOFDIR;
|
memcpy(dir + LittleLong(eod.DirectorySize), (const BYTE *)&endofdir, sizeof(UINT32));
|
||||||
return dir;
|
return dir;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1444,7 +1448,7 @@ CentralDirectoryEntry *find_file_in_zip(BYTE *dir, const char *path, unsigned in
|
||||||
CentralDirectoryEntry *ent;
|
CentralDirectoryEntry *ent;
|
||||||
int flags;
|
int flags;
|
||||||
|
|
||||||
while (*(UINT32 *)dir == ZIP_CENTRALFILE)
|
while (memcmp(dir, (const BYTE *)¢ralfile, sizeof(UINT32)) == 0)
|
||||||
{
|
{
|
||||||
ent = (CentralDirectoryEntry *)dir;
|
ent = (CentralDirectoryEntry *)dir;
|
||||||
if (pathlen == LittleShort(ent->NameLength) &&
|
if (pathlen == LittleShort(ent->NameLength) &&
|
||||||
|
@ -1455,7 +1459,7 @@ CentralDirectoryEntry *find_file_in_zip(BYTE *dir, const char *path, unsigned in
|
||||||
}
|
}
|
||||||
dir += sizeof(*ent) + LittleShort(ent->NameLength) + LittleShort(ent->ExtraLength) + LittleShort(ent->CommentLength);
|
dir += sizeof(*ent) + LittleShort(ent->NameLength) + LittleShort(ent->ExtraLength) + LittleShort(ent->CommentLength);
|
||||||
}
|
}
|
||||||
if (*(UINT32 *)dir != ZIP_CENTRALFILE)
|
if (memcmp(dir, (const BYTE *)¢ralfile, sizeof(UINT32)) != 0)
|
||||||
{
|
{
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue