mirror of
https://github.com/RPCS3/rpcs3.git
synced 2026-03-27 22:02:25 -06:00
static analysis: fix memory leak in decompress
Some checks are pending
Build RPCS3 / RPCS3 Linux ${{ matrix.os }} ${{ matrix.compiler }} (/rpcs3/.ci/build-linux.sh, gcc, rpcs3/rpcs3-ci-jammy:1.1, ubuntu-24.04) (push) Waiting to run
Build RPCS3 / RPCS3 Linux ${{ matrix.os }} ${{ matrix.compiler }} (a1d35836e8d45bfc6f63c26f0a3e5d46ef622fe1, rpcs3/rpcs3-binaries-linux-arm64, /rpcs3/.ci/build-linux-aarch64.sh, clang, rpcs3/rpcs3-ci-jammy-aarch64:1.1, ubuntu-24.04-arm) (push) Waiting to run
Build RPCS3 / RPCS3 Linux ${{ matrix.os }} ${{ matrix.compiler }} (d812f1254a1157c80fd402f94446310560f54e5f, rpcs3/rpcs3-binaries-linux, /rpcs3/.ci/build-linux.sh, clang, rpcs3/rpcs3-ci-jammy:1.1, ubuntu-24.04) (push) Waiting to run
Build RPCS3 / RPCS3 Windows (push) Waiting to run
Some checks are pending
Build RPCS3 / RPCS3 Linux ${{ matrix.os }} ${{ matrix.compiler }} (/rpcs3/.ci/build-linux.sh, gcc, rpcs3/rpcs3-ci-jammy:1.1, ubuntu-24.04) (push) Waiting to run
Build RPCS3 / RPCS3 Linux ${{ matrix.os }} ${{ matrix.compiler }} (a1d35836e8d45bfc6f63c26f0a3e5d46ef622fe1, rpcs3/rpcs3-binaries-linux-arm64, /rpcs3/.ci/build-linux-aarch64.sh, clang, rpcs3/rpcs3-ci-jammy-aarch64:1.1, ubuntu-24.04-arm) (push) Waiting to run
Build RPCS3 / RPCS3 Linux ${{ matrix.os }} ${{ matrix.compiler }} (d812f1254a1157c80fd402f94446310560f54e5f, rpcs3/rpcs3-binaries-linux, /rpcs3/.ci/build-linux.sh, clang, rpcs3/rpcs3-ci-jammy:1.1, ubuntu-24.04) (push) Waiting to run
Build RPCS3 / RPCS3 Windows (push) Waiting to run
This commit is contained in:
parent
ca3d02fc61
commit
ba12de867e
@ -3,6 +3,7 @@
|
||||
// http://www.gnu.org/licenses/gpl-2.0.txt
|
||||
|
||||
#include <string.h>
|
||||
#include <vector>
|
||||
#include "lz.h"
|
||||
|
||||
void decode_range(unsigned int *range, unsigned int *code, unsigned char **src)
|
||||
@ -123,19 +124,17 @@ int decompress(unsigned char *out, unsigned char *in, unsigned int size)
|
||||
{
|
||||
int result;
|
||||
|
||||
unsigned char *tmp = new unsigned char[0xCC8];
|
||||
|
||||
int offset = 0;
|
||||
int bit_flag = 0;
|
||||
int data_length = 0;
|
||||
int data_offset = 0;
|
||||
|
||||
unsigned char *tmp_sect1, *tmp_sect2, *tmp_sect3;
|
||||
unsigned char *buf_start, *buf_end;
|
||||
const unsigned char *buf_start, *buf_end;
|
||||
unsigned char prev = 0;
|
||||
|
||||
unsigned char *start = out;
|
||||
unsigned char *end = (out + size);
|
||||
const unsigned char *end = (out + size);
|
||||
unsigned char head = in[0];
|
||||
|
||||
unsigned int range = 0xFFFFFFFF;
|
||||
@ -154,6 +153,8 @@ int decompress(unsigned char *out, unsigned char *in, unsigned int size)
|
||||
else
|
||||
{
|
||||
// Set up a temporary buffer (sliding window).
|
||||
std::vector<unsigned char> tmp_vec(0xCC8);
|
||||
unsigned char* tmp = tmp_vec.data();
|
||||
memset(tmp, 0x80, 0xCA8);
|
||||
while (true)
|
||||
{
|
||||
@ -254,14 +255,12 @@ int decompress(unsigned char *out, unsigned char *in, unsigned int size)
|
||||
// Underflow.
|
||||
if (buf_start < out)
|
||||
{
|
||||
delete[] tmp;
|
||||
return -1;
|
||||
}
|
||||
|
||||
// Overflow.
|
||||
if (buf_end > end)
|
||||
{
|
||||
delete[] tmp;
|
||||
return -1;
|
||||
}
|
||||
|
||||
@ -279,6 +278,5 @@ int decompress(unsigned char *out, unsigned char *in, unsigned int size)
|
||||
}
|
||||
result = static_cast<int>(start - out);
|
||||
}
|
||||
delete[] tmp;
|
||||
return result;
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user