view OrthancFramework/Resources/Patches/dcmtk-3.6.5.patch @ 4289:dd17d37ad950

backporting a patch for DCMTK 3.6.5 to resolve a bad memory access in C-GET SCP
author Sebastien Jodogne <s.jodogne@gmail.com>
date Wed, 04 Nov 2020 18:34:44 +0100
parents d25f4c0fa160
children
line wrap: on
line source

diff -urEb dcmtk-3.6.5.orig/CMake/GenerateDCMTKConfigure.cmake dcmtk-3.6.5/CMake/GenerateDCMTKConfigure.cmake
--- dcmtk-3.6.5.orig/CMake/GenerateDCMTKConfigure.cmake	2020-11-04 18:27:08.984662119 +0100
+++ dcmtk-3.6.5/CMake/GenerateDCMTKConfigure.cmake	2020-11-04 18:27:48.232609773 +0100
@@ -169,6 +169,8 @@
 endif()
 
 # Check the sizes of various types
+if (NOT CMAKE_SYSTEM_NAME STREQUAL "Emscripten")
+  # This doesn't work for wasm, Orthanc defines the macros manually
 include (CheckTypeSize)
 CHECK_TYPE_SIZE("char" SIZEOF_CHAR)
 CHECK_TYPE_SIZE("double" SIZEOF_DOUBLE)
@@ -177,6 +179,7 @@
 CHECK_TYPE_SIZE("long" SIZEOF_LONG)
 CHECK_TYPE_SIZE("short" SIZEOF_SHORT)
 CHECK_TYPE_SIZE("void*" SIZEOF_VOID_P)
+endif()
 
 # Check for include files, libraries, and functions
 include("${DCMTK_CMAKE_INCLUDE}CMake/dcmtkTryCompile.cmake")
diff -urEb dcmtk-3.6.5.orig/dcmdata/include/dcmtk/dcmdata/dcdict.h dcmtk-3.6.5/dcmdata/include/dcmtk/dcmdata/dcdict.h
--- dcmtk-3.6.5.orig/dcmdata/include/dcmtk/dcmdata/dcdict.h	2020-11-04 18:27:08.972662135 +0100
+++ dcmtk-3.6.5/dcmdata/include/dcmtk/dcmdata/dcdict.h	2020-11-04 18:27:48.232609773 +0100
@@ -152,6 +152,12 @@
     /// returns an iterator to the end of the repeating tag dictionary
     DcmDictEntryListIterator repeatingEnd() { return repDict.end(); }
 
+    // Function by the Orthanc project to load a dictionary from a
+    // memory buffer, which is necessary in sandboxed
+    // environments. This is an adapted version of
+    // DcmDataDictionary::loadDictionary().
+    OFBool loadFromMemory(const std::string& content, OFBool errorIfAbsent = OFTrue);
+
 private:
 
     /** private undefined assignment operator
diff -urEb dcmtk-3.6.5.orig/dcmdata/libsrc/dcdict.cc dcmtk-3.6.5/dcmdata/libsrc/dcdict.cc
--- dcmtk-3.6.5.orig/dcmdata/libsrc/dcdict.cc	2020-11-04 18:27:08.976662131 +0100
+++ dcmtk-3.6.5/dcmdata/libsrc/dcdict.cc	2020-11-04 18:27:48.232609773 +0100
@@ -900,3 +900,6 @@
   wrlock().clear();
   wrunlock();
 }
+
+
+#include "dcdict_orthanc.cc"
diff -urEb dcmtk-3.6.5.orig/dcmdata/libsrc/dcpxitem.cc dcmtk-3.6.5/dcmdata/libsrc/dcpxitem.cc
--- dcmtk-3.6.5.orig/dcmdata/libsrc/dcpxitem.cc	2020-11-04 18:27:08.976662131 +0100
+++ dcmtk-3.6.5/dcmdata/libsrc/dcpxitem.cc	2020-11-04 18:27:48.232609773 +0100
@@ -36,6 +36,9 @@
 #include "dcmtk/dcmdata/dcostrma.h"    /* for class DcmOutputStream */
 #include "dcmtk/dcmdata/dcwcache.h"    /* for class DcmWriteCache */
 
+#undef max
+#include "dcmtk/ofstd/oflimits.h"
+
 
 // ********************************
 
diff -urEb dcmtk-3.6.5.orig/dcmnet/libsrc/dulparse.cc dcmtk-3.6.5/dcmnet/libsrc/dulparse.cc
--- dcmtk-3.6.5.orig/dcmnet/libsrc/dulparse.cc	2020-11-04 18:27:09.004662093 +0100
+++ dcmtk-3.6.5/dcmnet/libsrc/dulparse.cc	2020-11-04 18:29:41.832458294 +0100
@@ -736,7 +736,14 @@
       << " is larger than maximum allowed UID length " << DICOM_UI_LENGTH << " (will use 64 bytes max)");
       UIDLength = DICOM_UI_LENGTH;
     }
-    OFStandard::strlcpy(role->SOPClassUID, (char*)buf, UIDLength+1 /* +1 for 0-byte */);
+
+    // Patch from: https://github.com/DCMTK/dcmtk/commit/10428a74e74c003b3ff31c992f658d528b626fab
+    // The UID in the source buffer is not necessarily null terminated. Copy with memcpy
+    // and add a zero byte. We have already checked that there is enough data available
+    // in the source source buffer and enough space in the target buffer.
+    (void) memcpy(role->SOPClassUID, buf, UIDLength);
+    role->SOPClassUID[UIDLength] = '\0';
+    
     buf += UIDLength;
     role->SCURole = *buf++;
     role->SCPRole = *buf++;
diff -urEb dcmtk-3.6.5.orig/oflog/include/dcmtk/oflog/thread/syncpub.h dcmtk-3.6.5/oflog/include/dcmtk/oflog/thread/syncpub.h
--- dcmtk-3.6.5.orig/oflog/include/dcmtk/oflog/thread/syncpub.h	2020-11-04 18:27:08.980662125 +0100
+++ dcmtk-3.6.5/oflog/include/dcmtk/oflog/thread/syncpub.h	2020-11-04 18:27:48.232609773 +0100
@@ -63,7 +63,7 @@
 
 DCMTK_LOG4CPLUS_INLINE_EXPORT
 Mutex::Mutex (Mutex::Type t)
-    : mtx (DCMTK_LOG4CPLUS_THREADED (new impl::Mutex (t)) + 0)
+    : mtx (DCMTK_LOG4CPLUS_THREADED (new impl::Mutex (t)))
 { }
 
 
@@ -106,7 +106,7 @@
 DCMTK_LOG4CPLUS_INLINE_EXPORT
 Semaphore::Semaphore (unsigned DCMTK_LOG4CPLUS_THREADED (max),
     unsigned DCMTK_LOG4CPLUS_THREADED (initial))
-    : sem (DCMTK_LOG4CPLUS_THREADED (new impl::Semaphore (max, initial)) + 0)
+    : sem (DCMTK_LOG4CPLUS_THREADED (new impl::Semaphore (max, initial)))
 { }
 
 
@@ -148,7 +148,7 @@
 
 DCMTK_LOG4CPLUS_INLINE_EXPORT
 FairMutex::FairMutex ()
-    : mtx (DCMTK_LOG4CPLUS_THREADED (new impl::FairMutex) + 0)
+    : mtx (DCMTK_LOG4CPLUS_THREADED (new impl::FairMutex))
 { }
 
 
@@ -190,7 +190,7 @@
 
 DCMTK_LOG4CPLUS_INLINE_EXPORT
 ManualResetEvent::ManualResetEvent (bool DCMTK_LOG4CPLUS_THREADED (sig))
-    : ev (DCMTK_LOG4CPLUS_THREADED (new impl::ManualResetEvent (sig)) + 0)
+    : ev (DCMTK_LOG4CPLUS_THREADED (new impl::ManualResetEvent (sig)))
 { }
 
 
@@ -252,7 +252,7 @@
 
 DCMTK_LOG4CPLUS_INLINE_EXPORT
 SharedMutex::SharedMutex ()
-    : sm (DCMTK_LOG4CPLUS_THREADED (new impl::SharedMutex) + 0)
+    : sm (DCMTK_LOG4CPLUS_THREADED (new impl::SharedMutex))
 { }
 
 
diff -urEb dcmtk-3.6.5.orig/oflog/libsrc/oflog.cc dcmtk-3.6.5/oflog/libsrc/oflog.cc
--- dcmtk-3.6.5.orig/oflog/libsrc/oflog.cc	2020-11-04 18:27:08.984662119 +0100
+++ dcmtk-3.6.5/oflog/libsrc/oflog.cc	2020-11-04 18:27:48.232609773 +0100
@@ -19,6 +19,10 @@
  *
  */
 
+#if defined(_WIN32)
+#  include <winsock2.h>
+#endif
+
 #include "dcmtk/config/osconfig.h"    /* make sure OS specific configuration is included first */
 #include "dcmtk/oflog/oflog.h"
 
diff -urEb dcmtk-3.6.5.orig/ofstd/include/dcmtk/ofstd/offile.h dcmtk-3.6.5/ofstd/include/dcmtk/ofstd/offile.h
--- dcmtk-3.6.5.orig/ofstd/include/dcmtk/ofstd/offile.h	2020-11-04 18:27:09.008662088 +0100
+++ dcmtk-3.6.5/ofstd/include/dcmtk/ofstd/offile.h	2020-11-04 18:27:48.232609773 +0100
@@ -575,7 +575,7 @@
    */
   void setlinebuf()
   {
-#if defined(_WIN32) || defined(__hpux)
+#if defined(_WIN32) || defined(__hpux) || defined(__LSB_VERSION__)
     this->setvbuf(NULL, _IOLBF, 0);
 #else
     :: setlinebuf(file_);