From 2fb7534cf357be756a6c1575ad0c79d130e498ac Mon Sep 17 00:00:00 2001 From: Megamouse Date: Tue, 4 Mar 2025 19:45:46 +0100 Subject: [PATCH] static analysis: fix memory leak in decompress --- rpcs3/Crypto/lz.cpp | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/rpcs3/Crypto/lz.cpp b/rpcs3/Crypto/lz.cpp index 30e201c5f5..f8a5aa0101 100644 --- a/rpcs3/Crypto/lz.cpp +++ b/rpcs3/Crypto/lz.cpp @@ -3,6 +3,7 @@ // http://www.gnu.org/licenses/gpl-2.0.txt #include +#include #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 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(start - out); } - delete[] tmp; return result; }