Merge branch 'master' into debian/experimental
authorMathieu Malaterre <malat@debian.org>
Mon, 24 Jun 2024 11:39:37 +0000 (11:39 +0000)
committerMathieu Malaterre <malat@debian.org>
Mon, 24 Jun 2024 18:43:42 +0000 (20:43 +0200)
1  2 
debian/changelog
debian/control
debian/dcmtk.maintscript
debian/patches/0001-Fixed-unchecked-typecasts-of-DcmItem-search-results.patch
debian/patches/0002-Fixed-unchecked-typecasts-and-fixed-LUT-handling.patch
debian/patches/0003-Fixed-wrong-error-handling-previous-commit.patch
debian/patches/0004-Fixed-two-segmentation-faults.patch
debian/patches/0005-Fixed-DcmDecimalString-unit-tests.patch
debian/patches/07_dont_export_all_executables.patch
debian/patches/series
debian/rules

index 0799ba983baf1ea4f3d4011fa51957185e990fad,49abb30a758a19ffddac0a6800cee438e251c52b..68fccdd33f2beecb894f93addbd3fa3eeea3f76b
- dcmtk (3.6.8-3) experimental; urgency=medium
++dcmtk (3.6.8-4) experimental; urgency=medium
 +
-   [ Emanuele Rocca ]
-   * d/rules: Fix armel buildd
++  * d/rules: Add dcmtk-data package
++  * d/control: Add missing dependency on libjs-jquery. Closes: #989108
++  * d/control: Reduce number of dependencies for -dev package
++  * New upstream version 3.6.8
 +
-  -- Mathieu Malaterre <malat@debian.org>  Fri, 12 Jan 2024 17:09:17 +0100
++ -- Mathieu Malaterre <malat@debian.org>  Mon, 24 Jun 2024 13:53:37 +0200
 +
- dcmtk (3.6.8-2) experimental; urgency=medium
+ dcmtk (3.6.7-15) unstable; urgency=medium
  
-   * d/rules: Fix test suite on x87 hardware
-   * d/patches: Import bug fix from upstream
+   * Team upload.
+   [ Adrian Bunk ]
+   * Update two of the previously applied patches to avoid breaking the ABI.
+     Closes: #1070207.
  
-  -- Mathieu Malaterre <malat@debian.org>  Fri, 12 Jan 2024 10:34:32 +0100
+  -- Santiago Vila <sanvila@debian.org>  Mon, 24 Jun 2024 12:30:00 +0200
  
- dcmtk (3.6.8-1) experimental; urgency=medium
+ dcmtk (3.6.7-14) unstable; urgency=medium
  
-   * New upstream version 3.6.8
-   * d/patches: Refresh patches
+   * Team upload.
+   [ Emanuele Rocca ]
+   * Do not drop graphviz from build-depends-indep for armhf and armel.
+   [ Adrian Bunk ]
+   * CVE-2024-28130: Segmentation faults due to incorrect typecast
+     (Closes: #1070207)
+   * CVE-2024-34508: Segmentation fault via invalid DIMSE message
+   * CVE-2024-34509: Segmentation fault via invalid DIMSE message
  
-  -- Mathieu Malaterre <malat@debian.org>  Thu, 11 Jan 2024 15:42:25 +0100
+  -- Santiago Vila <sanvila@debian.org>  Wed, 05 Jun 2024 14:30:00 +0200
  
- dcmtk (3.6.8~git20231027.1549d8c-2) experimental; urgency=medium
+ dcmtk (3.6.7-13) unstable; urgency=medium
  
-   * d/patches: Fix install path for docs
+   * Team upload.
+   * Marked Debian-specific patches as not needing forwarding to
+     upstream.
+   * d/control: add explicit dependency on libnsl-dev. Closes: #1066422.
  
-  -- Mathieu Malaterre <malat@debian.org>  Mon, 06 Nov 2023 12:07:47 +0100
+  -- Michael R. Crusoe <crusoe@debian.org>  Tue, 19 Mar 2024 15:24:15 +0100
  
- dcmtk (3.6.8~git20231027.1549d8c-1) experimental; urgency=medium
+ dcmtk (3.6.7-12) unstable; urgency=medium
  
-   * New upstream version 3.6.8~git20231027.1549d8c
-   * d/patches: Remove version from install paths
-   * d/rules: Start using LTO
+   * Team upload.
  
-  -- Mathieu Malaterre <malat@debian.org>  Mon, 06 Nov 2023 10:27:49 +0100
+   [ Emanuele Rocca ]
+   * Do not build-depend on graphviz on armhf and armel. The package is
+     currently not installable on those arches due to the ongoing t64
+     transition. Closes: #1067147
  
- dcmtk (3.6.8~git20221024.b8950f9-3) experimental; urgency=medium
+  -- Michael R. Crusoe <crusoe@debian.org>  Tue, 19 Mar 2024 12:30:03 +0100
  
-   * d/patches: Remove obsolete/unused patches
-   * d/rules: Fix debuild -A (all)
+ dcmtk (3.6.7-11) unstable; urgency=medium
  
-  -- Mathieu Malaterre <malat@debian.org>  Fri, 30 Jun 2023 15:27:28 +0200
+   * Fix typo in target distribution during upload.
  
- dcmtk (3.6.8~git20221024.b8950f9-2) experimental; urgency=medium
+  -- Sebastien Jodogne <s.jodogne@gmail.com>  Tue, 19 Mar 2024 11:54:38 +0100
  
-   * d/control: Reduce number of dependencies for -dev package
-   * d/rules: Remove gnu extensions, only strict c++17
-   * d/rules: Do not build test suite if not required
+ dcmtk (3.6.7-10) unreleased; urgency=medium
  
-  -- Mathieu Malaterre <malat@debian.org>  Fri, 30 Jun 2023 14:19:10 +0200
+   * Fix build on armel.  Closes: #1060104
  
- dcmtk (3.6.8~git20221024.b8950f9-1) experimental; urgency=medium
+  -- Sebastien Jodogne <s.jodogne@gmail.com>  Tue, 19 Mar 2024 11:03:28 +0100
  
-   * New upstream version 3.6.8~git20221024.b8950f9
-   * d/patches: Refresh version for new snapshot
+ dcmtk (3.6.7-9.1) unstable; urgency=medium
  
-  -- Mathieu Malaterre <malat@debian.org>  Mon, 07 Nov 2022 16:39:05 +0100
+   * Non-maintainer upload.
+   * Rename libraries for 64-bit time_t transition.  Closes: #1062022
  
- dcmtk (3.6.8~git20221013.51be018-3) experimental; urgency=medium
+  -- Michael Hudson-Doyle <mwhudson@debian.org>  Wed, 28 Feb 2024 01:17:02 +0000
  
-   * d/doc-base: Fix full path
+ dcmtk (3.6.7-9) unstable; urgency=medium
  
-  -- Mathieu Malaterre <malat@debian.org>  Mon, 07 Nov 2022 13:33:45 +0100
+   * Team upload.
+   * Fix postrm
+     Closes: #1038776
  
- dcmtk (3.6.8~git20221013.51be018-2) experimental; urgency=medium
+  -- Andreas Tille <tille@debian.org>  Thu, 22 Jun 2023 09:53:48 +0200
  
-   * d/lintian: Make sure to override lintian/ijg check
-   * d/control: Add missing dependency on libjs-jquery. Closes: #989108
+ dcmtk (3.6.7-8) unstable; urgency=medium
  
-  -- Mathieu Malaterre <malat@debian.org>  Mon, 07 Nov 2022 11:28:31 +0100
+   * d/patches: Fix CVE-2022-43272. Closes: #1027165
+   * d/control: Bump Std-Vers to 4.6.2 no changes needed
  
- dcmtk (3.6.8~git20221013.51be018-1) experimental; urgency=medium
+  -- Mathieu Malaterre <malat@debian.org>  Wed, 04 Jan 2023 11:15:13 +0100
  
-   * d/watch: Point to git HEAD
-   * New upstream version 3.6.8~git20221013.51be018
-   * d/rules: Add dcmtk-data package
-   * d/install: Start migrating to new 18 ABI
-   * d/patches: Add fake version mechanism
+ dcmtk (3.6.7-7) unstable; urgency=medium
+   [ Andreas Tille ]
+   * Team upload.
+   * Prevent bashism in run-unit-test
+   * Enable running run-unit-test from any directory
+   * Add maintscript to remove outdated conffiles
+     Closes: #990134
+   * On purge remove /var/lib/dcmtk/db/STORESCP if exists
+     Closes: #990135
+   [ Mathieu Malaterre ]
+   * d/control: Add missing dependency on libjs-jquery. Closes: #989108
  
-  -- Mathieu Malaterre <malat@debian.org>  Mon, 07 Nov 2022 10:53:17 +0100
+  -- Andreas Tille <tille@debian.org>  Tue, 06 Dec 2022 11:52:52 +0100
  
  dcmtk (3.6.7-6) unstable; urgency=medium
  
diff --cc debian/control
index fe4e82db896351dbabee2b7b0ca2eeed952f7718,8b1778838d15e4471fc45a0dac3f9f7087bae437..4385f4bbf17a3912ef75d1972c2b340bde976981
@@@ -1,22 -1,24 +1,24 @@@
  Source: dcmtk
  Maintainer: Debian Med Packaging Team <debian-med-packaging@lists.alioth.debian.org>
 -Uploaders: Gert Wollny <gewo@debian.org>,
 -           Mathieu Malaterre <malat@debian.org>
 +Uploaders: Gert Wollny <gewo@debian.org>, Mathieu Malaterre <malat@debian.org>
  Section: science
  Priority: optional
 -Build-Depends: dpkg-dev (>= 1.22.5), cmake,
 +Build-Depends: cmake,
                 debhelper-compat (= 13),
++               dpkg-dev (>= 1.22.5),
                 gettext,
                 help2man,
++               libnsl-dev,
                 libpng-dev,
                 libsndfile1-dev,
                 libssl-dev,
                 libtiff-dev,
                 libwrap0-dev,
 -               libnsl-dev,
                 libxml2-dev,
 +               xxd,
                 zlib1g-dev
 -Build-Depends-Indep: doxygen,
 -                     graphviz
 +Build-Depends-Indep: doxygen, graphviz
- Standards-Version: 4.6.1
+ Standards-Version: 4.6.2
  Vcs-Browser: https://salsa.debian.org/med-team/dcmtk
  Vcs-Git: https://salsa.debian.org/med-team/dcmtk.git
  Homepage: https://dicom.offis.de/dcmtk
@@@ -68,12 -62,16 +70,14 @@@ Description: OFFIS DICOM toolkit runtim
  Package: libdcmtk-dev
  Architecture: any
  Section: libdevel
 -Depends: libdcmtk17t64 (= ${binary:Version}),
 -         libpng-dev,
 -         libssl-dev,
 -         libtiff-dev,
 -         libwrap0-dev,
 +Depends: libdcmtk18 (= ${binary:Version}),
+          libnsl-dev,
++         libwrap0-dev,
           libxml2-dev,
 +         libz-dev,
           ${misc:Depends}
  Suggests: dcmtk-doc
 -Provides: libdcmtk17-dev
 +Provides: libdcmtk18-dev
  Description: OFFIS DICOM toolkit development libraries and headers
   DCMTK includes a collection of libraries and applications for examining,
   constructing and converting DICOM image files, handling offline media,
index 0000000000000000000000000000000000000000,9eefb317b42693773e5b05b8f3c435b0f3a69e90..f3ed6f5a53e5739e2576c3fff73d1adb8beb8136
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,4 +1,4 @@@
 -rm_conffile /etc/init.d/storescp
 -rm_conffile /etc/init.d/dcmqrscp
 -rm_conffile /etc/default/storescp
+ rm_conffile /etc/default/dcmqrscp
++rm_conffile /etc/default/storescp
++rm_conffile /etc/init.d/dcmqrscp
++rm_conffile /etc/init.d/storescp
index 0000000000000000000000000000000000000000,55d7b5066fa0e74c38859382345a587f554888ae..774af83ec1925b3a53dbb896684dff5512fb0f52
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,1475 +1,1662 @@@
 -From b8e1d6f7a0e2fba1b0dd138c790751bf88220464 Mon Sep 17 00:00:00 2001
++From dc6a2446dc03c9db90f82ce17a597f2cd53776c5 Mon Sep 17 00:00:00 2001
+ From: Marco Eichelberg <dicom@offis.de>
+ Date: Mon, 15 Apr 2024 12:12:51 +0200
 -Subject: Fixed unchecked typecasts of DcmItem::search results.
 -Bug-Debian: https://bugs.debian.org/1070207
 -Forwarded: not-needed
++Subject: [PATCH] Fixed unchecked typecasts of DcmItem::search results.
+ DcmItem::search() returns a stack of DcmObject pointers as search results.
+ These pointers in most instances need to be casted to DcmItem, DcmElement
+ or a subclass of these. In many cases, the type of the object was not
+ properly checked before the typecast. This could lead to segmentation faults
+ when invalid DICOM datasets were processed where elements had the wrong
+ value representation.
+ ---
 - dcmdata/libsrc/dcddirif.cc |  4 ++--
 - dcmdata/libsrc/dcdirrec.cc |  6 +++---
 - dcmdata/libsrc/dcfilefo.cc | 12 +++++------
 - dcmdata/libsrc/dcitem.cc   | 14 ++++++-------
 - dcmimgle/libsrc/didocu.cc  |  2 +-
 - dcmiod/libsrc/iodutil.cc   |  4 ++--
 - dcmjpeg/libsrc/djcodece.cc |  8 ++++----
 - dcmnet/apps/storescu.cc    |  6 ++++++
 - dcmnet/libsrc/dimcmd.cc    | 38 ++++++++++++++++++++--------------
 - dcmnet/libsrc/diutil.cc    | 28 ++++++++++++-------------
 - dcmnet/libsrc/dstorscu.cc  |  2 +-
 - dcmpstat/apps/dcmmklut.cc  |  4 ++--
 - dcmpstat/apps/dcmpschk.cc  |  6 +++++-
 - dcmpstat/libsrc/dviface.cc | 10 ++++-----
 - dcmpstat/libsrc/dvpsabl.cc |  4 ++--
 - dcmpstat/libsrc/dvpscu.cc  | 18 ++++++++--------
 - dcmpstat/libsrc/dvpsdal.cc |  4 ++--
 - dcmpstat/libsrc/dvpsfs.cc  | 22 ++++++++++----------
 - dcmpstat/libsrc/dvpsgal.cc |  4 ++--
 - dcmpstat/libsrc/dvpsgll.cc |  4 ++--
 - dcmpstat/libsrc/dvpsgrl.cc |  4 ++--
 - dcmpstat/libsrc/dvpshlp.cc |  2 +-
 - dcmpstat/libsrc/dvpsib.cc  | 42 +++++++++++++++++++-------------------
 - dcmpstat/libsrc/dvpsibl.cc |  4 ++--
 - dcmpstat/libsrc/dvpspll.cc |  4 ++--
 - dcmpstat/libsrc/dvpsril.cc |  2 +-
 - dcmpstat/libsrc/dvpsrsl.cc |  4 ++--
 - dcmpstat/libsrc/dvpssp.cc  | 40 ++++++++++++++++++------------------
 - dcmpstat/libsrc/dvpstxl.cc |  4 ++--
 - dcmpstat/libsrc/dvpsvll.cc |  4 ++--
 - dcmrt/libsrc/drttypes.cc   |  8 +++-----
 - dcmsign/libsrc/dcsignat.cc | 20 +++++++++---------
 - dcmsign/libsrc/sicert.cc   |  4 ++--
 - dcmsr/libsrc/dsrtypes.cc   |  4 ++--
 - 34 files changed, 180 insertions(+), 166 deletions(-)
++ dcmdata/apps/cda2dcm.cc                  |  0
++ dcmdata/apps/stl2dcm.cc                  |  0
++ dcmdata/include/dcmtk/dcmdata/dcelem.h   |  7 +++-
++ dcmdata/include/dcmtk/dcmdata/dcencdoc.h |  0
++ dcmdata/include/dcmtk/dcmdata/dcobject.h |  7 +++-
++ dcmdata/libsrc/dcddirif.cc               |  4 +--
++ dcmdata/libsrc/dcdirrec.cc               |  6 ++--
++ dcmdata/libsrc/dcfilefo.cc               | 12 +++----
++ dcmdata/libsrc/dcitem.cc                 | 16 ++++-----
++ dcmimgle/libsrc/didocu.cc                |  2 +-
++ dcmiod/libsrc/iodutil.cc                 |  4 +--
++ dcmjpeg/libsrc/djcodece.cc               |  8 ++---
++ dcmnet/apps/storescu.cc                  |  8 ++++-
++ dcmnet/libsrc/dimcmd.cc                  | 38 ++++++++++++---------
++ dcmnet/libsrc/diutil.cc                  | 28 ++++++++--------
++ dcmnet/libsrc/dstorscu.cc                |  2 +-
++ dcmpstat/apps/dcmmklut.cc                |  6 ++--
++ dcmpstat/apps/dcmpschk.cc                |  8 +++--
++ dcmpstat/libsrc/dviface.cc               | 10 +++---
++ dcmpstat/libsrc/dvpsabl.cc               |  4 +--
++ dcmpstat/libsrc/dvpscu.cc                | 18 +++++-----
++ dcmpstat/libsrc/dvpsdal.cc               |  4 +--
++ dcmpstat/libsrc/dvpsfs.cc                | 22 ++++++-------
++ dcmpstat/libsrc/dvpsgal.cc               |  4 +--
++ dcmpstat/libsrc/dvpsgll.cc               |  4 +--
++ dcmpstat/libsrc/dvpsgrl.cc               |  4 +--
++ dcmpstat/libsrc/dvpshlp.cc               |  2 +-
++ dcmpstat/libsrc/dvpsib.cc                | 42 ++++++++++++------------
++ dcmpstat/libsrc/dvpsibl.cc               |  4 +--
++ dcmpstat/libsrc/dvpspll.cc               |  4 +--
++ dcmpstat/libsrc/dvpsril.cc               |  4 +--
++ dcmpstat/libsrc/dvpsrsl.cc               |  4 +--
++ dcmpstat/libsrc/dvpssp.cc                | 40 +++++++++++-----------
++ dcmpstat/libsrc/dvpstxl.cc               |  4 +--
++ dcmpstat/libsrc/dvpsvll.cc               |  4 +--
++ dcmrt/libsrc/drttypes.cc                 |  8 ++---
++ dcmsign/libsrc/dcsignat.cc               | 22 ++++++-------
++ dcmsign/libsrc/sicert.cc                 |  4 +--
++ dcmsr/libsrc/dsrtypes.cc                 |  6 ++--
++ 39 files changed, 199 insertions(+), 175 deletions(-)
++ mode change 100755 => 100644 dcmdata/apps/cda2dcm.cc
++ mode change 100755 => 100644 dcmdata/apps/stl2dcm.cc
++ mode change 100755 => 100644 dcmdata/include/dcmtk/dcmdata/dcencdoc.h
++diff --git a/dcmdata/apps/cda2dcm.cc b/dcmdata/apps/cda2dcm.cc
++old mode 100755
++new mode 100644
++diff --git a/dcmdata/apps/stl2dcm.cc b/dcmdata/apps/stl2dcm.cc
++old mode 100755
++new mode 100644
++diff --git a/dcmdata/include/dcmtk/dcmdata/dcelem.h b/dcmdata/include/dcmtk/dcmdata/dcelem.h
++index b6ffeb7eb0..2978e96180 100644
++--- a/dcmdata/include/dcmtk/dcmdata/dcelem.h
+++++ b/dcmdata/include/dcmtk/dcmdata/dcelem.h
++@@ -1,6 +1,6 @@
++ /*
++  *
++- *  Copyright (C) 1994-2023, OFFIS e.V.
+++ *  Copyright (C) 1994-2024, OFFIS e.V.
++  *  All rights reserved.  See COPYRIGHT file for details.
++  *
++  *  This software and supporting documentation were developed by
++@@ -144,6 +144,11 @@ class DCMTK_DCMDATA_EXPORT DcmElement
++      */
++     virtual OFBool isLeaf() const { return OFTrue; }
++ 
+++    /** check if this element can be safely casted to DcmElement
+++     *  @return true if DcmElement, false otherwise
+++     */
+++    virtual OFBool isElement() const { return OFTrue; }
+++
++     /** check if value of this element is loaded into main memory
++      *  @return true if value is present in memory, false if value still resides in file
++      */
++diff --git a/dcmdata/include/dcmtk/dcmdata/dcencdoc.h b/dcmdata/include/dcmtk/dcmdata/dcencdoc.h
++old mode 100755
++new mode 100644
++diff --git a/dcmdata/include/dcmtk/dcmdata/dcobject.h b/dcmdata/include/dcmtk/dcmdata/dcobject.h
++index 60490f6bc8..714520bcf5 100644
++--- a/dcmdata/include/dcmtk/dcmdata/dcobject.h
+++++ b/dcmdata/include/dcmtk/dcmdata/dcobject.h
++@@ -1,6 +1,6 @@
++ /*
++  *
++- *  Copyright (C) 1994-2020, OFFIS e.V.
+++ *  Copyright (C) 1994-2024, OFFIS e.V.
++  *  All rights reserved.  See COPYRIGHT file for details.
++  *
++  *  This software and supporting documentation were developed by
++@@ -308,6 +308,11 @@ class DCMTK_DCMDATA_EXPORT DcmObject
++      */
++     virtual OFBool isLeaf() const = 0;
++ 
+++    /** check if this element can be safely casted to DcmElement
+++     *  @return true if DcmElement, false otherwise
+++     */
+++    virtual OFBool isElement() const { return OFFalse; }
+++
++     /** check if this element is nested in a sequence of items, i.e.\ not a
++      *  top-level or stand-alone element
++      *  @return true if this element is nested, false otherwise
++diff --git a/dcmdata/libsrc/dcddirif.cc b/dcmdata/libsrc/dcddirif.cc
++index a0aec59b96..69d0993e5f 100644
+ --- a/dcmdata/libsrc/dcddirif.cc
+ +++ b/dcmdata/libsrc/dcddirif.cc
 -@@ -433,7 +433,7 @@
++@@ -433,7 +433,7 @@ static OFBool compareItems(DcmItem *item1,
+              OFBool first = OFTrue;
+              DcmStack stack1, stack2;
+              /* check whether attributes are equal */
+ -            while (item1->nextObject(stack1, first).good() && item2->nextObject(stack2, first).good())
 -+            while (item1->nextObject(stack1, first).good() && item2->nextObject(stack2, first).good() && (dynamic_cast<DcmElement*>(stack1.top()) != nullptr) && (dynamic_cast<DcmElement*>(stack2.top()) != nullptr))
+++            while (item1->nextObject(stack1, first).good() && item2->nextObject(stack2, first).good() && stack1.top()->isElement() && stack2.top()->isElement())
+              {
+                  if (!compareAttributes(OFstatic_cast(DcmElement *, stack1.top()), OFstatic_cast(DcmElement *, stack2.top()), fromSequence, i++, reason))
+                      break;
 -@@ -5511,7 +5511,7 @@
++@@ -5457,7 +5457,7 @@ OFBool DicomDirInterface::warnAboutInconsistentAttributes(DcmDirectoryRecord *re
+          OFBool first = OFTrue;
+          DcmElement *delem = NULL;
+          /* iterate over all record elements */
+ -        while (record->nextObject(stack, first).good() && (result || !abortCheck))
 -+        while (record->nextObject(stack, first).good() && (result || !abortCheck) && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
+++        while (record->nextObject(stack, first).good() && (result || !abortCheck) && stack.top()->isElement())
+          {
+              delem = OFstatic_cast(DcmElement *, stack.top());
+              if ((delem != NULL) && (delem->getLength() > 0))
++diff --git a/dcmdata/libsrc/dcdirrec.cc b/dcmdata/libsrc/dcdirrec.cc
++index a6a2fc4858..c374c34742 100644
+ --- a/dcmdata/libsrc/dcdirrec.cc
+ +++ b/dcmdata/libsrc/dcdirrec.cc
 -@@ -1004,7 +1004,7 @@
++@@ -998,7 +998,7 @@ OFCondition DcmDirectoryRecord::fillElementsAndReadSOP(const char *referencedFil
+              DCMDATA_ERROR("Internal ERROR in DcmDirectoryRecord::fillElementsAndReadSOP()");
+          }
+          uiP = new DcmUniqueIdentifier(refSOPClassTag);    // (0004,1510)
+ -        if (refFile->search(DCM_SOPClassUID, stack).good())
+ +        if (refFile->search(DCM_SOPClassUID, stack).good() && (stack.top()->ident() == EVR_UI))
+          {
+              char *uid = NULL;
+              OFstatic_cast(DcmUniqueIdentifier *, stack.top())->getString(uid);
 -@@ -1017,7 +1017,7 @@
++@@ -1011,7 +1011,7 @@ OFCondition DcmDirectoryRecord::fillElementsAndReadSOP(const char *referencedFil
+          insert(uiP, OFTrue);
+  
+          uiP = new DcmUniqueIdentifier(refSOPInstTag);     // (0004,1511)
+ -        if (refFile->search(DCM_SOPInstanceUID, stack).good() || refFile->search(DCM_MediaStorageSOPInstanceUID, stack).good())
+ +        if ((refFile->search(DCM_SOPInstanceUID, stack).good() || refFile->search(DCM_MediaStorageSOPInstanceUID, stack).good()) && (stack.top()->ident() == EVR_UI))
+          {
+              char *uid = NULL;
+              OFstatic_cast(DcmUniqueIdentifier *, stack.top())->getString(uid);
 -@@ -1030,7 +1030,7 @@
++@@ -1024,7 +1024,7 @@ OFCondition DcmDirectoryRecord::fillElementsAndReadSOP(const char *referencedFil
+          insert(uiP, OFTrue);
+  
+          uiP = new DcmUniqueIdentifier(refFileXferTag);     // (0004,1512)
+ -        if (refFile->search(DCM_TransferSyntaxUID, stack).good())
+ +        if (refFile->search(DCM_TransferSyntaxUID, stack).good() && (stack.top()->ident() == EVR_UI))
+          {
+              char *uid = NULL;
+              OFstatic_cast(DcmUniqueIdentifier *, stack.top())->getString(uid);
++diff --git a/dcmdata/libsrc/dcfilefo.cc b/dcmdata/libsrc/dcfilefo.cc
++index 4f72dee83d..5771e604cc 100644
+ --- a/dcmdata/libsrc/dcfilefo.cc
+ +++ b/dcmdata/libsrc/dcfilefo.cc
+ @@ -1,6 +1,6 @@
+  /*
+   *
+ - *  Copyright (C) 1994-2022, OFFIS e.V.
+ + *  Copyright (C) 1994-2024, OFFIS e.V.
+   *  All rights reserved.  See COPYRIGHT file for details.
+   *
+   *  This software and supporting documentation were developed by
 -@@ -363,7 +363,7 @@
++@@ -362,7 +362,7 @@ OFCondition DcmFileFormat::checkMetaHeaderValue(DcmMetaInfo *metainfo,
+              {
+                  if ((writeMode == EWM_updateMeta) || (elem->getLength() == 0))
+                  {
+ -                    if (dataset->search(DCM_SOPClassUID, stack).good())
+ +                    if (dataset->search(DCM_SOPClassUID, stack).good() && (stack.top()->ident() == EVR_UI))
+                      {
+                          char *uid = NULL;
+                          l_error = OFstatic_cast(DcmUniqueIdentifier *, stack.top())->getString(uid);
 -@@ -379,7 +379,7 @@
++@@ -378,7 +378,7 @@ OFCondition DcmFileFormat::checkMetaHeaderValue(DcmMetaInfo *metainfo,
+                  else if (DCM_dcmdataLogger.isEnabledFor(OFLogger::WARN_LOG_LEVEL))
+                  {
+                      // check whether UID in meta-header is identical to the one in the dataset
+ -                    if (dataset->search(DCM_SOPClassUID, stack).good())
+ +                    if (dataset->search(DCM_SOPClassUID, stack).good() && (stack.top()->ident() == EVR_UI))
+                      {
+                          OFString uidDataset, uidMetaHeader;
+                          OFstatic_cast(DcmUniqueIdentifier *, stack.top())->getOFStringArray(uidDataset);
 -@@ -405,7 +405,7 @@
++@@ -404,7 +404,7 @@ OFCondition DcmFileFormat::checkMetaHeaderValue(DcmMetaInfo *metainfo,
+              {
+                  if ((writeMode == EWM_updateMeta) || (elem->getLength() == 0))
+                  {
+ -                    if (dataset->search(DCM_SOPInstanceUID, stack).good())
+ +                    if (dataset->search(DCM_SOPInstanceUID, stack).good() && (stack.top()->ident() == EVR_UI))
+                      {
+                          char* uid = NULL;
+                          l_error = OFstatic_cast(DcmUniqueIdentifier *, stack.top())->getString(uid);
 -@@ -423,7 +423,7 @@
++@@ -422,7 +422,7 @@ OFCondition DcmFileFormat::checkMetaHeaderValue(DcmMetaInfo *metainfo,
+                  else if (DCM_dcmdataLogger.isEnabledFor(OFLogger::WARN_LOG_LEVEL))
+                  {
+                      // check whether UID in meta-header is identical to the one in the dataset
+ -                    if (dataset->search(DCM_SOPInstanceUID, stack).good())
+ +                    if (dataset->search(DCM_SOPInstanceUID, stack).good() && (stack.top()->ident() == EVR_UI))
+                      {
+                          OFString uidDataset, uidMetaHeader;
+                          OFstatic_cast(DcmUniqueIdentifier *, stack.top())->getOFStringArray(uidDataset);
 -@@ -634,7 +634,7 @@
++@@ -633,7 +633,7 @@ E_TransferSyntax DcmFileFormat::lookForXfer(DcmMetaInfo *metainfo)
+      /* check whether meta header is present (and non-empty, i.e. contains elements) */
+      if (metainfo && !metainfo->isEmpty())
+      {
+ -        if (metainfo->search(DCM_TransferSyntaxUID, stack).good())
+ +        if (metainfo->search(DCM_TransferSyntaxUID, stack).good() && (stack.top()->ident() == EVR_UI))
+          {
+              DcmUniqueIdentifier *xferUI = OFstatic_cast(DcmUniqueIdentifier *, stack.top());
 -             if (xferUI->getTag().getXTag() == DCM_TransferSyntaxUID)
++             if (xferUI->getTag() == DCM_TransferSyntaxUID)
++diff --git a/dcmdata/libsrc/dcitem.cc b/dcmdata/libsrc/dcitem.cc
++index 3960fceb45..51f95d21dd 100644
+ --- a/dcmdata/libsrc/dcitem.cc
+ +++ b/dcmdata/libsrc/dcitem.cc
 -@@ -2322,7 +2322,7 @@
++@@ -1,6 +1,6 @@
++ /*
++  *
++- *  Copyright (C) 1994-2023, OFFIS e.V.
+++ *  Copyright (C) 1994-2024, OFFIS e.V.
++  *  All rights reserved.  See COPYRIGHT file for details.
++  *
++  *  This software and supporting documentation were developed by
++@@ -2332,7 +2332,7 @@ OFBool DcmItem::tagExistsWithValue(const DcmTagKey &key,
+      DcmStack stack;
+      OFBool result = OFFalse;
+  
+ -    if (search(key, stack, ESM_fromHere, searchIntoSub).good())
 -+    if (search(key, stack, ESM_fromHere, searchIntoSub).good() && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
+++    if (search(key, stack, ESM_fromHere, searchIntoSub).good() && stack.top()->isElement())
+      {
+          DcmElement *elem = OFstatic_cast(DcmElement *, stack.top());
+          if (elem != NULL)
 -@@ -2345,7 +2345,7 @@
++@@ -2355,7 +2355,7 @@ OFCondition DcmItem::findAndGetElement(const DcmTagKey &tagKey,
+      DcmStack stack;
+      /* find the element */
+      OFCondition status = search(tagKey, stack, ESM_fromHere, searchIntoSub);
+ -    if (status.good())
 -+    if (status.good() && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
+++    if (status.good() && stack.top()->isElement())
+      {
+          element = OFstatic_cast(DcmElement *, stack.top());
+          /* should never happen but ... */
 -@@ -2980,7 +2980,7 @@
++@@ -2990,7 +2990,7 @@ OFCondition DcmItem::findAndGetSequence(const DcmTagKey &seqTagKey,
+      DcmStack stack;
+      /* find the element */
+      OFCondition status = search(seqTagKey, stack, ESM_fromHere, searchIntoSub);
+ -    if (status.good())
 -+    if (status.good() && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
+++    if (status.good() && stack.top()->isElement())
+      {
+          DcmElement *delem = OFstatic_cast(DcmElement *, stack.top());
+          /* should never happen but ... */
 -@@ -3017,7 +3017,7 @@
++@@ -3027,7 +3027,7 @@ OFCondition DcmItem::findAndGetSequenceItem(const DcmTagKey &seqTagKey,
+      DcmStack stack;
+      /* find sequence */
+      OFCondition status = search(seqTagKey, stack, ESM_fromHere, OFFalse /*searchIntoSub*/);
+ -    if (status.good())
 -+    if (status.good() && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
+++    if (status.good() && stack.top()->isElement())
+      {
+          /* get element */
+          DcmElement *delem = OFstatic_cast(DcmElement *, stack.top());
 -@@ -3079,7 +3079,7 @@
++@@ -3089,7 +3089,7 @@ OFCondition DcmItem::findOrCreateSequenceItem(const DcmTag& seqTag,
+      OFCondition status = search(seqTag, stack, ESM_fromHere, OFFalse /*searchIntoSub*/);
+      DcmSequenceOfItems *sequence = NULL;
+      /* sequence found? */
+ -    if (status.good())
 -+    if (status.good() && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
+++    if (status.good() && stack.top()->isElement())
+      {
+          /* get element */
+          DcmElement *delem = OFstatic_cast(DcmElement *, stack.top());
 -@@ -3213,7 +3213,7 @@
++@@ -3223,7 +3223,7 @@ OFCondition DcmItem::findAndDeleteSequenceItem(const DcmTagKey &seqTagKey,
+      DcmStack stack;
+      /* find sequence */
+      OFCondition status = search(seqTagKey, stack, ESM_fromHere, OFFalse /*searchIntoSub*/);
+ -    if (status.good())
 -+    if (status.good() && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
+++    if (status.good() && stack.top()->isElement())
+      {
+          /* get element */
+          DcmElement *delem = OFstatic_cast(DcmElement *, stack.top());
 -@@ -4173,7 +4173,7 @@
++@@ -4224,7 +4224,7 @@ OFCondition DcmItem::insertSequenceItem(const DcmTag &seqTag,
+          status = search(seqTag, stack, ESM_fromHere, OFFalse /*searchIntoSub*/);
+          DcmSequenceOfItems *sequence = NULL;
+          /* sequence found? */
+ -        if (status.good())
 -+        if (status.good() && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
+++        if (status.good() && stack.top()->isElement())
+          {
+              /* get element */
+              DcmElement *delem = OFstatic_cast(DcmElement *, stack.top());
++diff --git a/dcmimgle/libsrc/didocu.cc b/dcmimgle/libsrc/didocu.cc
++index b63f77258a..efbbd69fbd 100644
+ --- a/dcmimgle/libsrc/didocu.cc
+ +++ b/dcmimgle/libsrc/didocu.cc
 -@@ -218,7 +218,7 @@
++@@ -217,7 +217,7 @@ DcmElement *DiDocument::search(const DcmTagKey &tag,
+          obj = Object;
+      // only search on main dataset level
+      if ((obj != NULL) && (obj->search(tag, stack, ESM_fromHere, OFFalse /* searchIntoSub */) == EC_Normal) &&
+ -        (stack.top()->getLength(Xfer) > 0))
 -+        (stack.top()->getLength(Xfer) > 0) && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
+++        (stack.top()->getLength(Xfer) > 0) && stack.top()->isElement())
+      {
+          return OFstatic_cast(DcmElement *, stack.top());
+      }
++diff --git a/dcmiod/libsrc/iodutil.cc b/dcmiod/libsrc/iodutil.cc
++index bd3dc87913..64c985cb50 100644
+ --- a/dcmiod/libsrc/iodutil.cc
+ +++ b/dcmiod/libsrc/iodutil.cc
 -@@ -43,7 +43,7 @@
++@@ -43,7 +43,7 @@ OFCondition DcmIODUtil::getAndCheckElementFromDataset(
+      DcmStack stack;
+      const DcmTagKey tagKey = delem.getTag();
+      OFCondition result     = dataset.search(tagKey, stack, ESM_fromHere, OFFalse /*searchIntoSub*/);
+ -    if (result.good())
 -+    if (result.good() && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
+++    if (result.good() && stack.top()->isElement())
+      {
+          /* copy object from search stack */
+          result = delem.copyFrom(*stack.top());
 -@@ -76,7 +76,7 @@
++@@ -76,7 +76,7 @@ OFCondition DcmIODUtil::getAndCheckElementFromDataset(DcmItem& dataset,
+  
+      DcmStack stack;
+      OFCondition result = dataset.search(tagKey, stack, ESM_fromHere, OFFalse /*searchIntoSub*/);
+ -    if (result.good())
 -+    if (result.good() && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
+++    if (result.good() && stack.top()->isElement())
+      {
+          /* copy object from search stack */
+          delem = OFstatic_cast(DcmElement*, stack.top()->clone());
++diff --git a/dcmjpeg/libsrc/djcodece.cc b/dcmjpeg/libsrc/djcodece.cc
++index 4128a20402..d0371f6c2b 100644
+ --- a/dcmjpeg/libsrc/djcodece.cc
+ +++ b/dcmjpeg/libsrc/djcodece.cc
+ @@ -1,6 +1,6 @@
+  /*
+   *
+ - *  Copyright (C) 2001-2022, OFFIS e.V.
+ + *  Copyright (C) 2001-2024, OFFIS e.V.
+   *  All rights reserved.  See COPYRIGHT file for details.
+   *
+   *  This software and supporting documentation were developed by
 -@@ -1397,17 +1397,17 @@
++@@ -1399,17 +1399,17 @@ OFCondition DJCodecEncoder::correctVOIWindows(
+    DcmElement *explanation = NULL;
+  
+    DcmStack stack;
+ -  if ((dataset->search(DCM_WindowCenter, stack, ESM_fromHere, OFFalse)).good())
 -+  if ((dataset->search(DCM_WindowCenter, stack, ESM_fromHere, OFFalse)).good() && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
+++  if ((dataset->search(DCM_WindowCenter, stack, ESM_fromHere, OFFalse)).good() && stack.top()->isElement())
+    {
+      center = OFreinterpret_cast(DcmElement*, stack.top());
+    }
+    stack.clear();
+ -  if ((dataset->search(DCM_WindowWidth, stack, ESM_fromHere, OFFalse)).good())
 -+  if ((dataset->search(DCM_WindowWidth, stack, ESM_fromHere, OFFalse)).good() && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
+++  if ((dataset->search(DCM_WindowWidth, stack, ESM_fromHere, OFFalse)).good() && stack.top()->isElement())
+    {
+      width = OFreinterpret_cast(DcmElement*, stack.top());
+    }
+    stack.clear();
+ -  if ((dataset->search(DCM_WindowCenterWidthExplanation, stack, ESM_fromHere, OFFalse)).good())
 -+  if ((dataset->search(DCM_WindowCenterWidthExplanation, stack, ESM_fromHere, OFFalse)).good() && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
+++  if ((dataset->search(DCM_WindowCenterWidthExplanation, stack, ESM_fromHere, OFFalse)).good() && stack.top()->isElement())
+    {
+      explanation = OFreinterpret_cast(DcmElement*, stack.top());
+    }
++diff --git a/dcmnet/apps/storescu.cc b/dcmnet/apps/storescu.cc
++index e2c3b29395..bd7f1cd61f 100644
+ --- a/dcmnet/apps/storescu.cc
+ +++ b/dcmnet/apps/storescu.cc
 -@@ -1138,6 +1138,12 @@
++@@ -1,6 +1,6 @@
++ /*
++  *
++- *  Copyright (C) 1996-2023, OFFIS e.V.
+++ *  Copyright (C) 1996-2024, OFFIS e.V.
++  *  All rights reserved.  See COPYRIGHT file for details.
++  *
++  *  This software and supporting documentation were developed by
++@@ -1138,6 +1138,12 @@ updateStringAttributeValue(DcmItem *dataset, const DcmTagKey &key, OFString &val
+      return OFFalse;
+    }
+  
 -+  if (! (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
+++  if (! stack.top()->isElement())
+ +  {
+ +    OFLOG_ERROR(storescuLogger, "updateStringAttributeValue: not a DcmElement: " << tag.getTagName() << " " << key);
+ +    return OFFalse;
+ +  }
+ +
+    DcmElement *elem = OFstatic_cast(DcmElement *, stack.top());
+  
+    DcmVR vr(elem->ident());
++diff --git a/dcmnet/libsrc/dimcmd.cc b/dcmnet/libsrc/dimcmd.cc
++index ffd225f4b9..3bcfae5e4f 100644
+ --- a/dcmnet/libsrc/dimcmd.cc
+ +++ b/dcmnet/libsrc/dimcmd.cc
 -@@ -191,14 +191,16 @@
++@@ -191,14 +191,16 @@ addString(DcmDataset *obj, DcmTagKey t, char *s, OFBool keepPadding)
+  static OFCondition
+  getString(DcmDataset *obj, DcmTagKey t, char *s, int maxlen, OFBool *spacePadded)
+  {
+ -    DcmElement *elem;
+ +    DcmElement *elem = NULL;
+      DcmStack stack;
+      OFCondition ec = EC_Normal;
+      char* aString;
+  
+      ec = obj->search(t, stack);
+ -    elem = (DcmElement*)stack.top();
+ -    if (ec == EC_Normal && elem != NULL) {
 -+    if (ec.good() && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
+++    if (ec.good() && stack.top()->isElement())
+ +        elem = (DcmElement*)stack.top();
+ +
+ +    if (elem != NULL) {
+          if (elem->getLength() == 0) {
+              s[0] = '\0';
+          } else if (elem->getLength() > (Uint32)maxlen) {
 -@@ -263,17 +265,19 @@
++@@ -266,17 +268,19 @@ addUS(DcmDataset *obj, DcmTagKey t, Uint16 us)
+  static OFCondition
+  getUS(DcmDataset *obj, DcmTagKey t, Uint16 *us)
+  {
+ -    DcmElement *elem;
+ +    DcmElement *elem = NULL;
+      DcmStack stack;
+      OFCondition ec = EC_Normal;
+  
+      ec = obj->search(t, stack);
+ -    elem = (DcmElement*)stack.top();
+ -    if (ec == EC_Normal && elem != NULL) {
 -+    if (ec.good() && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
+++    if (ec.good() && stack.top()->isElement())
+ +        elem = (DcmElement*)stack.top();
+ +
+ +    if (elem != NULL) {
+          ec = elem->getUint16(*us, 0);
+      }
+  
+ -    return (ec == EC_Normal)?(EC_Normal):(DIMSE_PARSEFAILED);
+ +    return (ec.good())?(EC_Normal):(DIMSE_PARSEFAILED);
+  }
+  
+  static OFCondition
 -@@ -314,17 +318,19 @@
++@@ -317,17 +321,19 @@ addUL(DcmDataset *obj, DcmTagKey t, Uint32 ul)
+  static OFCondition
+  getUL(DcmDataset *obj, DcmTagKey t, Uint32 *ul)
+  {
+ -    DcmElement *elem;
+ +    DcmElement *elem = NULL;
+      DcmStack stack;
+      OFCondition ec = EC_Normal;
+  
+      ec = obj->search(t, stack);
+ -    elem = (DcmElement*)stack.top();
+ -    if (ec == EC_Normal && elem != NULL) {
 -+    if (ec.good() && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
+++    if (ec.good() && stack.top()->isElement())
+ +        elem = (DcmElement*)stack.top();
+ +
+ +    if (elem != NULL) {
+          ec = elem->getUint32(*ul, 0);
+      }
+  
+ -    return (ec == EC_Normal)?(EC_Normal):(DIMSE_PARSEFAILED);
+ +    return (ec.good())?(EC_Normal):(DIMSE_PARSEFAILED);
+  }
+  
+  #if 0
 -@@ -375,15 +381,17 @@
++@@ -378,15 +384,17 @@ addAttributeList(DcmDataset *obj, DcmTagKey t, Uint16 *lst, int listCount)
+  static OFCondition
+  getAttributeList(DcmDataset *obj, DcmTagKey t, Uint16 **lst, int *listCount)
+  {
+ -    DcmElement *elem;
+ +    DcmElement *elem = NULL;
+      DcmStack stack;
+      OFCondition ec = EC_Normal;
+      Uint16 *aList = NULL;
+      Uint32 nBytes = 0;
+  
+      ec = obj->search(t, stack);
+ -    elem = (DcmElement*)stack.top();
+ -    if (ec == EC_Normal && elem != NULL) {
 -+    if (ec.good() && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
+++    if (ec.good() && stack.top()->isElement())
+ +        elem = (DcmElement*)stack.top();
+ +
+ +    if (elem) {
+          nBytes = elem->getLength();
+          *listCount = (int)(nBytes / sizeof(Uint16));
+          if (*listCount > 0) {
 -@@ -395,7 +403,7 @@
++@@ -398,7 +406,7 @@ getAttributeList(DcmDataset *obj, DcmTagKey t, Uint16 **lst, int *listCount)
+          }
+      }
+  
+ -    return (ec == EC_Normal)?(EC_Normal):(DIMSE_PARSEFAILED);
+ +    return (ec.good())?(EC_Normal):(DIMSE_PARSEFAILED);
+  }
+  
+  /*
++diff --git a/dcmnet/libsrc/diutil.cc b/dcmnet/libsrc/diutil.cc
++index 75111ae3bb..31c9645fcd 100644
+ --- a/dcmnet/libsrc/diutil.cc
+ +++ b/dcmnet/libsrc/diutil.cc
 -@@ -159,23 +159,21 @@
++@@ -148,23 +148,21 @@ DU_stripLeadingAndTrailingSpaces(char *s)
+  OFBool
+  DU_getStringDOElement(DcmItem *obj, DcmTagKey t, char *s, size_t bufsize)
+  {
+ -    DcmByteString *elem;
+      DcmStack stack;
+ -    OFCondition ec = EC_Normal;
+      char* aString;
+  
+ -    ec = obj->search(t, stack);
+ -    elem = (DcmByteString*) stack.top();
+ -    if (ec == EC_Normal && elem != NULL) {
+ +    OFCondition ec = obj->search(t, stack);
 -+    if (ec.good() && (stack.top() != NULL) && (dynamic_cast<DcmElement*>(stack.top()) != nullptr)) {
+++    if (ec.good() && (stack.top() != NULL) && stack.top()->isElement()) {
+ +        DcmElement *elem = (DcmElement *) stack.top();
+          if (elem->getLength() == 0) {
+              s[0] = '\0';
+          } else {
+              ec =  elem->getString(aString);
+ -            if (ec == EC_Normal)
+ +            if (ec.good())
+                  OFStandard::strlcpy(s, aString, bufsize);
+          }
+      }
+ -    return (ec == EC_Normal);
+ +    return (ec.good());
+  }
+  
+  OFBool
 -@@ -193,7 +191,7 @@
++@@ -182,7 +180,7 @@ DU_putStringDOElement(DcmItem *obj, DcmTagKey t, const char *s)
+          ec = obj->insert(e, OFTrue);
+      }
+  
+ -    return (ec == EC_Normal);
+ +    return (ec.good());
+  }
+  
+  OFBool
 -@@ -201,15 +199,15 @@
++@@ -190,15 +188,15 @@ DU_getShortDOElement(DcmItem *obj, DcmTagKey t, Uint16 *us)
+  {
+      DcmElement *elem;
+      DcmStack stack;
+ -    OFCondition ec = EC_Normal;
+  
+ -    ec = obj->search(t, stack);
+ -    elem = (DcmElement*) stack.top();
+ -    if (ec == EC_Normal && elem != NULL) {
+ -        ec = elem->getUint16(*us, 0);
+ +    OFCondition ec = obj->search(t, stack);
 -+    if (ec.good() && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
+++    if (ec.good() && stack.top()->isElement())
+ +    {
+ +        elem = (DcmElement*) stack.top();
+ +        if (elem) ec = elem->getUint16(*us, 0);
+      }
+  
+ -    return (ec == EC_Normal);
+ +    return (ec.good());
+  }
+  
+  OFBool
 -@@ -226,7 +224,7 @@
++@@ -215,7 +213,7 @@ DU_putShortDOElement(DcmItem *obj, DcmTagKey t, Uint16 us)
+      if (ec == EC_Normal) {
+          ec = obj->insert(e, OFTrue);
+      }
+ -    return (ec == EC_Normal);
+ +    return (ec.good());
+  }
+  
+  OFBool
++diff --git a/dcmnet/libsrc/dstorscu.cc b/dcmnet/libsrc/dstorscu.cc
++index cbb3dcbe97..01024d5406 100644
+ --- a/dcmnet/libsrc/dstorscu.cc
+ +++ b/dcmnet/libsrc/dstorscu.cc
 -@@ -484,7 +484,7 @@
++@@ -484,7 +484,7 @@ OFCondition DcmStorageSCU::addDicomFilesFromDICOMDIR(const OFFilename &filename,
+          OFFilename dirName;
+          OFStandard::getDirNameFromPath(dirName, filename, OFFalse /* assumeDirName */);
+          // iterate over all items (directory records) where ReferencedFileID is present
+ -        while (dataset->search(DCM_ReferencedFileID, stack, ESM_afterStackTop, OFTrue).good())
 -+        while (dataset->search(DCM_ReferencedFileID, stack, ESM_afterStackTop, OFTrue).good() && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
+++        while (dataset->search(DCM_ReferencedFileID, stack, ESM_afterStackTop, OFTrue).good() && stack.top()->isElement())
+          {
+              // make sure that the dataset and element pointer are there
+              if (stack.card() > 1)
++diff --git a/dcmpstat/apps/dcmmklut.cc b/dcmpstat/apps/dcmmklut.cc
++index 044a17b3af..6a72ed3843 100644
+ --- a/dcmpstat/apps/dcmmklut.cc
+ +++ b/dcmpstat/apps/dcmmklut.cc
 -@@ -971,7 +971,7 @@
++@@ -1,6 +1,6 @@
++ /*
++  *
++- *  Copyright (C) 1998-2023, OFFIS e.V.
+++ *  Copyright (C) 1998-2024, OFFIS e.V.
++  *  All rights reserved.  See COPYRIGHT file for details.
++  *
++  *  This software and supporting documentation were developed by
++@@ -971,7 +971,7 @@ int main(int argc, char *argv[])
+                      {
+                          // search existing sequence
+                          DcmStack stack;
+ -                        if (EC_Normal == dataset->search(DCM_PresentationLUTSequence, stack, ESM_fromHere, OFFalse))
+ +                        if (EC_Normal == dataset->search(DCM_PresentationLUTSequence, stack, ESM_fromHere, OFFalse) && (stack.top()->ident() == EVR_SQ))
+                              dseq=(DcmSequenceOfItems *)stack.top();
+                      }
+                      if (dseq == NULL)
 -@@ -992,7 +992,7 @@
++@@ -992,7 +992,7 @@ int main(int argc, char *argv[])
+                      {
+                          // search existing sequence
+                          DcmStack stack;
+ -                        if (EC_Normal == dataset->search(DCM_VOILUTSequence, stack, ESM_fromHere, OFFalse))
+ +                        if (EC_Normal == dataset->search(DCM_VOILUTSequence, stack, ESM_fromHere, OFFalse) && (stack.top()->ident() == EVR_SQ))
+                              dseq=(DcmSequenceOfItems *)stack.top();
+                      }
+                      if (dseq == NULL)
++diff --git a/dcmpstat/apps/dcmpschk.cc b/dcmpstat/apps/dcmpschk.cc
++index ada6b164a3..12826b23f7 100644
+ --- a/dcmpstat/apps/dcmpschk.cc
+ +++ b/dcmpstat/apps/dcmpschk.cc
 -@@ -652,7 +652,11 @@
++@@ -1,6 +1,6 @@
++ /*
++  *
++- *  Copyright (C) 2000-2023, OFFIS e.V.
+++ *  Copyright (C) 2000-2024, OFFIS e.V.
++  *  All rights reserved.  See COPYRIGHT file for details.
++  *
++  *  This software and supporting documentation were developed by
++@@ -652,7 +652,11 @@ static OFString printAttribute(
+      OFOStringStream str;
+  
+      ec = dset->search(key, stack, ESM_fromHere, OFFalse);
+ -    elem = (DcmElement*) stack.top();
 -+    if (ec.good() && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
+++    if (ec.good() && stack.top()->isElement())
+ +    {
+ +        elem = (DcmElement*) stack.top();
+ +    }
+ +
+      if (elem)
+          elem->print(str, DCMTypes::PF_shortenLongTagValues);
+      else
++diff --git a/dcmpstat/libsrc/dviface.cc b/dcmpstat/libsrc/dviface.cc
++index 259e1580e0..d3a84510df 100644
+ --- a/dcmpstat/libsrc/dviface.cc
+ +++ b/dcmpstat/libsrc/dviface.cc
 -@@ -1425,14 +1425,14 @@
++@@ -1417,14 +1417,14 @@ OFBool DVInterface::createPStateCache()
+                                                                  if (reference != NULL)
+                                                                  {
+                                                                      DcmStack stack;
+ -                                                                    if (dataset->search(DCM_ContentDescription, stack, ESM_fromHere, OFFalse) == EC_Normal)
+ +                                                                    if (dataset->search(DCM_ContentDescription, stack, ESM_fromHere, OFFalse) == EC_Normal && (stack.top()->ident() == EVR_LO))
+                                                                      {
+                                                                          char *value = NULL;
+                                                                          if ((*OFstatic_cast(DcmLongString *, stack.top())).getString(value) == EC_Normal)
+                                                                              reference->Description = value;
+                                                                      }
+                                                                      stack.clear();
+ -                                                                    if (dataset->search(DCM_ContentLabel, stack, ESM_fromHere, OFFalse) == EC_Normal)
+ +                                                                    if (dataset->search(DCM_ContentLabel, stack, ESM_fromHere, OFFalse) == EC_Normal && (stack.top()->ident() == EVR_LO))
+                                                                      {
+                                                                          char *value = NULL;
+                                                                          if ((*OFstatic_cast(DcmLongString *, stack.top())).getString(value) == EC_Normal)
 -@@ -2843,12 +2843,12 @@
++@@ -2835,12 +2835,12 @@ OFCondition DVInterface::saveFileFormatToDB(DcmFileFormat &fileformat)
+    DcmDataset *dset = fileformat.getDataset();
+    if (dset)
+    {
+ -    if (EC_Normal == dset->search(DCM_SOPInstanceUID, stack, ESM_fromHere, OFFalse))
 -+    if (EC_Normal == dset->search(DCM_SOPInstanceUID, stack, ESM_fromHere, OFFalse) && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
+++    if (EC_Normal == dset->search(DCM_SOPInstanceUID, stack, ESM_fromHere, OFFalse) && stack.top()->isElement())
+      {
+        OFstatic_cast(DcmElement *, stack.top())->getString(instanceUID);
+      }
+      stack.clear();
+ -    if (EC_Normal == dset->search(DCM_SOPClassUID, stack, ESM_fromHere, OFFalse))
 -+    if (EC_Normal == dset->search(DCM_SOPClassUID, stack, ESM_fromHere, OFFalse) && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
+++    if (EC_Normal == dset->search(DCM_SOPClassUID, stack, ESM_fromHere, OFFalse) && stack.top()->isElement())
+      {
+        OFstatic_cast(DcmElement *, stack.top())->getString(classUID);
+      }
 -@@ -3761,7 +3761,7 @@
++@@ -3756,7 +3756,7 @@ OFCondition DVInterface::addToPrintHardcopyFromDB(const char *studyUID, const ch
+                  DVPSPresentationLUT presentationLUT;
+                  if (EC_Normal != presentationLUT.read(*dataset, OFFalse)) presentationLUT.setType(DVPSP_identity);
+                      result = dataset->search(sopclassuid.getTag(), stack, ESM_fromHere, OFFalse);
+ -                if (EC_Normal == result)
+ +                if (EC_Normal == result  && (stack.top()->ident() == EVR_UI))
+                  {
+                    char *sopclass = NULL;
+                    sopclassuid = *OFstatic_cast(DcmUniqueIdentifier *, stack.top());
++diff --git a/dcmpstat/libsrc/dvpsabl.cc b/dcmpstat/libsrc/dvpsabl.cc
++index 62cc1d51b9..bbda18183e 100644
+ --- a/dcmpstat/libsrc/dvpsabl.cc
+ +++ b/dcmpstat/libsrc/dvpsabl.cc
+ @@ -1,6 +1,6 @@
+  /*
+   *
+ - *  Copyright (C) 1999-2010, OFFIS e.V.
+ + *  Copyright (C) 1999-2024, OFFIS e.V.
+   *  All rights reserved.  See COPYRIGHT file for details.
+   *
+   *  This software and supporting documentation were developed by
 -@@ -69,7 +69,7 @@
++@@ -69,7 +69,7 @@ OFCondition DVPSAnnotationContent_PList::read(DcmItem &dset)
+    DcmSequenceOfItems *dseq=NULL;
+    DcmItem *ditem=NULL;
+  
+ -  if (EC_Normal == dset.search(DCM_RETIRED_AnnotationContentSequence, stack, ESM_fromHere, OFFalse))
+ +  if (EC_Normal == dset.search(DCM_RETIRED_AnnotationContentSequence, stack, ESM_fromHere, OFFalse) && (stack.top()->ident() == EVR_SQ))
+    {
+      dseq=(DcmSequenceOfItems *)stack.top();
+      if (dseq)
++diff --git a/dcmpstat/libsrc/dvpscu.cc b/dcmpstat/libsrc/dvpscu.cc
++index be3c81fe04..02a19452f1 100644
+ --- a/dcmpstat/libsrc/dvpscu.cc
+ +++ b/dcmpstat/libsrc/dvpscu.cc
+ @@ -1,6 +1,6 @@
+  /*
+   *
+ - *  Copyright (C) 1998-2020, OFFIS e.V.
+ + *  Copyright (C) 1998-2024, OFFIS e.V.
+   *  All rights reserved.  See COPYRIGHT file for details.
+   *
+   *  This software and supporting documentation were developed by
 -@@ -80,14 +80,14 @@
++@@ -80,14 +80,14 @@ OFCondition DVPSCurve::read(DcmItem &dset, Uint8 group)
+  
+    /* first we look for the Curve Data */
+    DcmTagKey key(0x5000 + group,0x3000);
+ -  if (EC_Normal == dset.search(key, stack, ESM_fromHere, OFFalse))
 -+  if (EC_Normal == dset.search(key, stack, ESM_fromHere, OFFalse) && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
+++  if (EC_Normal == dset.search(key, stack, ESM_fromHere, OFFalse) && stack.top()->isElement())
+    {
+      d_curveData = (DcmElement *)(stack.top());
+    } else return EC_IllegalCall;
+  
+    key.setElement(0x0005); // Curve Dimensions
+    stack.clear();
+ -  if (EC_Normal == dset.search(key, stack, ESM_fromHere, OFFalse))
 -+  if (EC_Normal == dset.search(key, stack, ESM_fromHere, OFFalse) && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
+++  if (EC_Normal == dset.search(key, stack, ESM_fromHere, OFFalse) && stack.top()->isElement())
+    {
+      d_curveDimensions = (DcmElement *)(stack.top());
+    } else return EC_IllegalCall;
 -@@ -101,42 +101,42 @@
++@@ -101,42 +101,42 @@ OFCondition DVPSCurve::read(DcmItem &dset, Uint8 group)
+  
+    key.setElement(0x0010); // Number of Points
+    stack.clear();
+ -  if (EC_Normal == dset.search(key, stack, ESM_fromHere, OFFalse))
 -+  if (EC_Normal == dset.search(key, stack, ESM_fromHere, OFFalse) && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
+++  if (EC_Normal == dset.search(key, stack, ESM_fromHere, OFFalse) && stack.top()->isElement())
+    {
+      d_numberOfPoints = (DcmElement *)(stack.top());
+    } else return EC_IllegalCall;
+  
+    key.setElement(0x0020); // Type of Data
+    stack.clear();
+ -  if (EC_Normal == dset.search(key, stack, ESM_fromHere, OFFalse))
 -+  if (EC_Normal == dset.search(key, stack, ESM_fromHere, OFFalse) && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
+++  if (EC_Normal == dset.search(key, stack, ESM_fromHere, OFFalse) && stack.top()->isElement())
+    {
+      d_typeOfData = (DcmElement *)(stack.top());
+    } else return EC_IllegalCall;
+  
+    key.setElement(0x0103); // Data Value Representation
+    stack.clear();
+ -  if (EC_Normal == dset.search(key, stack, ESM_fromHere, OFFalse))
 -+  if (EC_Normal == dset.search(key, stack, ESM_fromHere, OFFalse) && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
+++  if (EC_Normal == dset.search(key, stack, ESM_fromHere, OFFalse) && stack.top()->isElement())
+    {
+      d_dataVR = (DcmElement *)(stack.top());
+    } else return EC_IllegalCall;
+  
+    key.setElement(0x0022); // Curve Description
+    stack.clear();
+ -  if (EC_Normal == dset.search(key, stack, ESM_fromHere, OFFalse))
 -+  if (EC_Normal == dset.search(key, stack, ESM_fromHere, OFFalse) && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
+++  if (EC_Normal == dset.search(key, stack, ESM_fromHere, OFFalse) && stack.top()->isElement())
+    {
+      d_curveDescription = (DcmElement *)(stack.top());
+    }
+  
+    key.setElement(0x0030); // Axis Units
+    stack.clear();
+ -  if (EC_Normal == dset.search(key, stack, ESM_fromHere, OFFalse))
 -+  if (EC_Normal == dset.search(key, stack, ESM_fromHere, OFFalse) && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
+++  if (EC_Normal == dset.search(key, stack, ESM_fromHere, OFFalse) && stack.top()->isElement())
+    {
+      d_axisUnits = (DcmElement *)(stack.top());
+    }
+  
+    key.setElement(0x2500); // Curve Label
+    stack.clear();
+ -  if (EC_Normal == dset.search(key, stack, ESM_fromHere, OFFalse))
 -+  if (EC_Normal == dset.search(key, stack, ESM_fromHere, OFFalse) && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
+++  if (EC_Normal == dset.search(key, stack, ESM_fromHere, OFFalse) && stack.top()->isElement())
+    {
+      d_curveLabel = (DcmElement *)(stack.top());
+    }
++diff --git a/dcmpstat/libsrc/dvpsdal.cc b/dcmpstat/libsrc/dvpsdal.cc
++index 519aa977fd..969c182999 100644
+ --- a/dcmpstat/libsrc/dvpsdal.cc
+ +++ b/dcmpstat/libsrc/dvpsdal.cc
+ @@ -1,6 +1,6 @@
+  /*
+   *
+ - *  Copyright (C) 1999-2010, OFFIS e.V.
+ + *  Copyright (C) 1999-2024, OFFIS e.V.
+   *  All rights reserved.  See COPYRIGHT file for details.
+   *
+   *  This software and supporting documentation were developed by
 -@@ -67,7 +67,7 @@
++@@ -67,7 +67,7 @@ OFCondition DVPSDisplayedArea_PList::read(DcmItem &dset)
+    DcmSequenceOfItems *dseq=NULL;
+    DcmItem *ditem=NULL;
+    
+ -  if (EC_Normal == dset.search(DCM_DisplayedAreaSelectionSequence, stack, ESM_fromHere, OFFalse))
+ +  if (EC_Normal == dset.search(DCM_DisplayedAreaSelectionSequence, stack, ESM_fromHere, OFFalse) && (stack.top()->ident() == EVR_SQ))
+    {
+      dseq=(DcmSequenceOfItems *)stack.top();
+      if (dseq)
++diff --git a/dcmpstat/libsrc/dvpsfs.cc b/dcmpstat/libsrc/dvpsfs.cc
++index 5a5173c155..ba311b258e 100644
+ --- a/dcmpstat/libsrc/dvpsfs.cc
+ +++ b/dcmpstat/libsrc/dvpsfs.cc
+ @@ -1,6 +1,6 @@
+  /*
+   *
+ - *  Copyright (C) 1998-2021, OFFIS e.V.
+ + *  Copyright (C) 1998-2024, OFFIS e.V.
+   *  All rights reserved.  See COPYRIGHT file for details.
+   *
+   *  This software and supporting documentation were developed by
 -@@ -280,7 +280,7 @@
++@@ -280,7 +280,7 @@ OFBool DVPSFilmSession::printSCPCreate(
+      {
+        stack.clear();
+  
+ -      if (rqDataset && (EC_Normal == rqDataset->search(DCM_ReferencedPresentationLUTSequence, stack, ESM_fromHere, OFFalse)))
+ +      if (rqDataset && (EC_Normal == rqDataset->search(DCM_ReferencedPresentationLUTSequence, stack, ESM_fromHere, OFFalse)) && (stack.top()->ident() == EVR_SQ))
+        {
+          DcmSequenceOfItems *seq=(DcmSequenceOfItems *)stack.top();
+          if (seq->card() ==1)
 -@@ -480,7 +480,7 @@
++@@ -480,7 +480,7 @@ OFBool DVPSFilmSession::printSCPSet(
+    if (result)
+    {
+      stack.clear();
+ -    if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)numberOfCopies.getTag(), stack, ESM_fromHere, OFFalse)))
+ +    if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)numberOfCopies.getTag(), stack, ESM_fromHere, OFFalse)) && (stack.top()->ident() == EVR_IS))
+      {
+        numberOfCopies = *((DcmIntegerString *)(stack.top()));
+        Sint32 numCopies=0;
 -@@ -502,7 +502,7 @@
++@@ -502,7 +502,7 @@ OFBool DVPSFilmSession::printSCPSet(
+    if (result)
+    {
+      stack.clear();
+ -    if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)printPriority.getTag(), stack, ESM_fromHere, OFFalse)))
+ +    if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)printPriority.getTag(), stack, ESM_fromHere, OFFalse)) && (stack.top()->ident() == EVR_CS))
+      {
+        printPriority = *((DcmCodeString *)(stack.top()));
+        OFString aString;
 -@@ -523,7 +523,7 @@
++@@ -523,7 +523,7 @@ OFBool DVPSFilmSession::printSCPSet(
+    {
+      Uint32 numMediumTypes = cfg.getTargetPrinterNumberOfMediumTypes(cfgname);
+      stack.clear();
+ -    if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)mediumType.getTag(), stack, ESM_fromHere, OFFalse)))
+ +    if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)mediumType.getTag(), stack, ESM_fromHere, OFFalse)) && (stack.top()->ident() == EVR_CS))
+      {
+        mediumType = *((DcmCodeString *)(stack.top()));
+        OFString theMedium;
 -@@ -555,7 +555,7 @@
++@@ -555,7 +555,7 @@ OFBool DVPSFilmSession::printSCPSet(
+    {
+      Uint32 numFilmDestination = cfg.getTargetPrinterNumberOfFilmDestinations(cfgname);
+      stack.clear();
+ -    if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)filmDestination.getTag(), stack, ESM_fromHere, OFFalse)))
+ +    if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)filmDestination.getTag(), stack, ESM_fromHere, OFFalse)) && (stack.top()->ident() == EVR_CS))
+      {
+        filmDestination = *((DcmCodeString *)(stack.top()));
+        OFString theDestination;
 -@@ -586,7 +586,7 @@
++@@ -586,7 +586,7 @@ OFBool DVPSFilmSession::printSCPSet(
+    if (result)
+    {
+      stack.clear();
+ -    if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)filmSessionLabel.getTag(), stack, ESM_fromHere, OFFalse)))
+ +    if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)filmSessionLabel.getTag(), stack, ESM_fromHere, OFFalse)) && (stack.top()->ident() == EVR_LO))
+      {
+        filmSessionLabel = *((DcmLongString *)(stack.top()));
+        ADD_TO_PDATASET(DcmLongString, filmSessionLabel)
 -@@ -597,7 +597,7 @@
++@@ -597,7 +597,7 @@ OFBool DVPSFilmSession::printSCPSet(
+    if (result)
+    {
+      stack.clear();
+ -    if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)ownerID.getTag(), stack, ESM_fromHere, OFFalse)))
+ +    if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)ownerID.getTag(), stack, ESM_fromHere, OFFalse)) && (stack.top()->ident() == EVR_SH))
+      {
+        ownerID = *((DcmShortString *)(stack.top()));
+        ADD_TO_PDATASET(DcmShortString, ownerID)
 -@@ -611,7 +611,7 @@
++@@ -611,7 +611,7 @@ OFBool DVPSFilmSession::printSCPSet(
+      if (result)
+      {
+        stack.clear();
+ -      if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)illumination.getTag(), stack, ESM_fromHere, OFFalse)))
+ +      if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)illumination.getTag(), stack, ESM_fromHere, OFFalse)) && (stack.top()->ident() == EVR_US))
+        {
+          illumination = *((DcmUnsignedShort *)(stack.top()));
+          // we don't check illumination set by the user (for now)
 -@@ -623,7 +623,7 @@
++@@ -623,7 +623,7 @@ OFBool DVPSFilmSession::printSCPSet(
+      if (result)
+      {
+        stack.clear();
+ -      if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)reflectedAmbientLight.getTag(), stack, ESM_fromHere, OFFalse)))
+ +      if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)reflectedAmbientLight.getTag(), stack, ESM_fromHere, OFFalse)) && (stack.top()->ident() == EVR_US))
+        {
+          reflectedAmbientLight = *((DcmUnsignedShort *)(stack.top()));
+          // we don't check reflected ambient light set by the user (for now)
 -@@ -636,7 +636,7 @@
++@@ -636,7 +636,7 @@ OFBool DVPSFilmSession::printSCPSet(
+      {
+        stack.clear();
+  
+ -      if (rqDataset && (EC_Normal == rqDataset->search(DCM_ReferencedPresentationLUTSequence, stack, ESM_fromHere, OFFalse)))
+ +      if (rqDataset && (EC_Normal == rqDataset->search(DCM_ReferencedPresentationLUTSequence, stack, ESM_fromHere, OFFalse)) && (stack.top()->ident() == EVR_SQ))
+        {
+          DcmSequenceOfItems *seq=(DcmSequenceOfItems *)stack.top();
+          if (seq->card() ==1)
++diff --git a/dcmpstat/libsrc/dvpsgal.cc b/dcmpstat/libsrc/dvpsgal.cc
++index 909deac9e2..89d893de83 100644
+ --- a/dcmpstat/libsrc/dvpsgal.cc
+ +++ b/dcmpstat/libsrc/dvpsgal.cc
+ @@ -1,6 +1,6 @@
+  /*
+   *
+ - *  Copyright (C) 1998-2010, OFFIS e.V.
+ + *  Copyright (C) 1998-2024, OFFIS e.V.
+   *  All rights reserved.  See COPYRIGHT file for details.
+   *
+   *  This software and supporting documentation were developed by
 -@@ -69,7 +69,7 @@
++@@ -69,7 +69,7 @@ OFCondition DVPSGraphicAnnotation_PList::read(DcmItem &dset)
+    DcmSequenceOfItems *dseq=NULL;
+    DcmItem *ditem=NULL;
+  
+ -  if (EC_Normal == dset.search(DCM_GraphicAnnotationSequence, stack, ESM_fromHere, OFFalse))
+ +  if (EC_Normal == dset.search(DCM_GraphicAnnotationSequence, stack, ESM_fromHere, OFFalse) && (stack.top()->ident() == EVR_SQ))
+    {
+      dseq=(DcmSequenceOfItems *)stack.top();
+      if (dseq)
++diff --git a/dcmpstat/libsrc/dvpsgll.cc b/dcmpstat/libsrc/dvpsgll.cc
++index d82d208628..fbf5d97d72 100644
+ --- a/dcmpstat/libsrc/dvpsgll.cc
+ +++ b/dcmpstat/libsrc/dvpsgll.cc
+ @@ -1,6 +1,6 @@
+  /*
+   *
+ - *  Copyright (C) 1998-2017, OFFIS e.V.
+ + *  Copyright (C) 1998-2024, OFFIS e.V.
+   *  All rights reserved.  See COPYRIGHT file for details.
+   *
+   *  This software and supporting documentation were developed by
 -@@ -75,7 +75,7 @@
++@@ -75,7 +75,7 @@ OFCondition DVPSGraphicLayer_PList::read(DcmItem &dset)
+    DcmSequenceOfItems *dseq=NULL;
+    DcmItem *ditem=NULL;
+  
+ -  if (EC_Normal == dset.search(DCM_GraphicLayerSequence, stack, ESM_fromHere, OFFalse))
+ +  if (EC_Normal == dset.search(DCM_GraphicLayerSequence, stack, ESM_fromHere, OFFalse) && (stack.top()->ident() == EVR_SQ))
+    {
+      dseq=(DcmSequenceOfItems *)stack.top();
+      if (dseq)
++diff --git a/dcmpstat/libsrc/dvpsgrl.cc b/dcmpstat/libsrc/dvpsgrl.cc
++index 14d0e713f9..61dd6565c3 100644
+ --- a/dcmpstat/libsrc/dvpsgrl.cc
+ +++ b/dcmpstat/libsrc/dvpsgrl.cc
+ @@ -1,6 +1,6 @@
+  /*
+   *
+ - *  Copyright (C) 1998-2010, OFFIS e.V.
+ + *  Copyright (C) 1998-2024, OFFIS e.V.
+   *  All rights reserved.  See COPYRIGHT file for details.
+   *
+   *  This software and supporting documentation were developed by
 -@@ -66,7 +66,7 @@
++@@ -66,7 +66,7 @@ OFCondition DVPSGraphicObject_PList::read(DcmItem &dset)
+    DcmSequenceOfItems *dseq=NULL;
+    DcmItem *ditem=NULL;
+  
+ -  if (EC_Normal == dset.search(DCM_GraphicObjectSequence, stack, ESM_fromHere, OFFalse))
+ +  if (EC_Normal == dset.search(DCM_GraphicObjectSequence, stack, ESM_fromHere, OFFalse) && (stack.top()->ident() == EVR_SQ))
+    {
+      dseq=(DcmSequenceOfItems *)stack.top();
+      if (dseq)
++diff --git a/dcmpstat/libsrc/dvpshlp.cc b/dcmpstat/libsrc/dvpshlp.cc
++index 20b4429e45..fd1057a137 100644
+ --- a/dcmpstat/libsrc/dvpshlp.cc
+ +++ b/dcmpstat/libsrc/dvpshlp.cc
 -@@ -178,7 +178,7 @@
++@@ -163,7 +163,7 @@ OFBool DVPSHelper::haveReferencedUIDItem(DcmSequenceOfItems& seq, const char *ui
+    {
+      item = seq.getItem(i);
+      stack.clear();
+ -    if (EC_Normal == item->search(DCM_ReferencedSOPClassUID, stack, ESM_fromHere, OFFalse))
+ +    if (EC_Normal == item->search(DCM_ReferencedSOPClassUID, stack, ESM_fromHere, OFFalse) && (stack.top()->ident() == EVR_UI))
+      {
+        aString.clear();
+        refuid = (DcmUniqueIdentifier *)(stack.top());
++diff --git a/dcmpstat/libsrc/dvpsib.cc b/dcmpstat/libsrc/dvpsib.cc
++index 096c5b3e19..57fee5763b 100644
+ --- a/dcmpstat/libsrc/dvpsib.cc
+ +++ b/dcmpstat/libsrc/dvpsib.cc
+ @@ -1,6 +1,6 @@
+  /*
+   *
+ - *  Copyright (C) 1998-2018, OFFIS e.V.
+ + *  Copyright (C) 1998-2024, OFFIS e.V.
+   *  All rights reserved.  See COPYRIGHT file for details.
+   *
+   *  This software and supporting documentation were developed by
 -@@ -153,7 +153,7 @@
++@@ -153,7 +153,7 @@ OFCondition DVPSImageBoxContent::read(DcmItem &dset, DVPSPresentationLUT_PList&
+    if (result==EC_Normal)
+    {
+      stack.clear();
+ -    if (EC_Normal == dset.search(DCM_ReferencedImageSequence, stack, ESM_fromHere, OFFalse))
+ +    if (EC_Normal == dset.search(DCM_ReferencedImageSequence, stack, ESM_fromHere, OFFalse) && (stack.top()->ident() == EVR_SQ))
+      {
+        seq=(DcmSequenceOfItems *)stack.top();
+        if (seq->card() ==1)
 -@@ -181,7 +181,7 @@
++@@ -181,7 +181,7 @@ OFCondition DVPSImageBoxContent::read(DcmItem &dset, DVPSPresentationLUT_PList&
+      // check referenced presentation LUT sequence
+      // if there is any reference, it must refer to one of the presentation LUTs we are managing.
+      stack.clear();
+ -    if (EC_Normal == dset.search(DCM_ReferencedPresentationLUTSequence, stack, ESM_fromHere, OFFalse))
+ +    if (EC_Normal == dset.search(DCM_ReferencedPresentationLUTSequence, stack, ESM_fromHere, OFFalse) && (stack.top()->ident() == EVR_SQ))
+      {
+        seq=(DcmSequenceOfItems *)stack.top();
+        if (seq->card() ==1)
 -@@ -672,7 +672,7 @@
++@@ -672,7 +672,7 @@ OFBool DVPSImageBoxContent::printSCPSet(
+    if (result)
+    {
+      stack.clear();
+ -    if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)imageBoxPosition.getTag(), stack, ESM_fromHere, OFFalse)))
+ +    if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)imageBoxPosition.getTag(), stack, ESM_fromHere, OFFalse)) && (stack.top()->ident() == EVR_US))
+      {
+        imageBoxPosition = *((DcmUnsignedShort *)(stack.top()));
+        // the image box position is checked elsewhere
 -@@ -688,7 +688,7 @@
++@@ -688,7 +688,7 @@ OFBool DVPSImageBoxContent::printSCPSet(
+    if (result)
+    {
+      stack.clear();
+ -    if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)magnificationType.getTag(), stack, ESM_fromHere, OFFalse)))
+ +    if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)magnificationType.getTag(), stack, ESM_fromHere, OFFalse)) && (stack.top()->ident() == EVR_CS))
+      {
+        magnificationType = *((DcmCodeString *)(stack.top()));
+        Uint32 numMagnifications = cfg.getTargetPrinterNumberOfMagnificationTypes(cfgname);
 -@@ -721,7 +721,7 @@
++@@ -721,7 +721,7 @@ OFBool DVPSImageBoxContent::printSCPSet(
+    {
+  
+      stack.clear();
+ -    if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)smoothingType.getTag(), stack, ESM_fromHere, OFFalse)))
+ +    if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)smoothingType.getTag(), stack, ESM_fromHere, OFFalse)) && (stack.top()->ident() == EVR_CS))
+      {
+        smoothingType = *((DcmCodeString *)(stack.top()));
+        Uint32 numSmoothings = cfg.getTargetPrinterNumberOfSmoothingTypes(cfgname);
 -@@ -761,7 +761,7 @@
++@@ -761,7 +761,7 @@ OFBool DVPSImageBoxContent::printSCPSet(
+    if (result)
+    {
+      stack.clear();
+ -    if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)configurationInformation.getTag(), stack, ESM_fromHere, OFFalse)))
+ +    if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)configurationInformation.getTag(), stack, ESM_fromHere, OFFalse)) && (stack.top()->ident() == EVR_ST))
+      {
+        configurationInformation = *((DcmShortText *)(stack.top()));
+        Uint32 numConfigurationInformation = cfg.getTargetPrinterNumberOfConfigurationSettings(cfgname);
 -@@ -800,7 +800,7 @@
++@@ -800,7 +800,7 @@ OFBool DVPSImageBoxContent::printSCPSet(
+    if (result)
+    {
+      stack.clear();
+ -    if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)polarity.getTag(), stack, ESM_fromHere, OFFalse)))
+ +    if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)polarity.getTag(), stack, ESM_fromHere, OFFalse)) && (stack.top()->ident() == EVR_CS))
+      {
+        polarity = *((DcmCodeString *)(stack.top()));
+        OFString thePolarity;
 -@@ -820,7 +820,7 @@
++@@ -820,7 +820,7 @@ OFBool DVPSImageBoxContent::printSCPSet(
+    if (result)
+    {
+      stack.clear();
+ -    if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)requestedImageSize.getTag(), stack, ESM_fromHere, OFFalse)))
+ +    if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)requestedImageSize.getTag(), stack, ESM_fromHere, OFFalse)) && (stack.top()->ident() == EVR_DS))
+      {
+        if (! cfg.getTargetPrinterSupportsRequestedImageSize(cfgname))
+        {
 -@@ -841,7 +841,7 @@
++@@ -841,7 +841,7 @@ OFBool DVPSImageBoxContent::printSCPSet(
+    if (result)
+    {
+      stack.clear();
+ -    if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)requestedDecimateCropBehavior.getTag(), stack, ESM_fromHere, OFFalse)))
+ +    if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)requestedDecimateCropBehavior.getTag(), stack, ESM_fromHere, OFFalse)) && (stack.top()->ident() == EVR_CS))
+      {
+        if (! cfg.getTargetPrinterSupportsDecimateCrop(cfgname))
+        {
 -@@ -871,7 +871,7 @@
++@@ -871,7 +871,7 @@ OFBool DVPSImageBoxContent::printSCPSet(
+    if (result)
+    {
+      stack.clear();
+ -    if (rqDataset && (EC_Normal == rqDataset->search(DCM_BasicGrayscaleImageSequence, stack, ESM_fromHere, OFFalse)))
+ +    if (rqDataset && (EC_Normal == rqDataset->search(DCM_BasicGrayscaleImageSequence, stack, ESM_fromHere, OFFalse)) && (stack.top()->ident() == EVR_SQ))
+      {
+        DcmSequenceOfItems *seq=(DcmSequenceOfItems *)stack.top();
+        if (seq->card() ==1)
 -@@ -971,7 +971,7 @@
++@@ -971,7 +971,7 @@ OFBool DVPSImageBoxContent::printSCPEvaluateBasicGrayscaleImageSequence(
+    if (result)
+    {
+      stack.clear();
+ -    if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)samplesPerPixel.getTag(), stack, ESM_fromHere, OFFalse)))
+ +    if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)samplesPerPixel.getTag(), stack, ESM_fromHere, OFFalse)) && (stack.top()->ident() == EVR_US))
+      {
+        samplesPerPixel = *((DcmUnsignedShort *)(stack.top()));
+        val = 0;
 -@@ -994,7 +994,7 @@
++@@ -994,7 +994,7 @@ OFBool DVPSImageBoxContent::printSCPEvaluateBasicGrayscaleImageSequence(
+    if (result)
+    {
+      stack.clear();
+ -    if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)rows.getTag(), stack, ESM_fromHere, OFFalse)))
+ +    if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)rows.getTag(), stack, ESM_fromHere, OFFalse)) && (stack.top()->ident() == EVR_US))
+      {
+        rows = *((DcmUnsignedShort *)(stack.top()));
+        val = 0;
 -@@ -1017,7 +1017,7 @@
++@@ -1017,7 +1017,7 @@ OFBool DVPSImageBoxContent::printSCPEvaluateBasicGrayscaleImageSequence(
+    if (result)
+    {
+      stack.clear();
+ -    if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)columns.getTag(), stack, ESM_fromHere, OFFalse)))
+ +    if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)columns.getTag(), stack, ESM_fromHere, OFFalse)) && (stack.top()->ident() == EVR_US))
+      {
+        columns = *((DcmUnsignedShort *)(stack.top()));
+        val = 0;
 -@@ -1042,7 +1042,7 @@
++@@ -1042,7 +1042,7 @@ OFBool DVPSImageBoxContent::printSCPEvaluateBasicGrayscaleImageSequence(
+    if (result)
+    {
+      stack.clear();
+ -    if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)bitsStored.getTag(), stack, ESM_fromHere, OFFalse)))
+ +    if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)bitsStored.getTag(), stack, ESM_fromHere, OFFalse)) && (stack.top()->ident() == EVR_US))
+      {
+        bitsStored = *((DcmUnsignedShort *)(stack.top()));
+        val = 0;
 -@@ -1082,7 +1082,7 @@
++@@ -1082,7 +1082,7 @@ OFBool DVPSImageBoxContent::printSCPEvaluateBasicGrayscaleImageSequence(
+    if (result)
+    {
+      stack.clear();
+ -    if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)bitsAllocated.getTag(), stack, ESM_fromHere, OFFalse)))
+ +    if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)bitsAllocated.getTag(), stack, ESM_fromHere, OFFalse)) && (stack.top()->ident() == EVR_US))
+      {
+        bitsAllocated = *((DcmUnsignedShort *)(stack.top()));
+        val = 0;
 -@@ -1105,7 +1105,7 @@
++@@ -1105,7 +1105,7 @@ OFBool DVPSImageBoxContent::printSCPEvaluateBasicGrayscaleImageSequence(
+    if (result)
+    {
+      stack.clear();
+ -    if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)highBit.getTag(), stack, ESM_fromHere, OFFalse)))
+ +    if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)highBit.getTag(), stack, ESM_fromHere, OFFalse)) && (stack.top()->ident() == EVR_US))
+      {
+        highBit = *((DcmUnsignedShort *)(stack.top()));
+        val = 0;
 -@@ -1128,7 +1128,7 @@
++@@ -1128,7 +1128,7 @@ OFBool DVPSImageBoxContent::printSCPEvaluateBasicGrayscaleImageSequence(
+    if (result)
+    {
+      stack.clear();
+ -    if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)pixelRepresentation.getTag(), stack, ESM_fromHere, OFFalse)))
+ +    if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)pixelRepresentation.getTag(), stack, ESM_fromHere, OFFalse)) && (stack.top()->ident() == EVR_US))
+      {
+        pixelRepresentation = *((DcmUnsignedShort *)(stack.top()));
+        val = 0;
 -@@ -1151,7 +1151,7 @@
++@@ -1151,7 +1151,7 @@ OFBool DVPSImageBoxContent::printSCPEvaluateBasicGrayscaleImageSequence(
+    if (result)
+    {
+      stack.clear();
+ -    if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)photometricInterpretation.getTag(), stack, ESM_fromHere, OFFalse)))
+ +    if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)photometricInterpretation.getTag(), stack, ESM_fromHere, OFFalse)) && (stack.top()->ident() == EVR_CS))
+      {
+        photometricInterpretation = *((DcmCodeString *)(stack.top()));
+        OFString theColorModel;
 -@@ -1175,7 +1175,7 @@
++@@ -1175,7 +1175,7 @@ OFBool DVPSImageBoxContent::printSCPEvaluateBasicGrayscaleImageSequence(
+    if (result)
+    {
+      stack.clear();
+ -    if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)pixelAspectRatio.getTag(), stack, ESM_fromHere, OFFalse)))
+ +    if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)pixelAspectRatio.getTag(), stack, ESM_fromHere, OFFalse)) && (stack.top()->ident() == EVR_IS))
+      {
+        pixelAspectRatio = *((DcmIntegerString *)(stack.top()));
+        if (pixelAspectRatio.getVM() != 2)
 -@@ -1193,7 +1193,7 @@
++@@ -1193,7 +1193,7 @@ OFBool DVPSImageBoxContent::printSCPEvaluateBasicGrayscaleImageSequence(
+    if (result)
+    {
+      stack.clear();
+ -    if (rqDataset && (EC_Normal == rqDataset->search(DCM_PixelData, stack, ESM_fromHere, OFFalse)))
 -+    if (rqDataset && (EC_Normal == rqDataset->search(DCM_PixelData, stack, ESM_fromHere, OFFalse)) && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
+++    if (rqDataset && (EC_Normal == rqDataset->search(DCM_PixelData, stack, ESM_fromHere, OFFalse)) && stack.top()->isElement())
+      {
+        pixelData = new DcmPixelData(DCM_PixelData);
+        if (pixelData)
++diff --git a/dcmpstat/libsrc/dvpsibl.cc b/dcmpstat/libsrc/dvpsibl.cc
++index e3768d5a0d..ef069eb845 100644
+ --- a/dcmpstat/libsrc/dvpsibl.cc
+ +++ b/dcmpstat/libsrc/dvpsibl.cc
+ @@ -1,6 +1,6 @@
+  /*
+   *
+ - *  Copyright (C) 1999-2010, OFFIS e.V.
+ + *  Copyright (C) 1999-2024, OFFIS e.V.
+   *  All rights reserved.  See COPYRIGHT file for details.
+   *
+   *  This software and supporting documentation were developed by
 -@@ -68,7 +68,7 @@
++@@ -68,7 +68,7 @@ OFCondition DVPSImageBoxContent_PList::read(DcmItem &dset, DVPSPresentationLUT_P
+    DcmSequenceOfItems *dseq=NULL;
+    DcmItem *ditem=NULL;
+    
+ -  if (EC_Normal == dset.search(DCM_RETIRED_ImageBoxContentSequence, stack, ESM_fromHere, OFFalse))
+ +  if (EC_Normal == dset.search(DCM_RETIRED_ImageBoxContentSequence, stack, ESM_fromHere, OFFalse) && (stack.top()->ident() == EVR_SQ))
+    {
+      dseq=(DcmSequenceOfItems *)stack.top();
+      if (dseq)
++diff --git a/dcmpstat/libsrc/dvpspll.cc b/dcmpstat/libsrc/dvpspll.cc
++index 1b2b7a35bb..46465171c7 100644
+ --- a/dcmpstat/libsrc/dvpspll.cc
+ +++ b/dcmpstat/libsrc/dvpspll.cc
+ @@ -1,6 +1,6 @@
+  /*
+   *
+ - *  Copyright (C) 1999-2022, OFFIS e.V.
+ + *  Copyright (C) 1999-2024, OFFIS e.V.
+   *  All rights reserved.  See COPYRIGHT file for details.
+   *
+   *  This software and supporting documentation were developed by
 -@@ -72,7 +72,7 @@
++@@ -72,7 +72,7 @@ OFCondition DVPSPresentationLUT_PList::read(DcmItem &dset)
+    DcmSequenceOfItems *dseq=NULL;
+    DcmItem *ditem=NULL;
+  
+ -  if (EC_Normal == dset.search(DCM_RETIRED_PresentationLUTContentSequence, stack, ESM_fromHere, OFFalse))
+ +  if (EC_Normal == dset.search(DCM_RETIRED_PresentationLUTContentSequence, stack, ESM_fromHere, OFFalse) && (stack.top()->ident() == EVR_SQ))
+    {
+      dseq=(DcmSequenceOfItems *)stack.top();
+      if (dseq)
++diff --git a/dcmpstat/libsrc/dvpsril.cc b/dcmpstat/libsrc/dvpsril.cc
++index 793e69063a..9dee1f6bfd 100644
+ --- a/dcmpstat/libsrc/dvpsril.cc
+ +++ b/dcmpstat/libsrc/dvpsril.cc
 -@@ -71,7 +71,7 @@
++@@ -1,6 +1,6 @@
++ /*
++  *
++- *  Copyright (C) 1998-2022, OFFIS e.V.
+++ *  Copyright (C) 1998-2024, OFFIS e.V.
++  *  All rights reserved.  See COPYRIGHT file for details.
++  *
++  *  This software and supporting documentation were developed by
++@@ -71,7 +71,7 @@ OFCondition DVPSReferencedImage_PList::read(DcmItem &dset)
+    DcmSequenceOfItems *dseq=NULL;
+    DcmItem *ditem=NULL;
+  
+ -  if (EC_Normal == dset.search(DCM_ReferencedImageSequence, stack, ESM_fromHere, OFFalse))
+ +  if (EC_Normal == dset.search(DCM_ReferencedImageSequence, stack, ESM_fromHere, OFFalse) && (stack.top()->ident() == EVR_SQ))
+    {
+      dseq=(DcmSequenceOfItems *)stack.top();
+      if (dseq)
++diff --git a/dcmpstat/libsrc/dvpsrsl.cc b/dcmpstat/libsrc/dvpsrsl.cc
++index 4b0c83aa75..d2f9dcfffd 100644
+ --- a/dcmpstat/libsrc/dvpsrsl.cc
+ +++ b/dcmpstat/libsrc/dvpsrsl.cc
+ @@ -1,6 +1,6 @@
+  /*
+   *
+ - *  Copyright (C) 1998-2010, OFFIS e.V.
+ + *  Copyright (C) 1998-2024, OFFIS e.V.
+   *  All rights reserved.  See COPYRIGHT file for details.
+   *
+   *  This software and supporting documentation were developed by
 -@@ -69,7 +69,7 @@
++@@ -69,7 +69,7 @@ OFCondition DVPSReferencedSeries_PList::read(DcmItem &dset)
+    DcmSequenceOfItems *dseq=NULL;
+    DcmItem *ditem=NULL;
+  
+ -  if (EC_Normal == dset.search(DCM_ReferencedSeriesSequence, stack, ESM_fromHere, OFFalse))
+ +  if (EC_Normal == dset.search(DCM_ReferencedSeriesSequence, stack, ESM_fromHere, OFFalse) && (stack.top()->ident() == EVR_SQ))
+    {
+      dseq=(DcmSequenceOfItems *)stack.top();
+      if (dseq)
++diff --git a/dcmpstat/libsrc/dvpssp.cc b/dcmpstat/libsrc/dvpssp.cc
++index 98b1201a7f..717c814607 100644
+ --- a/dcmpstat/libsrc/dvpssp.cc
+ +++ b/dcmpstat/libsrc/dvpssp.cc
+ @@ -1,6 +1,6 @@
+  /*
+   *
+ - *  Copyright (C) 1998-2021, OFFIS e.V.
+ + *  Copyright (C) 1998-2024, OFFIS e.V.
+   *  All rights reserved.  See COPYRIGHT file for details.
+   *
+   *  This software and supporting documentation were developed by
 -@@ -328,7 +328,7 @@
++@@ -328,7 +328,7 @@ OFCondition DVPSStoredPrint::read(DcmItem &dset)
+    if (result==EC_Normal)
+    {
+      stack.clear();
+ -    if (EC_Normal == dset.search(DCM_RETIRED_FilmBoxContentSequence, stack, ESM_fromHere, OFFalse))
+ +    if (EC_Normal == dset.search(DCM_RETIRED_FilmBoxContentSequence, stack, ESM_fromHere, OFFalse) && (stack.top()->ident() == EVR_SQ))
+      {
+        seq=(DcmSequenceOfItems *)stack.top();
+        if (seq->card() ==1)
 -@@ -362,7 +362,7 @@
++@@ -362,7 +362,7 @@ OFCondition DVPSStoredPrint::read(DcmItem &dset)
+           // check referenced presentation LUT sequence
+           // if there is any reference, it must refer to one of the presentation LUTs we are managing.
+           stack.clear();
+ -         if (EC_Normal == item->search(DCM_ReferencedPresentationLUTSequence, stack, ESM_fromHere, OFFalse))
+ +         if (EC_Normal == item->search(DCM_ReferencedPresentationLUTSequence, stack, ESM_fromHere, OFFalse) && (stack.top()->ident() == EVR_SQ))
+           {
+             seq=(DcmSequenceOfItems *)stack.top();
+             if (seq->card() ==1)
 -@@ -445,7 +445,7 @@
++@@ -445,7 +445,7 @@ OFCondition DVPSStoredPrint::read(DcmItem &dset)
+    if (result==EC_Normal)
+    {
+      stack.clear();
+ -    if (EC_Normal == dset.search(DCM_RETIRED_PrintManagementCapabilitiesSequence, stack, ESM_fromHere, OFFalse))
+ +    if (EC_Normal == dset.search(DCM_RETIRED_PrintManagementCapabilitiesSequence, stack, ESM_fromHere, OFFalse) && (stack.top()->ident() == EVR_SQ))
+      {
+        OFBool haveFilmBox = OFFalse;
+        OFBool haveGrayscaleImageBox = OFFalse;
 -@@ -511,7 +511,7 @@
++@@ -511,7 +511,7 @@ OFCondition DVPSStoredPrint::read(DcmItem &dset)
+      destination.clear();
+      printerName.clear();
+      stack.clear();
+ -    if (EC_Normal == dset.search(DCM_RETIRED_PrinterCharacteristicsSequence, stack, ESM_fromHere, OFFalse))
+ +    if (EC_Normal == dset.search(DCM_RETIRED_PrinterCharacteristicsSequence, stack, ESM_fromHere, OFFalse) && (stack.top()->ident() == EVR_SQ))
+      {
+        seq = (DcmSequenceOfItems *)stack.top();
+        if (seq->card() > 0)
 -@@ -1536,7 +1536,7 @@
++@@ -1536,7 +1536,7 @@ OFCondition DVPSStoredPrint::printSCUcreateBasicFilmBox(DVPSPrintMessageHandler&
+      {
+        // N-CREATE was successful, now evaluate Referenced Image Box SQ
+        stack.clear();
+ -      if (EC_Normal == attributeListOut->search(DCM_ReferencedImageBoxSequence, stack, ESM_fromHere, OFFalse))
+ +      if (EC_Normal == attributeListOut->search(DCM_ReferencedImageBoxSequence, stack, ESM_fromHere, OFFalse) && (stack.top()->ident() == EVR_SQ))
+        {
+          seq=(DcmSequenceOfItems *)stack.top();
+          numItems = (size_t)seq->card();
 -@@ -1559,7 +1559,7 @@
++@@ -1559,7 +1559,7 @@ OFCondition DVPSStoredPrint::printSCUcreateBasicFilmBox(DVPSPrintMessageHandler&
+        // evaluate Referenced Basic Annotation Box SQ if present
+        stack.clear();
+        annotationContentList.clearAnnotationSOPInstanceUIDs();
+ -      if (EC_Normal == attributeListOut->search(DCM_ReferencedBasicAnnotationBoxSequence, stack, ESM_fromHere, OFFalse))
+ +      if (EC_Normal == attributeListOut->search(DCM_ReferencedBasicAnnotationBoxSequence, stack, ESM_fromHere, OFFalse) && (stack.top()->ident() == EVR_SQ))
+        {
+          seq=(DcmSequenceOfItems *)stack.top();
+          numItems = (size_t)seq->card();
 -@@ -2419,7 +2419,7 @@
++@@ -2419,7 +2419,7 @@ OFBool DVPSStoredPrint::printSCPCreate(
+      {
+        stack.clear();
+  
+ -      if (rqDataset && (EC_Normal == rqDataset->search(DCM_ReferencedPresentationLUTSequence, stack, ESM_fromHere, OFFalse)))
+ +      if (rqDataset && (EC_Normal == rqDataset->search(DCM_ReferencedPresentationLUTSequence, stack, ESM_fromHere, OFFalse)) && (stack.top()->ident() == EVR_SQ))
+        {
+          DcmSequenceOfItems *seq=(DcmSequenceOfItems *)stack.top();
+          if (seq->card() ==1)
 -@@ -2487,7 +2487,7 @@
++@@ -2487,7 +2487,7 @@ OFBool DVPSStoredPrint::printSCPCreate(
+    {
+      stack.clear();
+  
+ -    if (rqDataset && (EC_Normal == rqDataset->search(DCM_ReferencedFilmSessionSequence, stack, ESM_fromHere, OFFalse)))
+ +    if (rqDataset && (EC_Normal == rqDataset->search(DCM_ReferencedFilmSessionSequence, stack, ESM_fromHere, OFFalse)) && (stack.top()->ident() == EVR_SQ))
+      {
+        DcmUniqueIdentifier classUID(DCM_ReferencedSOPClassUID);
+        DcmUniqueIdentifier instanceUID(DCM_ReferencedSOPInstanceUID);
 -@@ -2706,7 +2706,7 @@
++@@ -2706,7 +2706,7 @@ OFBool DVPSStoredPrint::printSCPSet(
+    if (result)
+    {
+      stack.clear();
+ -    if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)magnificationType.getTag(), stack, ESM_fromHere, OFFalse)))
+ +    if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)magnificationType.getTag(), stack, ESM_fromHere, OFFalse)) && (stack.top()->ident() == EVR_CS))
+      {
+        magnificationType = *((DcmCodeString *)(stack.top()));
+        Uint32 numMagnifications = cfg.getTargetPrinterNumberOfMagnificationTypes(cfgname);
 -@@ -2739,7 +2739,7 @@
++@@ -2739,7 +2739,7 @@ OFBool DVPSStoredPrint::printSCPSet(
+    {
+  
+      stack.clear();
+ -    if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)smoothingType.getTag(), stack, ESM_fromHere, OFFalse)))
+ +    if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)smoothingType.getTag(), stack, ESM_fromHere, OFFalse)) && (stack.top()->ident() == EVR_CS))
+      {
+        smoothingType = *((DcmCodeString *)(stack.top()));
+        Uint32 numSmoothings = cfg.getTargetPrinterNumberOfSmoothingTypes(cfgname);
 -@@ -2781,7 +2781,7 @@
++@@ -2781,7 +2781,7 @@ OFBool DVPSStoredPrint::printSCPSet(
+    {
+  
+      stack.clear();
+ -    if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)borderDensity.getTag(), stack, ESM_fromHere, OFFalse)))
+ +    if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)borderDensity.getTag(), stack, ESM_fromHere, OFFalse)) && (stack.top()->ident() == EVR_CS))
+      {
+        borderDensity = *((DcmCodeString *)(stack.top()));
+        Uint32 numBorderDensities = cfg.getTargetPrinterNumberOfBorderDensities(cfgname);
 -@@ -2832,7 +2832,7 @@
++@@ -2832,7 +2832,7 @@ OFBool DVPSStoredPrint::printSCPSet(
+    if (result)
+    {
+      stack.clear();
+ -    if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)emptyImageDensity.getTag(), stack, ESM_fromHere, OFFalse)))
+ +    if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)emptyImageDensity.getTag(), stack, ESM_fromHere, OFFalse)) && (stack.top()->ident() == EVR_CS))
+      {
+        emptyImageDensity = *((DcmCodeString *)(stack.top()));
+        Uint32 numEmptyImageDensities = cfg.getTargetPrinterNumberOfEmptyImageDensities(cfgname);
 -@@ -2883,7 +2883,7 @@
++@@ -2883,7 +2883,7 @@ OFBool DVPSStoredPrint::printSCPSet(
+    if (result)
+    {
+      stack.clear();
+ -    if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)maxDensity.getTag(), stack, ESM_fromHere, OFFalse)))
+ +    if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)maxDensity.getTag(), stack, ESM_fromHere, OFFalse)) && (stack.top()->ident() == EVR_US))
+      {
+        maxDensity = *((DcmUnsignedShort *)(stack.top()));
+        // we don't check a max density set by the user (for now)
 -@@ -2895,7 +2895,7 @@
++@@ -2895,7 +2895,7 @@ OFBool DVPSStoredPrint::printSCPSet(
+    if (result)
+    {
+      stack.clear();
+ -    if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)minDensity.getTag(), stack, ESM_fromHere, OFFalse)))
+ +    if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)minDensity.getTag(), stack, ESM_fromHere, OFFalse)) && (stack.top()->ident() == EVR_US))
+      {
+        minDensity = *((DcmUnsignedShort *)(stack.top()));
+        Uint32 numMinDensities = cfg.getTargetPrinterNumberOfMinDensities(cfgname);
 -@@ -2917,7 +2917,7 @@
++@@ -2917,7 +2917,7 @@ OFBool DVPSStoredPrint::printSCPSet(
+    if (result)
+    {
+      stack.clear();
+ -    if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)trim.getTag(), stack, ESM_fromHere, OFFalse)))
+ +    if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)trim.getTag(), stack, ESM_fromHere, OFFalse)) && (stack.top()->ident() == EVR_CS))
+      {
+        trim = *((DcmCodeString *)(stack.top()));
+  
 -@@ -2945,7 +2945,7 @@
++@@ -2945,7 +2945,7 @@ OFBool DVPSStoredPrint::printSCPSet(
+    if (result)
+    {
+      stack.clear();
+ -    if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)configurationInformation.getTag(), stack, ESM_fromHere, OFFalse)))
+ +    if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)configurationInformation.getTag(), stack, ESM_fromHere, OFFalse)) && (stack.top()->ident() == EVR_ST))
+      {
+        configurationInformation = *((DcmShortText *)(stack.top()));
+        Uint32 numConfigurationInformation = cfg.getTargetPrinterNumberOfConfigurationSettings(cfgname);
 -@@ -2987,7 +2987,7 @@
++@@ -2987,7 +2987,7 @@ OFBool DVPSStoredPrint::printSCPSet(
+      if (result)
+      {
+        stack.clear();
+ -      if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)illumination.getTag(), stack, ESM_fromHere, OFFalse)))
+ +      if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)illumination.getTag(), stack, ESM_fromHere, OFFalse)) && (stack.top()->ident() == EVR_US))
+        {
+          illumination = *((DcmUnsignedShort *)(stack.top()));
+          // we don't check illumination set by the user (for now)
 -@@ -2999,7 +2999,7 @@
++@@ -2999,7 +2999,7 @@ OFBool DVPSStoredPrint::printSCPSet(
+      if (result)
+      {
+        stack.clear();
+ -      if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)reflectedAmbientLight.getTag(), stack, ESM_fromHere, OFFalse)))
+ +      if (rqDataset && (EC_Normal == rqDataset->search((DcmTagKey &)reflectedAmbientLight.getTag(), stack, ESM_fromHere, OFFalse)) && (stack.top()->ident() == EVR_US))
+        {
+          reflectedAmbientLight = *((DcmUnsignedShort *)(stack.top()));
+          // we don't check reflected ambient light set by the user (for now)
 -@@ -3012,7 +3012,7 @@
++@@ -3012,7 +3012,7 @@ OFBool DVPSStoredPrint::printSCPSet(
+      {
+        stack.clear();
+  
+ -      if (rqDataset && (EC_Normal == rqDataset->search(DCM_ReferencedPresentationLUTSequence, stack, ESM_fromHere, OFFalse)))
+ +      if (rqDataset && (EC_Normal == rqDataset->search(DCM_ReferencedPresentationLUTSequence, stack, ESM_fromHere, OFFalse)) && (stack.top()->ident() == EVR_SQ))
+        {
+          DcmSequenceOfItems *seq=(DcmSequenceOfItems *)stack.top();
+          if (seq->card() ==1)
++diff --git a/dcmpstat/libsrc/dvpstxl.cc b/dcmpstat/libsrc/dvpstxl.cc
++index ffb6dcc10e..8e35ff7ae6 100644
+ --- a/dcmpstat/libsrc/dvpstxl.cc
+ +++ b/dcmpstat/libsrc/dvpstxl.cc
+ @@ -1,6 +1,6 @@
+  /*
+   *
+ - *  Copyright (C) 1998-2010, OFFIS e.V.
+ + *  Copyright (C) 1998-2024, OFFIS e.V.
+   *  All rights reserved.  See COPYRIGHT file for details.
+   *
+   *  This software and supporting documentation were developed by
 -@@ -66,7 +66,7 @@
++@@ -66,7 +66,7 @@ OFCondition DVPSTextObject_PList::read(DcmItem &dset)
+    DcmSequenceOfItems *dseq=NULL;
+    DcmItem *ditem=NULL;
+  
+ -  if (EC_Normal == dset.search(DCM_TextObjectSequence, stack, ESM_fromHere, OFFalse))
+ +  if (EC_Normal == dset.search(DCM_TextObjectSequence, stack, ESM_fromHere, OFFalse) && (stack.top()->ident() == EVR_SQ))
+    {
+      dseq=(DcmSequenceOfItems *)stack.top();
+      if (dseq)
++diff --git a/dcmpstat/libsrc/dvpsvll.cc b/dcmpstat/libsrc/dvpsvll.cc
++index 3859f4ab96..17a6277071 100644
+ --- a/dcmpstat/libsrc/dvpsvll.cc
+ +++ b/dcmpstat/libsrc/dvpsvll.cc
+ @@ -1,6 +1,6 @@
+  /*
+   *
+ - *  Copyright (C) 1998-2010, OFFIS e.V.
+ + *  Copyright (C) 1998-2024, OFFIS e.V.
+   *  All rights reserved.  See COPYRIGHT file for details.
+   *
+   *  This software and supporting documentation were developed by
 -@@ -66,7 +66,7 @@
++@@ -66,7 +66,7 @@ OFCondition DVPSVOILUT_PList::read(DcmItem &dset)
+    DcmSequenceOfItems *dseq=NULL;
+    DcmItem *ditem=NULL;
+  
+ -  if (EC_Normal == dset.search(DCM_VOILUTSequence, stack, ESM_fromHere, OFFalse))
+ +  if (EC_Normal == dset.search(DCM_VOILUTSequence, stack, ESM_fromHere, OFFalse) && (stack.top()->ident() == EVR_SQ))
+    {
+      dseq=(DcmSequenceOfItems *)stack.top();
+      if (dseq)
++diff --git a/dcmrt/libsrc/drttypes.cc b/dcmrt/libsrc/drttypes.cc
++index 3aee4312f2..77ff1674c6 100644
+ --- a/dcmrt/libsrc/drttypes.cc
+ +++ b/dcmrt/libsrc/drttypes.cc
+ @@ -1,14 +1,12 @@
+  /*
+   *
+ - *  Copyright (c) 2008-2021, OFFIS e.V. and ICSMED AG, Oldenburg, Germany
+ - *  Copyright (C) 2013-2021, J. Riesmeier, Oldenburg, Germany
+ + *  Copyright (c) 2008-2024, OFFIS e.V. and ICSMED AG, Oldenburg, Germany
+ + *  Copyright (C) 2013-2024, J. Riesmeier, Oldenburg, Germany
+   *  All rights reserved.  See COPYRIGHT file for details.
+   *
+   *  Source file for class DRTTypes
+   *
+   *  Generated manually based on dsrtypes.cc
+ - *  File created on 2008-12-05
+ - *  Last modified on 2016-02-12 by Riesmeier
+   *
+   */
+  
 -@@ -212,7 +210,7 @@
++@@ -212,7 +210,7 @@ OFCondition DRTTypes::getAndCheckStringValueFromDataset(DcmItem &dataset,
+  {
+      DcmStack stack;
+      OFCondition result = dataset.search(tagKey, stack, ESM_fromHere, OFFalse /*searchIntoSub*/);
+ -    if (result.good())
 -+    if (result.good() && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
+++    if (result.good() && stack.top()->isElement())
+      {
+          DcmElement *element = OFstatic_cast(DcmElement *, stack.top());
+          if (element != NULL)
++diff --git a/dcmsign/libsrc/dcsignat.cc b/dcmsign/libsrc/dcsignat.cc
++index b104ec1e81..c5b57099a4 100644
+ --- a/dcmsign/libsrc/dcsignat.cc
+ +++ b/dcmsign/libsrc/dcsignat.cc
 -@@ -102,7 +102,7 @@
++@@ -1,6 +1,6 @@
++ /*
++  *
++- *  Copyright (C) 2000-2023, OFFIS e.V.
+++ *  Copyright (C) 2000-2024, OFFIS e.V.
++  *  All rights reserved.  See COPYRIGHT file for details.
++  *
++  *  This software and supporting documentation were developed by
++@@ -104,7 +104,7 @@ OFCondition DcmSignature::getMACIDnumber(DcmItem &item, Uint16& macid)
+    macid = 0xFFFF;
+    DcmStack stack;
+    OFCondition result = item.search(DCM_MACIDNumber, stack, ESM_fromHere, OFFalse);
+ -  if (result.good() && (stack.top()->isLeaf()))
 -+  if (result.good() && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
+++  if (result.good() && (stack.top()->isElement()))
+    {
+      result = ((DcmElement *)(stack.top()))->getUint16(macid);
+    }
 -@@ -732,7 +732,7 @@
++@@ -734,7 +734,7 @@ OFCondition DcmSignature::verifyCurrent()
+    // read MAC Calculation Transfer Syntax UID
+    if (result.good())
+    {
+ -    if ((selectedMacParametersItem->search(DCM_MACCalculationTransferSyntaxUID, stack, ESM_fromHere, OFFalse)).good() && (stack.top()->isLeaf()))
 -+    if ((selectedMacParametersItem->search(DCM_MACCalculationTransferSyntaxUID, stack, ESM_fromHere, OFFalse)).good() && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
+++    if ((selectedMacParametersItem->search(DCM_MACCalculationTransferSyntaxUID, stack, ESM_fromHere, OFFalse)).good() && (stack.top()->isElement()))
+      {
+        char *uid = NULL;
+        if ((((DcmElement *)(stack.top()))->getString(uid)).good())
 -@@ -748,7 +748,7 @@
++@@ -750,7 +750,7 @@ OFCondition DcmSignature::verifyCurrent()
+    if (result.good())
+    {
+      stack.clear();
+ -    if ((selectedMacParametersItem->search(DCM_MACAlgorithm, stack, ESM_fromHere, OFFalse)).good() && (stack.top()->isLeaf()))
 -+    if ((selectedMacParametersItem->search(DCM_MACAlgorithm, stack, ESM_fromHere, OFFalse)).good() && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
+++    if ((selectedMacParametersItem->search(DCM_MACAlgorithm, stack, ESM_fromHere, OFFalse)).good() && (stack.top()->isElement()))
+      {
+        OFString macidentifier;
+        if ((((DcmElement *)(stack.top()))->getOFString(macidentifier, 0)).good())
 -@@ -781,7 +781,7 @@
++@@ -783,7 +783,7 @@ OFCondition DcmSignature::verifyCurrent()
+    if (result.good())
+    {
+      stack.clear();
+ -    if ((selectedSignatureItem->search(DCM_Signature, stack, ESM_fromHere, OFFalse)).good() && (stack.top()->isLeaf()))
+ +    if ((selectedSignatureItem->search(DCM_Signature, stack, ESM_fromHere, OFFalse)).good() && (stack.top()->ident() == EVR_OB))
+      {
+        signature = new DcmOtherByteOtherWord(*((DcmOtherByteOtherWord *)(stack.top())));
+        if (signature == NULL) result = EC_MemoryExhausted;
 -@@ -958,7 +958,7 @@
++@@ -960,7 +960,7 @@ OFCondition DcmSignature::getCurrentMacXferSyntaxName(OFString& str)
+    DcmStack stack;
+  
+    // read MAC Calculation Transfer Syntax UID
+ -  if ((selectedMacParametersItem->search(DCM_MACCalculationTransferSyntaxUID, stack, ESM_fromHere, OFFalse)).good() && (stack.top()->isLeaf()))
 -+  if ((selectedMacParametersItem->search(DCM_MACCalculationTransferSyntaxUID, stack, ESM_fromHere, OFFalse)).good() && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
+++  if ((selectedMacParametersItem->search(DCM_MACCalculationTransferSyntaxUID, stack, ESM_fromHere, OFFalse)).good() && (stack.top()->isElement()))
+    {
+      char *uid = NULL;
+      if ((((DcmElement *)(stack.top()))->getString(uid)).good() && uid)
 -@@ -1003,7 +1003,7 @@
++@@ -1005,7 +1005,7 @@ OFCondition DcmSignature::getCurrentMacName(OFString& str)
+    DcmStack stack;
+  
+    // read MAC Algorithm
+ -  if ((selectedMacParametersItem->search(DCM_MACAlgorithm, stack, ESM_fromHere, OFFalse)).good() && (stack.top()->isLeaf()))
 -+  if ((selectedMacParametersItem->search(DCM_MACAlgorithm, stack, ESM_fromHere, OFFalse)).good() && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
+++  if ((selectedMacParametersItem->search(DCM_MACAlgorithm, stack, ESM_fromHere, OFFalse)).good() && (stack.top()->isElement()))
+    {
+      if ((((DcmElement *)(stack.top()))->getOFString(str, 0)).good()) result = EC_Normal;
+    }
 -@@ -1018,7 +1018,7 @@
++@@ -1020,7 +1020,7 @@ OFCondition DcmSignature::getCurrentSignatureUID(OFString& str)
+    DcmStack stack;
+  
+    // read signature UID
+ -  if ((selectedSignatureItem->search(DCM_DigitalSignatureUID, stack, ESM_fromHere, OFFalse)).good() && (stack.top()->isLeaf()))
 -+  if ((selectedSignatureItem->search(DCM_DigitalSignatureUID, stack, ESM_fromHere, OFFalse)).good() && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
+++  if ((selectedSignatureItem->search(DCM_DigitalSignatureUID, stack, ESM_fromHere, OFFalse)).good() && (stack.top()->isElement()))
+    {
+      if ((((DcmElement *)(stack.top()))->getOFString(str, 0)).good()) result = EC_Normal;
+    }
 -@@ -1046,7 +1046,7 @@
++@@ -1048,7 +1048,7 @@ OFCondition DcmSignature::getCurrentSignatureDateTime(OFString& str)
+    DcmStack stack;
+  
+    // read signature date/time
+ -  if ((selectedSignatureItem->search(DCM_DigitalSignatureDateTime, stack, ESM_fromHere, OFFalse)).good() && (stack.top()->isLeaf()))
 -+  if ((selectedSignatureItem->search(DCM_DigitalSignatureDateTime, stack, ESM_fromHere, OFFalse)).good() && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
+++  if ((selectedSignatureItem->search(DCM_DigitalSignatureDateTime, stack, ESM_fromHere, OFFalse)).good() && (stack.top()->isElement()))
+    {
+      if ((((DcmElement *)(stack.top()))->getOFString(str, 0)).good()) result = EC_Normal;
+    }
 -@@ -1117,7 +1117,7 @@
++@@ -1119,7 +1119,7 @@ OFCondition DcmSignature::verifySignatureProfile(SiSecurityProfile &sprof)
+    // check MAC Calculation Transfer Syntax UID
+    if (result.good())
+    {
+ -    if ((selectedMacParametersItem->search(DCM_MACCalculationTransferSyntaxUID, stack, ESM_fromHere, OFFalse)).good() && (stack.top()->isLeaf()))
 -+    if ((selectedMacParametersItem->search(DCM_MACCalculationTransferSyntaxUID, stack, ESM_fromHere, OFFalse)).good() && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
+++    if ((selectedMacParametersItem->search(DCM_MACCalculationTransferSyntaxUID, stack, ESM_fromHere, OFFalse)).good() && (stack.top()->isElement()))
+      {
+        char *uid = NULL;
+        if ((((DcmElement *)(stack.top()))->getString(uid)).good())
 -@@ -1140,7 +1140,7 @@
++@@ -1142,7 +1142,7 @@ OFCondition DcmSignature::verifySignatureProfile(SiSecurityProfile &sprof)
+    {
+      E_MACType mac = EMT_RIPEMD160;
+      stack.clear();
+ -    if ((selectedMacParametersItem->search(DCM_MACAlgorithm, stack, ESM_fromHere, OFFalse)).good() && (stack.top()->isLeaf()))
 -+    if ((selectedMacParametersItem->search(DCM_MACAlgorithm, stack, ESM_fromHere, OFFalse)).good() && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
+++    if ((selectedMacParametersItem->search(DCM_MACAlgorithm, stack, ESM_fromHere, OFFalse)).good() && (stack.top()->isElement()))
+      {
+        OFString macidentifier;
+        if ((((DcmElement *)(stack.top()))->getOFString(macidentifier, 0)).good())
++diff --git a/dcmsign/libsrc/sicert.cc b/dcmsign/libsrc/sicert.cc
++index 173bbbf2c3..0668b72c99 100644
+ --- a/dcmsign/libsrc/sicert.cc
+ +++ b/dcmsign/libsrc/sicert.cc
 -@@ -147,7 +147,7 @@
++@@ -135,7 +135,7 @@ OFCondition SiCertificate::read(DcmItem& item)
+    OFString aString;
+    DcmStack stack;
+    result = item.search(DCM_CertificateType, stack, ESM_fromHere, OFFalse);
+ -  if (result.good())
 -+  if (result.good() && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
+++  if (result.good() && stack.top()->isElement())
+    {
+      result = ((DcmElement *)(stack.top()))->getOFString(aString, 0);
+      if (result.good())
 -@@ -156,7 +156,7 @@
++@@ -144,7 +144,7 @@ OFCondition SiCertificate::read(DcmItem& item)
+        {
+          stack.clear();
+          result = item.search(DCM_CertificateOfSigner, stack, ESM_fromHere, OFFalse);
+ -        if (result.good())
 -+        if (result.good() && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
+++        if (result.good() && stack.top()->isElement())
+          {
+            DcmElement *cert = (DcmElement *)stack.top();
+            Uint8 *data = NULL;
++diff --git a/dcmsr/libsrc/dsrtypes.cc b/dcmsr/libsrc/dsrtypes.cc
++index 08414ad93e..a9d6218594 100644
+ --- a/dcmsr/libsrc/dsrtypes.cc
+ +++ b/dcmsr/libsrc/dsrtypes.cc
 -@@ -1176,7 +1176,7 @@
++@@ -1,6 +1,6 @@
++ /*
++  *
++- *  Copyright (C) 2000-2023, OFFIS e.V.
+++ *  Copyright (C) 2000-2024, OFFIS e.V.
++  *  All rights reserved.  See COPYRIGHT file for details.
++  *
++  *  This software and supporting documentation were developed by
++@@ -1178,7 +1178,7 @@ OFCondition DSRTypes::getAndCheckElementFromDataset(DcmItem &dataset,
+      DcmStack stack;
+      const DcmTagKey tagKey = delem.getTag();
+      OFCondition result = dataset.search(tagKey, stack, ESM_fromHere, OFFalse /*searchIntoSub*/);
+ -    if (result.good())
 -+    if (result.good() && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
+++    if (result.good() && stack.top()->isElement())
+      {
+          /* copy object from search stack */
+          result = delem.copyFrom(*stack.top());
 -@@ -1201,7 +1201,7 @@
++@@ -1203,7 +1203,7 @@ OFCondition DSRTypes::getAndCheckStringValueFromDataset(DcmItem &dataset,
+  {
+      DcmStack stack;
+      OFCondition result = dataset.search(tagKey, stack, ESM_fromHere, OFFalse /*searchIntoSub*/);
+ -    if (result.good())
 -+    if (result.good() && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
+++    if (result.good() && stack.top()->isElement())
+      {
+          DcmElement *delem = OFstatic_cast(DcmElement *, stack.top());
+          /* we need a reference to the original element in order to determine the SpecificCharacterSet */
index 0000000000000000000000000000000000000000,b6f2a14eb25b40c6e5631533f3f522ee1730a4d6..3091283c4fd6fbfa23641c5702f19429e751902b
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,481 +1,503 @@@
 -From af4672659ef883f19c60dd16eedc8875b3bad93a Mon Sep 17 00:00:00 2001
++From 601b227eecaab33a3a3a11dc256d84b1a62f63af Mon Sep 17 00:00:00 2001
+ From: Marco Eichelberg <dicom@offis.de>
+ Date: Mon, 15 Apr 2024 12:19:33 +0200
 -Subject: Fixed unchecked typecasts and fixed LUT handling.
 -Bug-Debian: https://bugs.debian.org/1070207
 -Forwarded: not-needed
++Subject: [PATCH] Fixed unchecked typecasts and fixed LUT handling.
+ This commit adds further fixes for unchecked typecasts of DcmItem::search()
+ results (see description of previous commit). Furthermore, this commit
+ specifically addresses the handling of look-up tables (LUTs) in module
+ dcmpstat, where attribute (0028,3006) LUTData may use either US or OW
+ value representation, and (0028,3002) LUTDescriptor may be either US or SS.
+ The code should now properly handle all permitted value representations.
+ LUTData is now always written as OW in order to avoid the 64k size limit
+ for US in explicit VR encoding.
+ Thanks to Martin Zeiser from the Cisco Talos team
+ <vulndiscovery@external.cisco.com> for the bug report (TALOS-2024-1957).
+ Together with the previous commit, this closes DCMTK issue #1120.
+ ---
+  dcmpstat/libsrc/dcmpstat.cc | 40 ++++++++++++++++-------
 - dcmpstat/libsrc/dvpspl.cc   | 34 ++++++++++++++------
 - dcmpstat/libsrc/dvpssv.cc   | 34 ++++++++++++++------
 - dcmpstat/libsrc/dvpssvl.cc  | 29 ++++++++++-------
 - dcmpstat/libsrc/dvpstat.cc  | 63 +++++++++++++++++--------------------
++ dcmpstat/libsrc/dvpspl.cc   | 34 +++++++++++++------
++ dcmpstat/libsrc/dvpssv.cc   | 34 +++++++++++++------
++ dcmpstat/libsrc/dvpssvl.cc  | 25 +++++++++-----
++ dcmpstat/libsrc/dvpstat.cc  | 65 +++++++++++++++++--------------------
+  dcmpstat/libsrc/dvpsvl.cc   | 19 +++++++++--
 - 6 files changed, 140 insertions(+), 79 deletions(-)
++ 6 files changed, 139 insertions(+), 78 deletions(-)
++diff --git a/dcmpstat/libsrc/dcmpstat.cc b/dcmpstat/libsrc/dcmpstat.cc
++index 4a8e5af6c3..a7d11abaca 100644
+ --- a/dcmpstat/libsrc/dcmpstat.cc
+ +++ b/dcmpstat/libsrc/dcmpstat.cc
 -@@ -384,12 +384,16 @@
++@@ -384,12 +384,16 @@ OFCondition DcmPresentationState::read(DcmItem &dset)
+        {
+           item = seq->getItem(0);
+           stack.clear();
+ -         // LUTDescriptor can be US or SS. For now we only handle US.
+ +
+ +         // LUTDescriptor can be US or SS
+           if ((EC_Normal == item->search((DcmTagKey &)modalityLUTDescriptor.getTag(),
+ -           stack, ESM_fromHere, OFFalse)) && (stack.top()->ident() == EVR_US))
+ +           stack, ESM_fromHere, OFFalse)) && (stack.top()->ident() == EVR_US || stack.top()->ident() == EVR_SS))
+           {
+ -           modalityLUTDescriptor = *((DcmUnsignedShort *)(stack.top()));
+ +           // We explicitly use DcmElement::operator=(), which works for US and SS
+ +           DcmElement *mLUTDescriptor = &modalityLUTDescriptor;
+ +           mLUTDescriptor->operator=(* OFstatic_cast(DcmElement *, stack.top()));
+           }
+ +
+           stack.clear();
+           if ((EC_Normal == item->search((DcmTagKey &)modalityLUTExplanation.getTag(),
+             stack, ESM_fromHere, OFFalse)) && (stack.top()->ident() == EVR_LO))
 -@@ -400,9 +404,11 @@
++@@ -400,9 +404,11 @@ OFCondition DcmPresentationState::read(DcmItem &dset)
+  
+           // LUTData can be OW, US or SS. For now we only handle US.
+           if ((EC_Normal == item->search((DcmTagKey &)modalityLUTData.getTag(),
+ -           stack, ESM_fromHere, OFFalse)) && (stack.top()->ident() == EVR_US))
+ +           stack, ESM_fromHere, OFFalse)) && (stack.top()->ident() == EVR_US || stack.top()->ident() == EVR_OW))
+           {
+ -           modalityLUTData = *((DcmUnsignedShort *)(stack.top()));
+ +           // we deliberately call DcmElement::operator=() here, which will work for both DcmUnsignedShort and DcmOtherByteOtherWord parameters
+ +           DcmElement *mdata = &modalityLUTData;
+ +           mdata->operator=(*(DcmElement *)(stack.top()));
+           }
+           stack.clear();
+           if ((EC_Normal == item->search((DcmTagKey &)modalityLUTType.getTag(),
 -@@ -879,11 +885,13 @@
++@@ -879,11 +885,13 @@ OFCondition DcmPresentationState::createFromImage(
+        {
+           item = seq->getItem(0);
+           stack.clear();
+ -         // LUTDescriptor can be US or SS. For now we only handle US.
+ +         // LUTDescriptor can be US or SS
+           if ((EC_Normal == item->search((DcmTagKey &)modalityLUTDescriptor.getTag(),
+ -           stack, ESM_fromHere, OFFalse)) && (stack.top()->ident() == EVR_US))
+ +           stack, ESM_fromHere, OFFalse)) && (stack.top()->ident() == EVR_US || stack.top()->ident() == EVR_SS))
+           {
+ -           modalityLUTDescriptor = *((DcmUnsignedShort *)(stack.top()));
+ +           // We explicitly use DcmElement::operator=(), which works for US and SS
+ +           DcmElement *mLUTDescriptor = &modalityLUTDescriptor;
+ +           mLUTDescriptor->operator=(* OFstatic_cast(DcmElement *, stack.top()));
+           }
+           stack.clear();
+           if ((EC_Normal == item->search((DcmTagKey &)modalityLUTExplanation.getTag(),
 -@@ -895,9 +903,11 @@
++@@ -895,9 +903,11 @@ OFCondition DcmPresentationState::createFromImage(
+  
+           // LUTData can be OW, US or SS. For now we only handle US.
+           if ((EC_Normal == item->search((DcmTagKey &)modalityLUTData.getTag(),
+ -           stack, ESM_fromHere, OFFalse)) && (stack.top()->ident() == EVR_US))
+ +           stack, ESM_fromHere, OFFalse)) && (stack.top()->ident() == EVR_US || stack.top()->ident() == EVR_OW))
+           {
+ -           modalityLUTData = *((DcmUnsignedShort *)(stack.top()));
+ +           // we deliberately call DcmElement::operator=() here, which will work for both DcmUnsignedShort and DcmOtherByteOtherWord parameters
+ +           DcmElement *mdata = &modalityLUTData;
+ +           mdata->operator=(*(DcmElement *)(stack.top()));
+           }
+           stack.clear();
+           if ((EC_Normal == item->search((DcmTagKey &)modalityLUTType.getTag(),
 -@@ -1247,10 +1257,16 @@
++@@ -1247,10 +1257,16 @@ OFCondition DcmPresentationState::write(DcmItem &dset, OFBool replaceSOPInstance
+          dseq = new DcmSequenceOfItems(DCM_ModalityLUTSequence);
+          if (dseq)
+          {
+ -          delem = new DcmUnsignedShort(modalityLUTDescriptor);
+ +          // we clone modalityLUTDescriptor in order to retain the VR (US or SS)
+ +          delem = OFstatic_cast(DcmElement *, modalityLUTDescriptor.clone());
+            if (delem) ditem->insert(delem, OFTrue /*replaceOld*/); else result=EC_MemoryExhausted;
+ -          delem = new DcmUnsignedShort(modalityLUTData);
+ +
+ +          // we write LUTData as OW in order to avoid the 64 kByte limit for US
+ +          delem = new DcmOtherByteOtherWord(DCM_LUTData);
+ +          delem->operator=(modalityLUTData);
+ +          OFstatic_cast(DcmOtherByteOtherWord *, delem)->setVR(EVR_OW);
+            if (delem) ditem->insert(delem, OFTrue /*replaceOld*/); else result=EC_MemoryExhausted;
+ +
+            delem = new DcmLongString(modalityLUTType);
+            if (delem) ditem->insert(delem, OFTrue /*replaceOld*/); else result=EC_MemoryExhausted;
+            if (modalityLUTExplanation.getLength() >0)
++diff --git a/dcmpstat/libsrc/dvpspl.cc b/dcmpstat/libsrc/dvpspl.cc
++index ec4cccf973..f5574ab337 100644
+ --- a/dcmpstat/libsrc/dvpspl.cc
+ +++ b/dcmpstat/libsrc/dvpspl.cc
+ @@ -1,6 +1,6 @@
+  /*
+   *
+ - *  Copyright (C) 1999-2018, OFFIS e.V.
+ + *  Copyright (C) 1999-2024, OFFIS e.V.
+   *  All rights reserved.  See COPYRIGHT file for details.
+   *
+   *  This software and supporting documentation were developed by
+ @@ -24,6 +24,7 @@
+  #include "dcmtk/dcmdata/dcdeftag.h"
+  #include "dcmtk/dcmdata/dcsequen.h"
+  #include "dcmtk/dcmdata/dcvrcs.h"
+ +#include "dcmtk/dcmdata/dcvrobow.h"
+  #include "dcmtk/dcmpstat/dvpspl.h"
+  #include "dcmtk/dcmpstat/dvpsdef.h"     /* for constants and macros */
+  #include "dcmtk/dcmnet/dimse.h"
 -@@ -79,29 +80,36 @@
++@@ -79,29 +80,36 @@ OFCondition DVPSPresentationLUT::read(DcmItem &dset, OFBool withSOPInstance)
+    if (result==EC_Normal)
+    {
+      stack.clear();
+ -    if (EC_Normal == dset.search(DCM_PresentationLUTSequence, stack, ESM_fromHere, OFFalse))
+ +    if (EC_Normal == dset.search(DCM_PresentationLUTSequence, stack, ESM_fromHere, OFFalse) && (stack.top()->ident() == EVR_SQ))
+      {
+        seq=(DcmSequenceOfItems *)stack.top();
+        if (seq->card() ==1)
+        {
+           item = seq->getItem(0);
+           stack.clear();
+ -         if (EC_Normal == item->search((DcmTagKey &)presentationLUTDescriptor.getTag(), 
+ -           stack, ESM_fromHere, OFFalse))
+ +
+ +         // LUTDescriptor can be US or SS
+ +         if ((EC_Normal == item->search((DcmTagKey &)presentationLUTDescriptor.getTag(),
+ +           stack, ESM_fromHere, OFFalse)) && (stack.top()->ident() == EVR_US || stack.top()->ident() == EVR_SS))
+           {
+ -           presentationLUTDescriptor = *((DcmUnsignedShort *)(stack.top()));
+ +           // We explicitly use DcmElement::operator=(), which works for US and SS
+ +           DcmElement *pLUTDescriptor = &presentationLUTDescriptor;
+ +           pLUTDescriptor->operator=(* OFstatic_cast(DcmElement *, stack.top()));
+           }
+ +
+           stack.clear();
+           if (EC_Normal == item->search((DcmTagKey &)presentationLUTExplanation.getTag(), 
+ -           stack, ESM_fromHere, OFFalse))
+ +           stack, ESM_fromHere, OFFalse) && (stack.top()->ident() == EVR_LO))
+           {
+             presentationLUTExplanation = *((DcmLongString *)(stack.top()));
+           }
+           stack.clear();
+           if (EC_Normal == item->search((DcmTagKey &)presentationLUTData.getTag(), 
+ -           stack, ESM_fromHere, OFFalse))
+ +           stack, ESM_fromHere, OFFalse) && (stack.top()->ident() == EVR_US || stack.top()->ident() == EVR_OW))
+           {
+ -           presentationLUTData = *((DcmUnsignedShort *)(stack.top()));
+ +           // we deliberately call DcmElement::operator=() here, which will work for both DcmUnsignedShort and DcmOtherByteOtherWord parameters
+ +           DcmElement *pldata = &presentationLUTData;
+ +           pldata->operator=(*(DcmElement *)(stack.top()));
+           }
+        } else {
+          result=EC_TagNotFound;
 -@@ -187,10 +195,16 @@
++@@ -187,10 +195,16 @@ OFCondition DVPSPresentationLUT::write(DcmItem &dset, OFBool withSOPInstance)
+          dseq = new DcmSequenceOfItems(DCM_PresentationLUTSequence);
+          if (dseq)
+          {
+ -          delem = new DcmUnsignedShort(presentationLUTDescriptor);
+ +          // we clone presentationLUTDescriptor in order to retain the VR (US or SS)
+ +          delem = OFstatic_cast(DcmElement *, presentationLUTDescriptor.clone());
+            if (delem) ditem->insert(delem, OFTrue /*replaceOld*/); else result=EC_MemoryExhausted;
+ -          delem = new DcmUnsignedShort(presentationLUTData);
+ +
+ +          // we write LUTData as OW in order to avoid the 64 kByte limit for US
+ +          delem = new DcmOtherByteOtherWord(DCM_LUTData);
+ +          delem->operator=(presentationLUTData);
+ +          OFstatic_cast(DcmOtherByteOtherWord *, delem)->setVR(EVR_OW);
+            if (delem) ditem->insert(delem, OFTrue /*replaceOld*/); else result=EC_MemoryExhausted;
+ +
+            if (presentationLUTExplanation.getLength() >0)
+            {
+              delem = new DcmLongString(presentationLUTExplanation);
++diff --git a/dcmpstat/libsrc/dvpssv.cc b/dcmpstat/libsrc/dvpssv.cc
++index 8e3d49bd4f..4a7fd0e309 100644
+ --- a/dcmpstat/libsrc/dvpssv.cc
+ +++ b/dcmpstat/libsrc/dvpssv.cc
+ @@ -1,6 +1,6 @@
+  /*
+   *
+ - *  Copyright (C) 1998-2018, OFFIS e.V.
+ + *  Copyright (C) 1998-2024, OFFIS e.V.
+   *  All rights reserved.  See COPYRIGHT file for details.
+   *
+   *  This software and supporting documentation were developed by
+ @@ -23,6 +23,7 @@
+  #include "dcmtk/config/osconfig.h"    /* make sure OS specific configuration is included first */
+  #include "dcmtk/dcmdata/dcdeftag.h"
+  #include "dcmtk/dcmdata/dcsequen.h"
+ +#include "dcmtk/dcmdata/dcvrobow.h"
+  #include "dcmtk/dcmpstat/dvpssv.h"
+  #include "dcmtk/dcmpstat/dvpsri.h"      /* for DVPSReferencedImage */
+  #include "dcmtk/dcmpstat/dvpsrsl.h"     /* DVPSReferencedSeries_PList */
 -@@ -75,29 +76,36 @@
++@@ -75,29 +76,36 @@ OFCondition DVPSSoftcopyVOI::read(DcmItem &dset)
+    if (result==EC_Normal)
+    {
+      stack.clear();
+ -    if (EC_Normal == dset.search(DCM_VOILUTSequence, stack, ESM_fromHere, OFFalse))
+ +    if (EC_Normal == dset.search(DCM_VOILUTSequence, stack, ESM_fromHere, OFFalse) && (stack.top()->ident() == EVR_SQ))
+      {
+        seq=(DcmSequenceOfItems *)stack.top();
+        if (seq->card() ==1)
+        {
+           item = seq->getItem(0);
+           stack.clear();
+ -         if (EC_Normal == item->search((DcmTagKey &)voiLUTDescriptor.getTag(), 
+ -           stack, ESM_fromHere, OFFalse))
+ +
+ +         // LUTDescriptor can be US or SS
+ +         if ((EC_Normal == item->search((DcmTagKey &)voiLUTDescriptor.getTag(),
+ +           stack, ESM_fromHere, OFFalse)) && (stack.top()->ident() == EVR_US || stack.top()->ident() == EVR_SS))
+           {
+ -           voiLUTDescriptor = *((DcmUnsignedShort *)(stack.top()));
+ +           // We explicitly use DcmElement::operator=(), which works for US and SS
+ +           DcmElement *vLUTDescriptor = &voiLUTDescriptor;
+ +           vLUTDescriptor->operator=(* OFstatic_cast(DcmElement *, stack.top()));
+           }
+ +
+           stack.clear();
+           if (EC_Normal == item->search((DcmTagKey &)voiLUTExplanation.getTag(), 
+ -           stack, ESM_fromHere, OFFalse))
+ +           stack, ESM_fromHere, OFFalse) && (stack.top()->ident() == EVR_LO))
+           {
+             voiLUTExplanation = *((DcmLongString *)(stack.top()));
+           }
+           stack.clear();
+           if (EC_Normal == item->search((DcmTagKey &)voiLUTData.getTag(), 
+ -           stack, ESM_fromHere, OFFalse))
+ +           stack, ESM_fromHere, OFFalse) && (stack.top()->ident() == EVR_US || stack.top()->ident() == EVR_OW))
+           {
+ -           voiLUTData = *((DcmUnsignedShort *)(stack.top()));
+ +           // we deliberately call DcmElement::operator=() here, which will work for both DcmUnsignedShort and DcmOtherByteOtherWord parameters
+ +           DcmElement *vldata = &voiLUTData;
+ +           vldata->operator=(*(DcmElement *)(stack.top()));
+           }
+        } else {
+          result=EC_TagNotFound;
 -@@ -177,10 +185,16 @@
++@@ -177,10 +185,16 @@ OFCondition DVPSSoftcopyVOI::write(DcmItem &dset)
+        dseq = new DcmSequenceOfItems(DCM_VOILUTSequence);
+        if (dseq)
+        {
+ -        delem = new DcmUnsignedShort(voiLUTDescriptor);
+ +        // we clone voiLUTDescriptor in order to retain the VR (US or SS)
+ +        delem = OFstatic_cast(DcmElement *, voiLUTDescriptor.clone());
+          if (delem) ditem->insert(delem, OFTrue /*replaceOld*/); else result=EC_MemoryExhausted;
+ -        delem = new DcmUnsignedShort(voiLUTData);
+ +
+ +        // we write LUTData as OW in order to avoid the 64 kByte limit for US
+ +        delem = new DcmOtherByteOtherWord(DCM_LUTData);
+ +        delem->operator=(voiLUTData);
+ +        OFstatic_cast(DcmOtherByteOtherWord *, delem)->setVR(EVR_OW);
+          if (delem) ditem->insert(delem, OFTrue /*replaceOld*/); else result=EC_MemoryExhausted;
+ +
+          if (voiLUTExplanation.getLength() >0)
+          {
+            delem = new DcmLongString(voiLUTExplanation);
++diff --git a/dcmpstat/libsrc/dvpssvl.cc b/dcmpstat/libsrc/dvpssvl.cc
++index d1532db5c2..efcb6a26be 100644
+ --- a/dcmpstat/libsrc/dvpssvl.cc
+ +++ b/dcmpstat/libsrc/dvpssvl.cc
 -@@ -71,8 +71,8 @@
 -   DVPSSoftcopyVOI *newImage = NULL;
++@@ -1,6 +1,6 @@
++ /*
++  *
++- *  Copyright (C) 1999-2023, OFFIS e.V.
+++ *  Copyright (C) 1999-2024, OFFIS e.V.
++  *  All rights reserved.  See COPYRIGHT file for details.
++  *
++  *  This software and supporting documentation were developed by
++@@ -72,7 +72,7 @@ OFCondition DVPSSoftcopyVOI_PList::read(DcmItem &dset)
+    DcmSequenceOfItems *dseq=NULL;
+    DcmItem *ditem=NULL;
 --  
++ 
+ -  if (EC_Normal == dset.search(DCM_SoftcopyVOILUTSequence, stack, ESM_fromHere, OFFalse))
 -+
+ +  if (EC_Normal == dset.search(DCM_SoftcopyVOILUTSequence, stack, ESM_fromHere, OFFalse) && (stack.top()->ident() == EVR_SQ))
+    {
+      dseq=(DcmSequenceOfItems *)stack.top();
+      if (dseq)
 -@@ -248,29 +248,36 @@
++@@ -249,29 +249,36 @@ OFCondition DVPSSoftcopyVOI_PList::createFromImage(
+    if (result==EC_Normal)
+    {
+      stack.clear();
+ -    if (EC_Normal == dset.search(DCM_VOILUTSequence, stack, ESM_fromHere, OFFalse))
+ +    if (EC_Normal == dset.search(DCM_VOILUTSequence, stack, ESM_fromHere, OFFalse) && (stack.top()->ident() == EVR_SQ))
+      {
+        seq=(DcmSequenceOfItems *)stack.top();
+        if (seq->card() > 0)
+        {
+           item = seq->getItem(0);
+           stack.clear();
 --         if (EC_Normal == item->search((DcmTagKey &)voiLUTDescriptor.getTag(), 
++-         if (EC_Normal == item->search((DcmTagKey &)voiLUTDescriptor.getTag(),
+ -           stack, ESM_fromHere, OFFalse))
+ +
+ +         // LUTDescriptor can be US or SS
+ +         if ((EC_Normal == item->search((DcmTagKey &)voiLUTDescriptor.getTag(),
+ +           stack, ESM_fromHere, OFFalse)) && (stack.top()->ident() == EVR_US || stack.top()->ident() == EVR_SS))
+           {
+ -           voiLUTDescriptor = *((DcmUnsignedShort *)(stack.top()));
+ +           // We explicitly use DcmElement::operator=(), which works for US and SS
+ +           DcmElement *vLUTDescriptor = &voiLUTDescriptor;
+ +           vLUTDescriptor->operator=(* OFstatic_cast(DcmElement *, stack.top()));
+           }
+ +
+           stack.clear();
 --         if (EC_Normal == item->search((DcmTagKey &)voiLUTExplanation.getTag(), 
++          if (EC_Normal == item->search((DcmTagKey &)voiLUTExplanation.getTag(),
+ -           stack, ESM_fromHere, OFFalse))
 -+         if (EC_Normal == item->search((DcmTagKey &)voiLUTExplanation.getTag(),
+ +           stack, ESM_fromHere, OFFalse) && (stack.top()->ident() == EVR_LO))
+           {
+             voiLUTExplanation = *((DcmLongString *)(stack.top()));
+           }
+           stack.clear();
 --         if (EC_Normal == item->search((DcmTagKey &)voiLUTData.getTag(), 
++          if (EC_Normal == item->search((DcmTagKey &)voiLUTData.getTag(),
+ -           stack, ESM_fromHere, OFFalse))
 -+         if (EC_Normal == item->search((DcmTagKey &)voiLUTData.getTag(),
+ +           stack, ESM_fromHere, OFFalse) && (stack.top()->ident() == EVR_US || stack.top()->ident() == EVR_OW))
+           {
+ -           voiLUTData = *((DcmUnsignedShort *)(stack.top()));
+ +           // we deliberately call DcmElement::operator=() here, which will work for both DcmUnsignedShort and DcmOtherByteOtherWord parameters
+ +           DcmElement *vldata = &voiLUTData;
+ +           vldata->operator=(*(DcmElement *)(stack.top()));
+           }
+        } else result=EC_TagNotFound;
+      }
++diff --git a/dcmpstat/libsrc/dvpstat.cc b/dcmpstat/libsrc/dvpstat.cc
++index ce2f5ad5ff..4bfe8f9cbd 100644
+ --- a/dcmpstat/libsrc/dvpstat.cc
+ +++ b/dcmpstat/libsrc/dvpstat.cc
 -@@ -578,14 +578,14 @@
++@@ -1,6 +1,6 @@
++ /*
++  *
++- *  Copyright (C) 1998-2021, OFFIS e.V.
+++ *  Copyright (C) 1998-2024, OFFIS e.V.
++  *  All rights reserved.  See COPYRIGHT file for details.
++  *
++  *  This software and supporting documentation were developed by
++@@ -578,14 +578,14 @@ OFCondition DVPresentationState::attachImage(DcmDataset *dataset, OFBool transfe
+        currentImageSelectedFrame = 1; // default: first frame
+  
+        // get Modality
+ -      if (EC_Normal == dataset->search(DCM_Modality, stack, ESM_fromHere, OFFalse))
+ +      if (EC_Normal == dataset->search(DCM_Modality, stack, ESM_fromHere, OFFalse) && (stack.top()->ident() == EVR_CS))
+        {
+          currentImageModality = *((DcmCodeString *)(stack.top()));
+        }
+        stack.clear();
+  
+        // determine default Presentation LUT Shape
+ -      if (EC_Normal == dataset->search(DCM_PhotometricInterpretation, stack, ESM_fromHere, OFFalse))
+ +      if (EC_Normal == dataset->search(DCM_PhotometricInterpretation, stack, ESM_fromHere, OFFalse) && (stack.top()->ident() == EVR_CS))
+        {
+           DcmCodeString *photometricInterpretation = (DcmCodeString *)(stack.top());
+           if (photometricInterpretation->getVM() == 1)
 -@@ -598,12 +598,12 @@
++@@ -598,12 +598,12 @@ OFCondition DVPresentationState::attachImage(DcmDataset *dataset, OFBool transfe
+        stack.clear();
+  
+        // get SOP class UID and SOP instance UID.
+ -      if ((EC_Normal == result)&&(EC_Normal == dataset->search(DCM_SOPClassUID, stack, ESM_fromHere, OFFalse)))
+ +      if ((EC_Normal == result)&&(EC_Normal == dataset->search(DCM_SOPClassUID, stack, ESM_fromHere, OFFalse)) && (stack.top()->ident() == EVR_UI))
+        {
+          result = ((DcmUniqueIdentifier *)(stack.top()))->getString(currentImageSOPClassUID);
+        }
+        stack.clear();
+ -      if ((EC_Normal == result)&&(EC_Normal == dataset->search(DCM_SOPInstanceUID, stack, ESM_fromHere, OFFalse)))
+ +      if ((EC_Normal == result)&&(EC_Normal == dataset->search(DCM_SOPInstanceUID, stack, ESM_fromHere, OFFalse)) && (stack.top()->ident() == EVR_UI))
+        {
+          result = ((DcmUniqueIdentifier *)(stack.top()))->getString(currentImageSOPInstanceUID);
+        }
 -@@ -1124,40 +1124,36 @@
++@@ -1124,40 +1124,36 @@ OFCondition DVPresentationState::setGammaVOILUT(double gammaValue, DVPSObjectApp
+          numEntries16 = (Uint16)numberOfEntries;
+  
+        /* LUT Descriptor */
+ -      DcmElement *lutDescriptor = NULL;
+ -      if (firstMapped < 0)
+ +      DcmUnsignedShort *lutDescriptor = new DcmUnsignedShort(DcmTag(DCM_LUTDescriptor, EVR_US));
+ +      if (lutDescriptor == NULL) status = EC_MemoryExhausted;
+ +      else
+        {
+ -        // LUT Descriptor is SS
+ -        lutDescriptor = new DcmSignedShort(DcmTag(DCM_LUTDescriptor, EVR_SS));
+ -        if (lutDescriptor != NULL)
+ +        if (firstMapped < 0)
+          {
+ -            status = lutDescriptor->putSint16((Sint16)numEntries16, 0);
+ -            if (EC_Normal == status)
+ -              status = lutDescriptor->putSint16((Sint16)firstMapped, 1);
+ -            if (EC_Normal == status)
+ -              status = lutDescriptor->putSint16((Sint16)numberOfBits, 2);
+ -        } else
+ -          status = EC_MemoryExhausted;
+ -      } else {
+ -        // LUT Descriptor is US
+ -        lutDescriptor = new DcmUnsignedShort(DcmTag(DCM_LUTDescriptor, EVR_US));
+ -        if (lutDescriptor != NULL)
+ -        {
+ -            status = lutDescriptor->putUint16(numEntries16, 0);
+ -            if (EC_Normal == status)
+ -              status = lutDescriptor->putUint16((Uint16)firstMapped, 1);
+ -            if (EC_Normal == status)
+ -              status = lutDescriptor->putUint16((Uint16)numberOfBits, 2);
+ -        } else
+ -            status = EC_MemoryExhausted;
+ +          // LUT Descriptor is SS
+ +          DcmSignedShort ldesc(DcmTag(DCM_LUTDescriptor, EVR_SS));
+ +          status = ldesc.putSint16((Sint16)numEntries16, 0);
+ +          if (EC_Normal == status) status = ldesc.putSint16((Sint16)firstMapped, 1);
+ +          if (EC_Normal == status) status = ldesc.putSint16((Sint16)numberOfBits, 2);
+ +          if (EC_Normal == status)
+ +          {
+ +            // copy content of SS element into DcmUnsignedShort using DcmElement::operator=
+ +            DcmElement *ld = lutDescriptor;
+ +            ld->operator=(ldesc);
+ +          }
+ +        } else {
+ +          // LUT Descriptor is US
+ +          status = lutDescriptor->putUint16(numEntries16, 0);
+ +          if (EC_Normal == status) status = lutDescriptor->putUint16((Uint16)firstMapped, 1);
+ +          if (EC_Normal == status) status = lutDescriptor->putUint16((Uint16)numberOfBits, 2);
+ +        }
+        }
+  
+        /* LUT Data */
+ -      DcmElement *lutData = NULL;
+ +      DcmUnsignedShort *lutData = NULL;
+        if (status == EC_Normal)
+        {
+ -        // LUT Data as OW, because of max size = 64K
+ -        lutData = new DcmOtherByteOtherWord(DcmTag(DCM_LUTData, EVR_OW));
+ +        lutData = new DcmUnsignedShort(DcmTag(DCM_LUTData, EVR_US));
+          if (lutData != NULL)
+            status = lutData->putUint16Array(data, numberOfEntries);
+          else
 -@@ -1186,15 +1182,14 @@
++@@ -1186,15 +1182,14 @@ OFCondition DVPresentationState::setGammaVOILUT(double gammaValue, DVPSObjectApp
+        if (status == EC_Normal)
+        {
+          if ((lutDescriptor != NULL) && (lutData != NULL) && (lutExplanation !=  NULL))
+ -          status = setVOILUT(*(DcmUnsignedShort *)lutDescriptor, *(DcmUnsignedShort *)lutData, *lutExplanation, applicability);
+ +          status = setVOILUT(*lutDescriptor, *lutData, *lutExplanation, applicability);
+        }
+  
+        /* delete temporary dcmtk structures */
+        delete lutDescriptor;
+        delete lutData;
+        delete lutExplanation;
+ -    } else
+ -      status = EC_MemoryExhausted;
+ +    } else status = EC_MemoryExhausted;
+      delete[] data;
+    }
+    return status;
++diff --git a/dcmpstat/libsrc/dvpsvl.cc b/dcmpstat/libsrc/dvpsvl.cc
++index b10b83f20d..fdba0a0e06 100644
+ --- a/dcmpstat/libsrc/dvpsvl.cc
+ +++ b/dcmpstat/libsrc/dvpsvl.cc
 -@@ -59,9 +59,24 @@
++@@ -59,9 +59,24 @@ OFCondition DVPSVOILUT::read(DcmItem &dset)
+    OFCondition result = EC_Normal;
+    DcmStack stack;
+  
+ -  READ_FROM_DATASET(DcmUnsignedShort, EVR_US, voiLUTDescriptor)
+ +  // LUTDescriptor can be US or SS
+ +  if ((EC_Normal == dset.search((DcmTagKey &)voiLUTDescriptor.getTag(),
+ +    stack, ESM_fromHere, OFFalse)) && (stack.top()->ident() == EVR_US || stack.top()->ident() == EVR_SS))
+ +  {
+ +    // We explicitly use DcmElement::operator=(), which works for US and SS
+ +    DcmElement *vLUTDescriptor = &voiLUTDescriptor;
+ +    vLUTDescriptor->operator=(* OFstatic_cast(DcmElement *, stack.top()));
+ +  }
+ +
+    READ_FROM_DATASET(DcmLongString, EVR_LO, voiLUTExplanation)
+ -  READ_FROM_DATASET(DcmUnsignedShort, EVR_US, voiLUTData)
+ +
+ +  stack.clear();
+ +  if ((EC_Normal == dset.search((DcmTagKey &)voiLUTData.getTag(), stack, ESM_fromHere, OFFalse)) && (stack.top()->ident() == EVR_US || stack.top()->ident() == EVR_OW))
+ +  {
+ +    // we deliberately call DcmElement::operator=() here, which will work for both DcmUnsignedShort and DcmOtherByteOtherWord parameters
+ +    DcmElement *vldata = &voiLUTData;
+ +    vldata->operator=(*(DcmElement *)(stack.top()));
+ +  }
+  
+    if (EC_Normal == result)
+    {
index 0000000000000000000000000000000000000000,950e7027584db92cf9241fb42bb4934a7dc76756..db629e0ac6cef2d6e5f5e60040108e15179725ee
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,80 +1,82 @@@
 -From 9ecec7671ded01648354e617972d0f1f9a9576b9 Mon Sep 17 00:00:00 2001
++From 7d54f8efec995e5601d089fa17b0625c2b41af23 Mon Sep 17 00:00:00 2001
+ From: Joerg Riesmeier <dicom@jriesmeier.com>
+ Date: Mon, 22 Apr 2024 12:11:11 +0200
 -Subject: Fixed wrong error handling (previous commit).
 -Bug-Debian: https://bugs.debian.org/1070207
 -Forwarded: not-needed
++Subject: [PATCH] Fixed wrong error handling (previous commit).
+ Fixed wrong error handling introduced with the previous commit.
+ ---
+  dcmrt/libsrc/drttypes.cc |  6 +++---
+  dcmsr/libsrc/dsrtypes.cc | 32 ++++++++++++++++++++------------
+  2 files changed, 23 insertions(+), 15 deletions(-)
++diff --git a/dcmrt/libsrc/drttypes.cc b/dcmrt/libsrc/drttypes.cc
++index 77ff1674c..097ab9727 100644
+ --- a/dcmrt/libsrc/drttypes.cc
+ +++ b/dcmrt/libsrc/drttypes.cc
 -@@ -210,11 +210,11 @@
++@@ -210,11 +210,11 @@ OFCondition DRTTypes::getAndCheckStringValueFromDataset(DcmItem &dataset,
+  {
+      DcmStack stack;
+      OFCondition result = dataset.search(tagKey, stack, ESM_fromHere, OFFalse /*searchIntoSub*/);
 --    if (result.good() && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
++-    if (result.good() && stack.top()->isElement())
+ +    if (result.good())
+      {
+ -        DcmElement *element = OFstatic_cast(DcmElement *, stack.top());
+ -        if (element != NULL)
 -+        if (dynamic_cast<DcmElement*>(stack.top()) != nullptr)
+++        if (stack.top()->isElement())
+          {
+ +            DcmElement *element = OFstatic_cast(DcmElement *, stack.top());
+              if (checkElementValue(*element, vm, type, result, moduleName))
+                  result = element->getOFString(stringValue, 0);
+              else
++diff --git a/dcmsr/libsrc/dsrtypes.cc b/dcmsr/libsrc/dsrtypes.cc
++index a9d621859..166bfabff 100644
+ --- a/dcmsr/libsrc/dsrtypes.cc
+ +++ b/dcmsr/libsrc/dsrtypes.cc
 -@@ -1176,13 +1176,17 @@
++@@ -1178,13 +1178,17 @@ OFCondition DSRTypes::getAndCheckElementFromDataset(DcmItem &dataset,
+      DcmStack stack;
+      const DcmTagKey tagKey = delem.getTag();
+      OFCondition result = dataset.search(tagKey, stack, ESM_fromHere, OFFalse /*searchIntoSub*/);
 --    if (result.good() && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
++-    if (result.good() && stack.top()->isElement())
+ +    if (result.good())
+      {
+ -        /* copy object from search stack */
+ -        result = delem.copyFrom(*stack.top());
+ -        /* we need a reference to the original element in order to determine the SpecificCharacterSet */
+ -        if (!checkElementValue(OFstatic_cast(DcmElement *, stack.top()), tagKey, vm, type, result, moduleName, acceptViolation))
+ -            result = SR_EC_InvalidValue;
 -+        if (dynamic_cast<DcmElement*>(stack.top()) != nullptr)
+++        if (stack.top()->isElement())
+ +        {
+ +            /* copy object from search stack */
+ +            result = delem.copyFrom(*stack.top());
+ +            /* we need a reference to the original element in order to determine the SpecificCharacterSet */
+ +            if (!checkElementValue(OFstatic_cast(DcmElement *, stack.top()), tagKey, vm, type, result, moduleName, acceptViolation))
+ +                result = SR_EC_InvalidValue;
+ +        } else
+ +            result = EC_CorruptedData;
+      }
+      /* the element could not be found in the dataset */
+      else if (!checkElementValue(delem, vm, type, result, moduleName, acceptViolation))
 -@@ -1201,13 +1205,17 @@
++@@ -1203,13 +1207,17 @@ OFCondition DSRTypes::getAndCheckStringValueFromDataset(DcmItem &dataset,
+  {
+      DcmStack stack;
+      OFCondition result = dataset.search(tagKey, stack, ESM_fromHere, OFFalse /*searchIntoSub*/);
 --    if (result.good() && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
++-    if (result.good() && stack.top()->isElement())
+ +    if (result.good())
+      {
+ -        DcmElement *delem = OFstatic_cast(DcmElement *, stack.top());
+ -        /* we need a reference to the original element in order to determine the SpecificCharacterSet */
+ -        if (!checkElementValue(delem, tagKey, vm, type, result, moduleName, acceptViolation))
+ -            result = SR_EC_InvalidValue;
+ -        delem->getOFString(stringValue, 0);
 -+        if (dynamic_cast<DcmElement*>(stack.top()) != nullptr)
+++        if (stack.top()->isElement())
+ +        {
+ +            DcmElement *delem = OFstatic_cast(DcmElement *, stack.top());
+ +            /* we need a reference to the original element in order to determine the SpecificCharacterSet */
+ +            if (!checkElementValue(delem, tagKey, vm, type, result, moduleName, acceptViolation))
+ +                result = SR_EC_InvalidValue;
+ +            delem->getOFString(stringValue, 0);
+ +        } else
+ +            result = EC_CorruptedData;
+      } else {
+          if ((type == "1") || (type == "2"))
+          {
index 0000000000000000000000000000000000000000,26fbc312bb2183a37d3a8ea6f6cdfe15f2715e82..f86587347bb7724c16f7cfeea873bd965ab01329
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,77 +1,95 @@@
 -From 39576639b2bdfa77e5e444587e3c615f651e9183 Mon Sep 17 00:00:00 2001
++From c78e434c0c5f9d932874f0b17a8b4ce305ca01f5 Mon Sep 17 00:00:00 2001
+ From: Marco Eichelberg <dicom@offis.de>
+ Date: Wed, 13 Mar 2024 17:15:58 +0100
 -Subject: Fixed two segmentation faults.
 -Bug-Debian: https://bugs.debian.org/1070207
 -Forwarded: not-needed
++Subject: [PATCH] Fixed two segmentation faults.
+ Fixed two segmentations faults that could occur while processing an
+ invalid incoming DIMSE message due to insufficient error handling
+ causing a de-referenced NULL pointer.
+ Thanks to Nils Bars <nils.bars@rub.de> for the bug report and sample files.
+ This closes DCMTK issue #1114.
+ ---
 - dcmdata/libsrc/dcelem.cc |  7 +++++++
 - dcmnet/libsrc/dimcmd.cc  | 31 +++++++++++++++++--------------
 - 2 files changed, 24 insertions(+), 14 deletions(-)
++ dcmdata/libsrc/dcelem.cc |  9 ++++++++-
++ dcmnet/libsrc/dimcmd.cc  | 33 ++++++++++++++++++---------------
++ 2 files changed, 26 insertions(+), 16 deletions(-)
++diff --git a/dcmdata/libsrc/dcelem.cc b/dcmdata/libsrc/dcelem.cc
++index 1524904be..3b9cc2bf7 100644
+ --- a/dcmdata/libsrc/dcelem.cc
+ +++ b/dcmdata/libsrc/dcelem.cc
 -@@ -717,6 +717,13 @@
++@@ -1,6 +1,6 @@
++ /*
++  *
++- *  Copyright (C) 1994-2023, OFFIS e.V.
+++ *  Copyright (C) 1994-2024, OFFIS e.V.
++  *  All rights reserved.  See COPYRIGHT file for details.
++  *
++  *  This software and supporting documentation were developed by
++@@ -717,6 +717,13 @@ OFCondition DcmElement::loadValue(DcmInputStream *inStream)
+              if (isStreamNew)
+                  delete readStream;
+          }
+ +        else
+ +        {
+ +            errorFlag = EC_InvalidStream; // incomplete dataset read from stream
+ +            DCMDATA_ERROR("DcmElement: " << getTagName() << " " << getTag()
+ +                << " larger (" << getLengthField() << ") than remaining bytes ("
+ +                << getTransferredBytes() << ") in file, premature end of stream");
+ +        }
+      }
+      /* return result value */
+      return errorFlag;
++diff --git a/dcmnet/libsrc/dimcmd.cc b/dcmnet/libsrc/dimcmd.cc
++index 6dca39546..ffd225f4b 100644
+ --- a/dcmnet/libsrc/dimcmd.cc
+ +++ b/dcmnet/libsrc/dimcmd.cc
 -@@ -207,22 +207,25 @@
++@@ -1,6 +1,6 @@
++ /*
++  *
++- *  Copyright (C) 1994-2022, OFFIS e.V.
+++ *  Copyright (C) 1994-2024, OFFIS e.V.
++  *  All rights reserved.  See COPYRIGHT file for details.
++  *
++  *  This software and supporting documentation were partly developed by
++@@ -205,22 +205,25 @@ getString(DcmDataset *obj, DcmTagKey t, char *s, int maxlen, OFBool *spacePadded
+              return parseErrorWithMsg("dimcmd:getString: string too small", t);
+          } else {
+              ec =  elem->getString(aString);
+ -            strncpy(s, aString, maxlen);
+ -            if (spacePadded)
+ +            if (ec.good())
+              {
+ -                /* before we remove leading and tailing spaces we want to know
+ -                 * whether the string is actually space padded. Required to communicate
+ -                 * with dumb peers which send space padded UIDs and fail if they
+ -                 * receive correct UIDs back.
+ -                 *
+ -                 * This test can only detect space padded strings if
+ -                 * dcmEnableAutomaticInputDataCorrection is false; otherwise the padding
+ -                 * has already been removed by dcmdata at this stage.
+ -                 */
+ -                size_t s_len = strlen(s);
+ -                if ((s_len > 0)&&(s[s_len-1] == ' ')) *spacePadded = OFTrue; else *spacePadded = OFFalse;
+ +                strncpy(s, aString, maxlen);
+ +                if (spacePadded)
+ +                {
+ +                    /* before we remove leading and tailing spaces we want to know
+ +                     * whether the string is actually space padded. Required to communicate
+ +                     * with dumb peers which send space padded UIDs and fail if they
+ +                     * receive correct UIDs back.
+ +                     *
+ +                     * This test can only detect space padded strings if
+ +                     * dcmEnableAutomaticInputDataCorrection is false; otherwise the padding
+ +                     * has already been removed by dcmdata at this stage.
+ +                     */
+ +                    size_t s_len = strlen(s);
+ +                    if ((s_len > 0)&&(s[s_len-1] == ' ')) *spacePadded = OFTrue; else *spacePadded = OFFalse;
+ +                }
+ +                DU_stripLeadingAndTrailingSpaces(s);
+              }
+ -            DU_stripLeadingAndTrailingSpaces(s);
+          }
+      }
+      return (ec.good())? ec : DIMSE_PARSEFAILED;
index 0000000000000000000000000000000000000000,4b58089d3c7a448bf1d54afb2a9190a38a040204..ee1dcfc1bce4259216d18dac66d9594345c5b2dd
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,66 +1,66 @@@
 -From c5a5612df9ff39e7c003fd114ecd1b4704567439 Mon Sep 17 00:00:00 2001
++From 66c317feae446deda1a389226aa24c95a0eeac4c Mon Sep 17 00:00:00 2001
+ From: Marco Eichelberg <dicom@offis.de>
+ Date: Wed, 13 Mar 2024 23:03:40 +0100
 -Subject: Fixed DcmDecimalString unit tests.
 -Bug-Debian: https://bugs.debian.org/1070207
 -Forwarded: not-needed
++Subject: [PATCH] Fixed DcmDecimalString unit tests.
+ ---
+  dcmdata/tests/tvrds.cc | 12 ++++++------
+  1 file changed, 6 insertions(+), 6 deletions(-)
++diff --git a/dcmdata/tests/tvrds.cc b/dcmdata/tests/tvrds.cc
++index a9132a341..0e929304d 100644
+ --- a/dcmdata/tests/tvrds.cc
+ +++ b/dcmdata/tests/tvrds.cc
+ @@ -1,6 +1,6 @@
+  /*
+   *
+ - *  Copyright (C) 2011-2020, OFFIS e.V.
+ + *  Copyright (C) 2011-2024, OFFIS e.V.
+   *  All rights reserved.  See COPYRIGHT file for details.
+   *
+   *  This software and supporting documentation were developed by
+ @@ -30,7 +30,7 @@
+  
+  OFTEST(dcmdata_decimalString_1)
+  {
+ -    DcmDecimalString decStr(DCM_ContourData, EVR_DS);
+ +    DcmDecimalString decStr(DCM_ContourData);
+      OFVector<Float64> doubleVals;
+      OFCHECK(decStr.putString("1\\2.0\\3.5\\-4.99\\+500.005\\6.66E-01").good());
+      OFCHECK(decStr.getFloat64Vector(doubleVals).good());
 -@@ -45,7 +45,7 @@
++@@ -45,7 +45,7 @@ OFTEST(dcmdata_decimalString_1)
+  
+  OFTEST(dcmdata_decimalString_2)
+  {
+ -    DcmDecimalString decStr(DCM_ContourData, EVR_DS);
+ +    DcmDecimalString decStr(DCM_ContourData);
+      OFVector<Float64> doubleVals;
+      /* insert a NULL byte into the string */
+      OFCHECK(decStr.putString("1\\2.0\\3.5\\-4.99\0\\+500.005\\6.66E-01", 34).good());
 -@@ -61,7 +61,7 @@
++@@ -61,7 +61,7 @@ OFTEST(dcmdata_decimalString_2)
+  
+  OFTEST(dcmdata_decimalString_3)
+  {
+ -    DcmDecimalString decStr(DCM_ContourData, EVR_DS);
+ +    DcmDecimalString decStr(DCM_ContourData);
+      OFVector<Float64> doubleVals;
+      /* insert a NULL byte into the string */
+      OFCHECK(decStr.putOFStringArray(OFString("1\\2.0\\3.5\\-4.99\0\\+500.005\\6.66E-01", 34)).good());
 -@@ -77,7 +77,7 @@
++@@ -77,7 +77,7 @@ OFTEST(dcmdata_decimalString_3)
+  
+  OFTEST(dcmdata_decimalString_4)
+  {
+ -    DcmDecimalString decStr(DCM_ContourData, EVR_DS);
+ +    DcmDecimalString decStr(DCM_ContourData);
+      OFVector<Float64> doubleVals;
+      OFCHECK(decStr.putString("1\\2.0\\3.5\\-4.99\\+500.005\\6.66E-01\\").good());
+      OFCHECK_EQUAL(decStr.getVM(), 7);
 -@@ -96,7 +96,7 @@
++@@ -96,7 +96,7 @@ OFTEST(dcmdata_decimalString_putFloat64)
+  {
+      // Test insertion in the beginning
+      OFString testStr;
+ -    DcmDecimalString decStr(DCM_ContourData, EVR_DS);
+ +    DcmDecimalString decStr(DCM_ContourData);
+      OFCHECK(decStr.putFloat64(0, 0).good());
+      decStr.getOFStringArray(testStr);
+      OFCHECK(testStr == "0");
index 4da6ebaffaec81521226d9639e6f2590a1e2487c,cb6ccbe9393214a59ed9227a696286237b1de842..8aa71984531647cf9dd28acc47271ded6a179ae6
@@@ -6,11 -6,10 +6,12 @@@ Description: Don't add executables to c
   to configure the according package. 
  Bug-Debian: https://bugs.debian.org/803304
  Author: Gert Wollny <gw.fossdev@gmail.com>
 ---- a/CMake/dcmtkMacros.cmake
 -+++ b/CMake/dcmtkMacros.cmake
 -@@ -60,11 +60,11 @@
+ Forwarded: not-needed
 +Index: dcmtk/CMake/dcmtkMacros.cmake
 +===================================================================
 +--- dcmtk.orig/CMake/dcmtkMacros.cmake
 ++++ dcmtk/CMake/dcmtkMacros.cmake
 +@@ -55,11 +55,11 @@ macro(DCMTK_ADD_EXECUTABLE PROGRAM)
           endif()
   
           # Collect executable as part of global DCMTK_EXECUTABLE_TARGETS property
index ed411ca19ccf0b338a0f6a70def5a3bff2e142f5,09d1196ed47bd1e2122ffe6fdf8ef0ed07f74229..d9c6a6a1b2e65512d7b09aa3e725a9cfa136873d
@@@ -8,6 -8,10 +8,11 @@@
  #0cf6b12d8ea0b727f0fe2ab076b6f180100fbd30.patch
  #ab61e8577ff0974efcfae2907c48baf6023c1160.patch
  #1c8cca4bf6f7c92fc16f9e66faf49409c891a2b0.patch
 -f06a867513524664a1b03dfcf812d8b60fdd02cc.patch
 -c34f4e46e672ad21accf04da0dc085e43be6f5e1.patch
 +#f06a867513524664a1b03dfcf812d8b60fdd02cc.patch
 +remove_version.patch
 +da5370947226783ce3548bf1e5b7112fac70de46.patch
+ 0001-Fixed-unchecked-typecasts-of-DcmItem-search-results.patch
+ 0002-Fixed-unchecked-typecasts-and-fixed-LUT-handling.patch
+ 0003-Fixed-wrong-error-handling-previous-commit.patch
+ 0004-Fixed-two-segmentation-faults.patch
+ 0005-Fixed-DcmDecimalString-unit-tests.patch
diff --cc debian/rules
Simple merge