diff --git a/src/openrct2/network/Network.cpp b/src/openrct2/network/Network.cpp index 2aaf8586a1..d3c8e4562c 100644 --- a/src/openrct2/network/Network.cpp +++ b/src/openrct2/network/Network.cpp @@ -1625,9 +1625,10 @@ uint8_t* Network::save_for_network(size_t& out_size, const std::vector(data), size, &out_size); - if (compressed != nullptr) + auto compressed = util_zlib_deflate(static_cast(data), size); + if (compressed != std::nullopt) { + out_size = compressed->size(); header = reinterpret_cast(_strdup("open2_sv6_zlib")); size_t header_len = strlen(reinterpret_cast(header)) + 1; // account for null terminator header = static_cast(realloc(header, header_len + out_size)); @@ -1637,11 +1638,10 @@ uint8_t* Network::save_for_network(size_t& out_size, const std::vectordata(), out_size); out_size += header_len; log_verbose("Sending map of size %u bytes, compressed to %u bytes", size, out_size); } - free(compressed); } else { diff --git a/src/openrct2/util/Util.cpp b/src/openrct2/util/Util.cpp index 46726c5fa1..d7e513e725 100644 --- a/src/openrct2/util/Util.cpp +++ b/src/openrct2/util/Util.cpp @@ -586,34 +586,30 @@ uint8_t* util_zlib_inflate(uint8_t* data, size_t data_in_size, size_t* data_out_ * @brief Deflates input using zlib * @param data Data to be compressed * @param data_in_size Size of data to be compressed - * @param data_out_size Pointer to a variable where output size will be written - * @return Returns a pointer to memory holding compressed data or NULL on failure. - * @note It is caller's responsibility to free() the returned pointer once done with it. + * @return Returns an optional std::vector of bytes, which is equal to std::nullopt when deflate has failed */ -uint8_t* util_zlib_deflate(const uint8_t* data, size_t data_in_size, size_t* data_out_size) +std::optional> util_zlib_deflate(const uint8_t* data, size_t data_in_size) { int32_t ret = Z_OK; - uLongf out_size = static_cast(*data_out_size); + uLongf out_size = 0; uLong buffer_size = compressBound(static_cast(data_in_size)); - uint8_t* buffer = static_cast(malloc(buffer_size)); + std::vector buffer(buffer_size); do { if (ret == Z_BUF_ERROR) { buffer_size *= 2; out_size = buffer_size; - buffer = static_cast(realloc(buffer, buffer_size)); + buffer.resize(buffer_size); } else if (ret == Z_STREAM_ERROR) { log_error("Your build is shipped with broken zlib. Please use the official build."); - free(buffer); - return nullptr; + return std::nullopt; } - ret = compress(buffer, &out_size, data, static_cast(data_in_size)); + ret = compress(buffer.data(), &out_size, data, static_cast(data_in_size)); } while (ret != Z_OK); - *data_out_size = out_size; - buffer = static_cast(realloc(buffer, *data_out_size)); + buffer.resize(out_size); return buffer; } diff --git a/src/openrct2/util/Util.h b/src/openrct2/util/Util.h index ec046e8036..997de6e03b 100644 --- a/src/openrct2/util/Util.h +++ b/src/openrct2/util/Util.h @@ -14,6 +14,8 @@ #include #include +#include +#include int32_t squaredmetres_to_squaredfeet(int32_t squaredMetres); int32_t metres_to_feet(int32_t metres); @@ -52,7 +54,7 @@ bool str_is_null_or_empty(const char* str); uint32_t util_rand(); -uint8_t* util_zlib_deflate(const uint8_t* data, size_t data_in_size, size_t* data_out_size); +std::optional> util_zlib_deflate(const uint8_t* data, size_t data_in_size); uint8_t* util_zlib_inflate(uint8_t* data, size_t data_in_size, size_t* data_out_size); bool util_gzip_compress(FILE* source, FILE* dest);