# HG changeset patch # User Sebastien Jodogne # Date 1584469188 -3600 # Node ID 74889e6f6d6805ef6f2d159c7acd903ef682e94f # Parent eb044cc49d510837cc76cbc51be32ac5002323ee fix memory issues if parsing invalid DICOM file diff -r eb044cc49d51 -r 74889e6f6d68 Core/DicomFormat/DicomMap.cpp --- a/Core/DicomFormat/DicomMap.cpp Tue Mar 17 16:36:14 2020 +0100 +++ b/Core/DicomFormat/DicomMap.cpp Tue Mar 17 19:19:48 2020 +0100 @@ -745,9 +745,8 @@ } - bool DicomMap::ParseDicomMetaInformation(DicomMap& result, - const char* dicom, - size_t size) + bool DicomMap::IsDicomFile(const char* dicom, + size_t size) { /** * http://dicom.nema.org/medical/dicom/current/output/chtml/part10/chapter_7.html @@ -756,11 +755,19 @@ * account to determine whether the file is or is not a DICOM file. **/ - if (size < 132 || - dicom[128] != 'D' || - dicom[129] != 'I' || - dicom[130] != 'C' || - dicom[131] != 'M') + return (size >= 132 && + dicom[128] == 'D' && + dicom[129] == 'I' && + dicom[130] == 'C' && + dicom[131] == 'M'); + } + + + bool DicomMap::ParseDicomMetaInformation(DicomMap& result, + const char* dicom, + size_t size) + { + if (!IsDicomFile(dicom, size)) { return false; } diff -r eb044cc49d51 -r 74889e6f6d68 Core/DicomFormat/DicomMap.h --- a/Core/DicomFormat/DicomMap.h Tue Mar 17 16:36:14 2020 +0100 +++ b/Core/DicomFormat/DicomMap.h Tue Mar 17 19:19:48 2020 +0100 @@ -180,6 +180,9 @@ void GetTags(std::set& tags) const; + static bool IsDicomFile(const char* dicom, + size_t size); + static bool ParseDicomMetaInformation(DicomMap& result, const char* dicom, size_t size); diff -r eb044cc49d51 -r 74889e6f6d68 Core/DicomParsing/FromDcmtkBridge.cpp --- a/Core/DicomParsing/FromDcmtkBridge.cpp Tue Mar 17 16:36:14 2020 +0100 +++ b/Core/DicomParsing/FromDcmtkBridge.cpp Tue Mar 17 19:19:48 2020 +0100 @@ -1879,7 +1879,15 @@ std::unique_ptr result(new DcmFileFormat); result->transferInit(); - if (!result->read(is).good()) + + /** + * New in Orthanc 1.6.0: The "size" is given as an argument to the + * "read()" method. This can avoid huge memory consumption if + * parsing an invalid DICOM file, which can notably been observed + * by executing the integration test "test_upload_compressed" on + * valgrind running Orthanc. + **/ + if (!result->read(is, EXS_Unknown, EGL_noChange, size).good()) { throw OrthancException(ErrorCode_BadFileFormat, "Cannot parse an invalid DICOM file (size: " +