diff --git a/src/network/network.cpp b/src/network/network.cpp index 0b7657ff9a..925fc667ce 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -1278,13 +1278,22 @@ void Network::Server_Send_MAP(NetworkConnection* connection) size_t chunksize = 1000; size_t out_size; unsigned char *compressed = util_zlib_deflate(&buffer[0], size, &out_size); - unsigned char *header = (unsigned char *)_strdup("open2_sv6_zlib"); - size_t header_len = strlen((char *)header) + 1; // account for null terminator - header = (unsigned char *)realloc(header, header_len + out_size); - memcpy(&header[header_len], compressed, out_size); - out_size += header_len; - free(compressed); - log_verbose("Sending map of size %u bytes, compressed to %u bytes", size, out_size); + unsigned char *header; + if (compressed != NULL) + { + header = (unsigned char *)_strdup("open2_sv6_zlib"); + size_t header_len = strlen((char *)header) + 1; // account for null terminator + header = (unsigned char *)realloc(header, header_len + out_size); + memcpy(&header[header_len], compressed, out_size); + out_size += header_len; + free(compressed); + log_verbose("Sending map of size %u bytes, compressed to %u bytes", size, out_size); + } else { + log_warning("Failed to compress the data, falling back to non-compressed sv6."); + header = (unsigned char *)malloc(size); + out_size = size; + memcpy(header, &buffer[0], size); + } for (size_t i = 0; i < out_size; i += chunksize) { int datasize = (std::min)(chunksize, out_size - i); std::unique_ptr packet = std::move(NetworkPacket::Allocate()); diff --git a/src/util/util.c b/src/util/util.c index d2f2b35d5a..d41ab40cd4 100644 --- a/src/util/util.c +++ b/src/util/util.c @@ -347,6 +347,10 @@ unsigned char *util_zlib_inflate(unsigned char *data, size_t data_in_size, size_ buffer_size *= 2; out_size = buffer_size; buffer = realloc(buffer, 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 NULL; } ret = uncompress(buffer, &out_size, data, data_in_size); } while (ret != Z_OK); @@ -377,12 +381,8 @@ unsigned char *util_zlib_deflate(unsigned char *data, size_t data_in_size, size_ buffer = realloc(buffer, buffer_size); } else if (ret == Z_STREAM_ERROR) { log_error("Your build is shipped with broken zlib. Please use the official build."); - log_error("Falling back to non-compressed sv6."); - buffer = realloc(buffer, data_in_size); - memcpy(buffer, data, data_in_size); - out_size = data_in_size; - ret = Z_OK; - break; + free(buffer); + return NULL; } ret = compress(buffer, &out_size, data, data_in_size); } while (ret != Z_OK);