Mercurial > hg > orthanc
changeset 6665:f2b978accde2 machine-spirits
use option "MaximumFileSizeInArchiveMB" for gzip decompression
| author | Sebastien Jodogne <s.jodogne@gmail.com> |
|---|---|
| date | Mon, 23 Mar 2026 08:05:26 +0100 |
| parents | 14eabda1f718 |
| children | 91d41f1b3b73 |
| files | NEWS OrthancFramework/Sources/Compression/GzipCompressor.cpp OrthancFramework/Sources/Compression/GzipCompressor.h OrthancFramework/Sources/Compression/ZipReader.cpp OrthancServer/Sources/main.cpp |
| diffstat | 5 files changed, 40 insertions(+), 6 deletions(-) [+] |
line wrap: on
line diff
--- a/NEWS Mon Mar 23 07:54:13 2026 +0100 +++ b/NEWS Mon Mar 23 08:05:26 2026 +0100 @@ -4,7 +4,8 @@ General ------- -* New configuration option "MaximumRequestBodySizeMB" to limit the maximum body size in HTTP requests +* New configuration option "MaximumRequestBodySizeMB" to limit the body size in HTTP requests +* New configuration option "MaximumFileSizeInArchiveMB" to limit the file size in ZIP/gzip archives * New experimental configuration "PatientLevelEnabled" (TODO: work in progree) REST API
--- a/OrthancFramework/Sources/Compression/GzipCompressor.cpp Mon Mar 23 07:54:13 2026 +0100 +++ b/OrthancFramework/Sources/Compression/GzipCompressor.cpp Mon Mar 23 08:05:26 2026 +0100 @@ -30,8 +30,15 @@ #include <zlib.h> #include "../ChunkedBuffer.h" +#include "../Logging.h" +#include "../MultiThreading/ReaderWriterLock.h" #include "../OrthancException.h" -#include "../Logging.h" + + +static Orthanc::ReaderWriterLock maximumUncompressedFileSizeMutex_; +static bool hasMaximumUncompressedFileSize_ = false; +static size_t maximumUncompressedFileSize_ = 0; + namespace Orthanc { @@ -224,7 +231,13 @@ } else { - // TODO + ReaderWriterLock::ReadLock lock(maximumUncompressedFileSizeMutex_); + + if (hasMaximumUncompressedFileSize_) + { + hasMaximumSize = true; + maximumSize = maximumUncompressedFileSize_; + } } z_stream stream; @@ -302,4 +315,19 @@ buffer.Flatten(uncompressed); } + + + void GzipCompressor::SetMaximumUncompressedFileSize(uint64_t size) + { + if (static_cast<uint64_t>(static_cast<size_t>(size)) != size) + { + throw OrthancException(ErrorCode_NotEnoughMemory); + } + else + { + ReaderWriterLock::WriteLock lock(maximumUncompressedFileSizeMutex_); + hasMaximumUncompressedFileSize_ = true; + maximumUncompressedFileSize_ = size; + } + } }
--- a/OrthancFramework/Sources/Compression/GzipCompressor.h Mon Mar 23 07:54:13 2026 +0100 +++ b/OrthancFramework/Sources/Compression/GzipCompressor.h Mon Mar 23 08:05:26 2026 +0100 @@ -45,5 +45,7 @@ virtual void Uncompress(std::string& uncompressed, const void* compressed, size_t compressedSize) ORTHANC_OVERRIDE; + + static void SetMaximumUncompressedFileSize(uint64_t size); }; }
--- a/OrthancFramework/Sources/Compression/ZipReader.cpp Mon Mar 23 07:54:13 2026 +0100 +++ b/OrthancFramework/Sources/Compression/ZipReader.cpp Mon Mar 23 08:05:26 2026 +0100 @@ -68,7 +68,7 @@ #include <string.h> -static Orthanc::ReaderWriterLock mutex_; +static Orthanc::ReaderWriterLock maximumUncompressedFileSizeMutex_; static bool hasMaximumUncompressedFileSize_ = false; static size_t maximumUncompressedFileSize_ = 0; @@ -419,7 +419,7 @@ { // Prevent ZIP bombs - ReaderWriterLock::ReadLock lock(mutex_); + ReaderWriterLock::ReadLock lock(maximumUncompressedFileSizeMutex_); if (hasMaximumUncompressedFileSize_ && info.uncompressed_size > maximumUncompressedFileSize_) @@ -535,7 +535,7 @@ } else { - ReaderWriterLock::WriteLock lock(mutex_); + ReaderWriterLock::WriteLock lock(maximumUncompressedFileSizeMutex_); hasMaximumUncompressedFileSize_ = true; maximumUncompressedFileSize_ = size; }
--- a/OrthancServer/Sources/main.cpp Mon Mar 23 07:54:13 2026 +0100 +++ b/OrthancServer/Sources/main.cpp Mon Mar 23 08:05:26 2026 +0100 @@ -25,6 +25,7 @@ #include "OrthancRestApi/OrthancRestApi.h" #include "../../OrthancFramework/Sources/Compatibility.h" +#include "../../OrthancFramework/Sources/Compression/GzipCompressor.h" #include "../../OrthancFramework/Sources/Compression/ZipReader.h" #include "../../OrthancFramework/Sources/DicomFormat/DicomArray.h" #include "../../OrthancFramework/Sources/DicomNetworking/DicomAssociationParameters.h" @@ -1146,6 +1147,8 @@ LOG(WARNING) << "Limiting on the maximum file size uncompressed from ZIP/gzip archives to " << maxSizeInArchive << "MB"; ZipReader::SetMaximumUncompressedFileSize(static_cast<uint64_t>(maxSizeInArchive) * static_cast<uint64_t>(1024 * 1024)); + GzipCompressor::SetMaximumUncompressedFileSize(static_cast<uint64_t>(maxSizeInArchive) * + static_cast<uint64_t>(1024 * 1024)); } else {
