static analysis: fix memory leak in decompress
Some checks are pending
Build RPCS3 / RPCS3 Linux ubuntu-24.04 gcc (push) Waiting to run
Build RPCS3 / RPCS3 Linux ubuntu-24.04-arm clang (push) Waiting to run
Build RPCS3 / RPCS3 Linux ubuntu-24.04 clang (push) Waiting to run
Build RPCS3 / RPCS3 Windows (push) Waiting to run

This commit is contained in:
Megamouse 2025-03-04 19:45:46 +01:00
parent ca3d02fc61
commit ba12de867e

View file

@ -3,6 +3,7 @@
// http://www.gnu.org/licenses/gpl-2.0.txt // http://www.gnu.org/licenses/gpl-2.0.txt
#include <string.h> #include <string.h>
#include <vector>
#include "lz.h" #include "lz.h"
void decode_range(unsigned int *range, unsigned int *code, unsigned char **src) 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; int result;
unsigned char *tmp = new unsigned char[0xCC8];
int offset = 0; int offset = 0;
int bit_flag = 0; int bit_flag = 0;
int data_length = 0; int data_length = 0;
int data_offset = 0; int data_offset = 0;
unsigned char *tmp_sect1, *tmp_sect2, *tmp_sect3; 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 prev = 0;
unsigned char *start = out; unsigned char *start = out;
unsigned char *end = (out + size); const unsigned char *end = (out + size);
unsigned char head = in[0]; unsigned char head = in[0];
unsigned int range = 0xFFFFFFFF; unsigned int range = 0xFFFFFFFF;
@ -154,6 +153,8 @@ int decompress(unsigned char *out, unsigned char *in, unsigned int size)
else else
{ {
// Set up a temporary buffer (sliding window). // Set up a temporary buffer (sliding window).
std::vector<unsigned char> tmp_vec(0xCC8);
unsigned char* tmp = tmp_vec.data();
memset(tmp, 0x80, 0xCA8); memset(tmp, 0x80, 0xCA8);
while (true) while (true)
{ {
@ -254,14 +255,12 @@ int decompress(unsigned char *out, unsigned char *in, unsigned int size)
// Underflow. // Underflow.
if (buf_start < out) if (buf_start < out)
{ {
delete[] tmp;
return -1; return -1;
} }
// Overflow. // Overflow.
if (buf_end > end) if (buf_end > end)
{ {
delete[] tmp;
return -1; return -1;
} }
@ -279,6 +278,5 @@ int decompress(unsigned char *out, unsigned char *in, unsigned int size)
} }
result = static_cast<int>(start - out); result = static_cast<int>(start - out);
} }
delete[] tmp;
return result; return result;
} }