mirror of
https://github.com/yquake2/yquake2remaster.git
synced 2024-11-26 14:30:48 +00:00
filesystem: fix compressed buffer allocation
This commit is contained in:
parent
d0c98f5bab
commit
e534f9e2b3
1 changed files with 33 additions and 5 deletions
|
@ -726,23 +726,31 @@ int
|
||||||
FS_Read(void *buffer, int size, fileHandle_t f)
|
FS_Read(void *buffer, int size, fileHandle_t f)
|
||||||
{
|
{
|
||||||
qboolean tried = false; /* Tried to read from a CD. */
|
qboolean tried = false; /* Tried to read from a CD. */
|
||||||
byte *buf; /* Buffer. */
|
byte *buf, *compressed_buf; /* Buffer. */
|
||||||
int r; /* Number of bytes read. */
|
int r; /* Number of bytes read. */
|
||||||
int remaining; /* Remaining bytes. */
|
int remaining; /* Remaining bytes. */
|
||||||
fsHandle_t *handle; /* File handle. */
|
fsHandle_t *handle; /* File handle. */
|
||||||
|
|
||||||
handle = FS_GetFileByHandle(f);
|
handle = FS_GetFileByHandle(f);
|
||||||
|
|
||||||
|
buf = (byte *)buffer;
|
||||||
|
compressed_buf = (byte *)buffer;
|
||||||
|
|
||||||
/* Read. */
|
/* Read. */
|
||||||
if (handle->compressed_size)
|
if (handle->compressed_size)
|
||||||
{
|
{
|
||||||
remaining = handle->compressed_size;
|
remaining = handle->compressed_size;
|
||||||
|
if (size < handle->compressed_size)
|
||||||
|
{
|
||||||
|
/* compressed chunk bigger than provided buffer */
|
||||||
|
compressed_buf = malloc(handle->compressed_size);
|
||||||
|
buf = compressed_buf;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
remaining = size;
|
remaining = size;
|
||||||
}
|
}
|
||||||
buf = (byte *)buffer;
|
|
||||||
|
|
||||||
while (remaining)
|
while (remaining)
|
||||||
{
|
{
|
||||||
|
@ -784,7 +792,13 @@ FS_Read(void *buffer, int size, fileHandle_t f)
|
||||||
buf += r;
|
buf += r;
|
||||||
}
|
}
|
||||||
|
|
||||||
return FS_DecompressFile(buffer, size, handle);
|
remaining = FS_DecompressFile(compressed_buf, size, handle);
|
||||||
|
if (buffer != compressed_buf)
|
||||||
|
{
|
||||||
|
memcpy(buffer, compressed_buf, size);
|
||||||
|
free(compressed_buf);
|
||||||
|
}
|
||||||
|
return remaining;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -795,7 +809,7 @@ int
|
||||||
FS_FRead(void *buffer, int size, int count, fileHandle_t f)
|
FS_FRead(void *buffer, int size, int count, fileHandle_t f)
|
||||||
{
|
{
|
||||||
qboolean tried = false; /* Tried to read from a CD. */
|
qboolean tried = false; /* Tried to read from a CD. */
|
||||||
byte *buf; /* Buffer. */
|
byte *buf, *compressed_buf; /* Buffer. */
|
||||||
int loops; /* Loop indicator. */
|
int loops; /* Loop indicator. */
|
||||||
int r; /* Number of bytes read. */
|
int r; /* Number of bytes read. */
|
||||||
int remaining; /* Remaining bytes. */
|
int remaining; /* Remaining bytes. */
|
||||||
|
@ -806,6 +820,14 @@ FS_FRead(void *buffer, int size, int count, fileHandle_t f)
|
||||||
/* Read. */
|
/* Read. */
|
||||||
loops = count;
|
loops = count;
|
||||||
buf = (byte *)buffer;
|
buf = (byte *)buffer;
|
||||||
|
compressed_buf = (byte *)buffer;
|
||||||
|
|
||||||
|
if (handle->compressed_size && size < handle->compressed_size)
|
||||||
|
{
|
||||||
|
/* compressed chunk bigger than provided buffer */
|
||||||
|
compressed_buf = malloc(handle->compressed_size);
|
||||||
|
buf = compressed_buf;
|
||||||
|
}
|
||||||
|
|
||||||
while (loops)
|
while (loops)
|
||||||
{
|
{
|
||||||
|
@ -861,7 +883,13 @@ FS_FRead(void *buffer, int size, int count, fileHandle_t f)
|
||||||
loops--;
|
loops--;
|
||||||
}
|
}
|
||||||
|
|
||||||
return FS_DecompressFile(buffer, size, handle);
|
remaining = FS_DecompressFile(compressed_buf, size, handle);
|
||||||
|
if (buffer != compressed_buf)
|
||||||
|
{
|
||||||
|
memcpy(buffer, compressed_buf, size);
|
||||||
|
free(compressed_buf);
|
||||||
|
}
|
||||||
|
return remaining;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in a new issue