Browse Source

Fix PoolByteArray.decompress_dynamic return value and memleak

(cherry picked from commit de47cb0c5b137e4aa047baa6e0d0fd76f0be1efd)
Haoyu Qiu 3 năm trước cách đây
mục cha
commit
4ab57389a5
1 tập tin đã thay đổi với 4 bổ sung4 xóa
  1. 4 4
      core/variant_call.cpp

+ 4 - 4
core/variant_call.cpp

@@ -652,17 +652,17 @@ struct _VariantCall {
 
 
 	static void _call_PoolByteArray_decompress_dynamic(Variant &r_ret, Variant &p_self, const Variant **p_args) {
 	static void _call_PoolByteArray_decompress_dynamic(Variant &r_ret, Variant &p_self, const Variant **p_args) {
 		PoolByteArray *ba = reinterpret_cast<PoolByteArray *>(p_self._data._mem);
 		PoolByteArray *ba = reinterpret_cast<PoolByteArray *>(p_self._data._mem);
-		PoolByteArray *decompressed = memnew(PoolByteArray);
+		PoolByteArray decompressed;
 		int max_output_size = (int)(*p_args[0]);
 		int max_output_size = (int)(*p_args[0]);
 		Compression::Mode mode = (Compression::Mode)(int)(*p_args[1]);
 		Compression::Mode mode = (Compression::Mode)(int)(*p_args[1]);
 
 
-		decompressed->resize(1024);
-		int result = Compression::decompress_dynamic(decompressed, max_output_size, ba->read().ptr(), ba->size(), mode);
+		decompressed.resize(1024);
+		int result = Compression::decompress_dynamic(&decompressed, max_output_size, ba->read().ptr(), ba->size(), mode);
 
 
 		if (result == OK) {
 		if (result == OK) {
 			r_ret = decompressed;
 			r_ret = decompressed;
 		} else {
 		} else {
-			decompressed->resize(0);
+			decompressed.resize(0);
 			r_ret = decompressed;
 			r_ret = decompressed;
 			ERR_FAIL_MSG("Decompression failed.");
 			ERR_FAIL_MSG("Decompression failed.");
 		}
 		}