[PATCH] Fixed unchecked typecasts of DcmItem::search results.
authorMarco Eichelberg <dicom@offis.de>
Mon, 15 Apr 2024 10:12:51 +0000 (12:12 +0200)
committerMathieu Malaterre <malat@debian.org>
Mon, 8 Jul 2024 11:31:04 +0000 (13:31 +0200)
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.

Gbp-Pq: Name 0001-Fixed-unchecked-typecasts-of-DcmItem-search-results.patch

39 files changed:
dcmdata/apps/cda2dcm.cc [changed mode: 0755->0644]
dcmdata/apps/stl2dcm.cc [changed mode: 0755->0644]
dcmdata/include/dcmtk/dcmdata/dcelem.h
dcmdata/include/dcmtk/dcmdata/dcencdoc.h [changed mode: 0755->0644]
dcmdata/include/dcmtk/dcmdata/dcobject.h
dcmdata/libsrc/dcddirif.cc
dcmdata/libsrc/dcdirrec.cc
dcmdata/libsrc/dcfilefo.cc
dcmdata/libsrc/dcitem.cc
dcmimgle/libsrc/didocu.cc
dcmiod/libsrc/iodutil.cc
dcmjpeg/libsrc/djcodece.cc
dcmnet/apps/storescu.cc
dcmnet/libsrc/dimcmd.cc
dcmnet/libsrc/diutil.cc
dcmnet/libsrc/dstorscu.cc
dcmpstat/apps/dcmmklut.cc
dcmpstat/apps/dcmpschk.cc
dcmpstat/libsrc/dviface.cc
dcmpstat/libsrc/dvpsabl.cc
dcmpstat/libsrc/dvpscu.cc
dcmpstat/libsrc/dvpsdal.cc
dcmpstat/libsrc/dvpsfs.cc
dcmpstat/libsrc/dvpsgal.cc
dcmpstat/libsrc/dvpsgll.cc
dcmpstat/libsrc/dvpsgrl.cc
dcmpstat/libsrc/dvpshlp.cc
dcmpstat/libsrc/dvpsib.cc
dcmpstat/libsrc/dvpsibl.cc
dcmpstat/libsrc/dvpspll.cc
dcmpstat/libsrc/dvpsril.cc
dcmpstat/libsrc/dvpsrsl.cc
dcmpstat/libsrc/dvpssp.cc
dcmpstat/libsrc/dvpstxl.cc
dcmpstat/libsrc/dvpsvll.cc
dcmrt/libsrc/drttypes.cc
dcmsign/libsrc/dcsignat.cc
dcmsign/libsrc/sicert.cc
dcmsr/libsrc/dsrtypes.cc

old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index b6ffeb7eb08d2d929bf1bd6d5d50fdf143fb4c74..2978e961806368a0dbe77a4ddd4bbbf4dfcfac67 100644 (file)
@@ -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
      */
old mode 100755 (executable)
new mode 100644 (file)
index 60490f6bc87a4c9feadc49bb81bdbafa6cb067cd..714520bcf5732c377c5c73dabfa47899484d626a 100644 (file)
@@ -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
index 3ff1057d7cf50857a833d986cd30ec7df34be4c2..9e51dad83fc31cc9cb967fbe097eff90426065d2 100644 (file)
@@ -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() && stack1.top()->isElement() && stack2.top()->isElement())
             {
                 if (!compareAttributes(OFstatic_cast(DcmElement *, stack1.top()), OFstatic_cast(DcmElement *, stack2.top()), fromSequence, i++, reason))
                     break;
@@ -5586,7 +5586,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) && stack.top()->isElement())
         {
             delem = OFstatic_cast(DcmElement *, stack.top());
             if ((delem != NULL) && (delem->getLength() > 0))
index c5d53e32591e7ba524730639fcf3b6b86a5863ad..fbd56aef6c137845d7b6987cd2bdfa0c4675043c 100644 (file)
@@ -1007,7 +1007,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);
@@ -1020,7 +1020,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);
@@ -1033,7 +1033,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);
index 4f72dee83d3034459261667d5154368a3431805e..5771e604cc4dbe4c39105ac07518370a17fcf96f 100644 (file)
@@ -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
@@ -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);
@@ -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);
@@ -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);
@@ -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);
@@ -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() == DCM_TransferSyntaxUID)
index 3960fceb4533ae90eb138bf10c9174cd30acbc43..51f95d21dda82c4bee79a30b8e5bd623bc9b8ebd 100644 (file)
@@ -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() && stack.top()->isElement())
     {
         DcmElement *elem = OFstatic_cast(DcmElement *, stack.top());
         if (elem != NULL)
@@ -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() && stack.top()->isElement())
     {
         element = OFstatic_cast(DcmElement *, stack.top());
         /* should never happen but ... */
@@ -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() && stack.top()->isElement())
     {
         DcmElement *delem = OFstatic_cast(DcmElement *, stack.top());
         /* should never happen but ... */
@@ -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() && stack.top()->isElement())
     {
         /* get element */
         DcmElement *delem = OFstatic_cast(DcmElement *, stack.top());
@@ -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() && stack.top()->isElement())
     {
         /* get element */
         DcmElement *delem = OFstatic_cast(DcmElement *, stack.top());
@@ -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() && stack.top()->isElement())
     {
         /* get element */
         DcmElement *delem = OFstatic_cast(DcmElement *, stack.top());
@@ -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() && stack.top()->isElement())
         {
             /* get element */
             DcmElement *delem = OFstatic_cast(DcmElement *, stack.top());
index 00b73b5692d90cae3d49d0100ca17680903bf6fc..2f1589cb733e6b1d5ec0dffd7453a035631c630c 100644 (file)
@@ -218,7 +218,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) && stack.top()->isElement())
     {
         return OFstatic_cast(DcmElement *, stack.top());
     }
index 23a5d0ef10d7af251593bd0757380744bab604b9..30274214aa95c20a6bb7baf074d6b96045bd753b 100644 (file)
@@ -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() && stack.top()->isElement())
     {
         /* copy object from search stack */
         result = delem.copyFrom(*stack.top());
@@ -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() && stack.top()->isElement())
     {
         /* copy object from search stack */
         delem = OFstatic_cast(DcmElement*, stack.top()->clone());
index 4128a20402b08a8ee3a7ae583974e8aa9e69edd6..d0371f6c2b23d6ffc7608741c521db7482551a18 100644 (file)
@@ -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
@@ -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() && 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() && 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() && stack.top()->isElement())
   {
     explanation = OFreinterpret_cast(DcmElement*, stack.top());
   }
index 4c351ff3bcb1d89347173b04a7a6ded140404b2a..72e17260ef675d2605dd51d6af6c97c9ed711659 100644 (file)
@@ -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 (! 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());
index 6dca39546d6e1e31a9c74ce7def18babcd5a7bf1..a3d8d52d458b0859d00873f28e7458368a0e180c 100644 (file)
@@ -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() && 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 @@ 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() && 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 @@ 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() && 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 @@ 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() && stack.top()->isElement())
+        elem = (DcmElement*)stack.top();
+
+    if (elem) {
         nBytes = elem->getLength();
         *listCount = (int)(nBytes / sizeof(Uint16));
         if (*listCount > 0) {
@@ -395,7 +403,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);
 }
 
 /*
index b294afe5614b09cfa256bbdb635a80968858aa47..c2268233e6e112210e584b9130b5ff8590d7d27f 100644 (file)
@@ -159,23 +159,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) && 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 @@ 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 @@ 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() && 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 @@ 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
index 869f52ee25d2878f8be923069e29b1e792552764..198142b9ca9aad41ced672afe90683983e74b442 100644 (file)
@@ -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() && stack.top()->isElement())
         {
             // make sure that the dataset and element pointer are there
             if (stack.card() > 1)
index 044a17b3afd74119e96d0d489d88a5fe38fffacd..6a72ed3843a7472e4324780db0bd869425a1bb00 100644 (file)
@@ -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 @@ 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)
index ada6b164a35a9c17d2810964c52850bf6546b177..12826b23f786bbb07cc8a4c4fe656c3c025b9850 100644 (file)
@@ -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() && stack.top()->isElement())
+    {
+        elem = (DcmElement*) stack.top();
+    }
+
     if (elem)
         elem->print(str, DCMTypes::PF_shortenLongTagValues);
     else
index 0d6ca23cce49ed501e127103717c2674bb0ad30d..603501522e5799b84e3503d45ed0ff36b0e0ae9a 100644 (file)
@@ -1425,14 +1425,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 @@ 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) && 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) && stack.top()->isElement())
     {
       OFstatic_cast(DcmElement *, stack.top())->getString(classUID);
     }
@@ -3764,7 +3764,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());
index 62cc1d51b9ea134d4999277f052c7a326ae77007..bbda18183e795397dcdc2a605dd2f623424e3046 100644 (file)
@@ -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 @@ 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)
index be3c81fe0465e0fe9ef0d41ee0f3d4ec8a52cc44..02a19452f11487b833f87783eaa76584a112ae5f 100644 (file)
@@ -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 @@ 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) && 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) && stack.top()->isElement())
   {
     d_curveDimensions = (DcmElement *)(stack.top());
   } else return EC_IllegalCall;
@@ -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) && 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) && 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) && 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) && 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) && 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) && stack.top()->isElement())
   {
     d_curveLabel = (DcmElement *)(stack.top());
   }
index 519aa977fd464e9882354f2c543cd0a2638d9f9c..969c18299947140510c52277d4591e8dbdde7c0c 100644 (file)
@@ -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 @@ 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)
index 5a5173c1559a1ed20c380e7c1cb20c7e4a70bbb3..ba311b258e960b5fadccc7c7db3c52741ce57e5d 100644 (file)
@@ -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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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)
index 909deac9e25c545635995bb7f10d5d5f90ddde08..89d893de83879d6de3c26a874025f63740fee26c 100644 (file)
@@ -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 @@ 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)
index d82d20862844ff055e44b80a7083936f6a7a7cb3..fbf5d97d726331eff358a5d224a7470840d0d256 100644 (file)
@@ -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 @@ 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)
index 14d0e713f9457ed589ca882d5934547824bae9d4..61dd6565c323b9df4046bfda87ef9cb57b0e662b 100644 (file)
@@ -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 @@ 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)
index dc0576d6c319b6cc0a9c3bde410f7900b50c11e6..7691f07834d166f565a81dc6383ffe4a683b5049 100644 (file)
@@ -178,7 +178,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());
index 096c5b3e1931774e40eaa3c3affe95110fb53382..57fee5763b5d388cd209914da2b2ff9463c1dbd8 100644 (file)
@@ -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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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)) && stack.top()->isElement())
     {
       pixelData = new DcmPixelData(DCM_PixelData);
       if (pixelData)
index e3768d5a0d71ef5eee68f675b47c85b2436241e0..ef069eb84572e8e79969beb47060a65ecb87cc9d 100644 (file)
@@ -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 @@ 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)
index 1b2b7a35bbcc282f117ccf5010fb568aab21ea93..46465171c70e633746b6978969bbf9a96e044151 100644 (file)
@@ -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 @@ 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)
index 793e69063a5546c08a3e1c670cf6598c97d8c1cd..9dee1f6bfd5f5cbe553311f909917f0dcd273751 100644 (file)
@@ -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)
index 4b0c83aa758f637b2b7fa25f78ef192cffe7fef5..d2f9dcfffd3d0c6865cfe801d498226d6097b45d 100644 (file)
@@ -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 @@ 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)
index 98b1201a7fb1c91954c86ae9e70d8b77be98e8db..717c814607be4ac07487adab737506165d24f997 100644 (file)
@@ -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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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)
index ffb6dcc10e52eb01ff5ba936f18377e537476b58..8e35ff7ae6b21f0334c0311b4fd4c04daaef6ac9 100644 (file)
@@ -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 @@ 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)
index 3859f4ab96f830ec9b222e2a84010f9f224119be..17a62770714c86aa2065746f0894539fd13fe67a 100644 (file)
@@ -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 @@ 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)
index 3aee4312f240fa57c78d7d5752703e130f00ca10..77ff1674c6971e961a716e2158374403799dff70 100644 (file)
@@ -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 @@ OFCondition DRTTypes::getAndCheckStringValueFromDataset(DcmItem &dataset,
 {
     DcmStack stack;
     OFCondition result = dataset.search(tagKey, stack, ESM_fromHere, OFFalse /*searchIntoSub*/);
-    if (result.good())
+    if (result.good() && stack.top()->isElement())
     {
         DcmElement *element = OFstatic_cast(DcmElement *, stack.top());
         if (element != NULL)
index b104ec1e8167a538f95b2b20dba0e664498b8ff9..c5b57099a450bce0c9c51c70c5da5212dedd0150 100644 (file)
@@ -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() && (stack.top()->isElement()))
   {
     result = ((DcmElement *)(stack.top()))->getUint16(macid);
   }
@@ -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() && (stack.top()->isElement()))
     {
       char *uid = NULL;
       if ((((DcmElement *)(stack.top()))->getString(uid)).good())
@@ -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() && (stack.top()->isElement()))
     {
       OFString macidentifier;
       if ((((DcmElement *)(stack.top()))->getOFString(macidentifier, 0)).good())
@@ -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;
@@ -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() && (stack.top()->isElement()))
   {
     char *uid = NULL;
     if ((((DcmElement *)(stack.top()))->getString(uid)).good() && uid)
@@ -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() && (stack.top()->isElement()))
   {
     if ((((DcmElement *)(stack.top()))->getOFString(str, 0)).good()) result = EC_Normal;
   }
@@ -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() && (stack.top()->isElement()))
   {
     if ((((DcmElement *)(stack.top()))->getOFString(str, 0)).good()) result = EC_Normal;
   }
@@ -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() && (stack.top()->isElement()))
   {
     if ((((DcmElement *)(stack.top()))->getOFString(str, 0)).good()) result = EC_Normal;
   }
@@ -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() && (stack.top()->isElement()))
     {
       char *uid = NULL;
       if ((((DcmElement *)(stack.top()))->getString(uid)).good())
@@ -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() && (stack.top()->isElement()))
     {
       OFString macidentifier;
       if ((((DcmElement *)(stack.top()))->getOFString(macidentifier, 0)).good())
index 683f4f1a0038e96037dbc15b00583c391e4c0017..02824e9429fbf06af566c4c6e1aea830263dec43 100644 (file)
@@ -147,7 +147,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() && stack.top()->isElement())
   {
     result = ((DcmElement *)(stack.top()))->getOFString(aString, 0);
     if (result.good())
@@ -156,7 +156,7 @@ OFCondition SiCertificate::read(DcmItem& item)
       {
         stack.clear();
         result = item.search(DCM_CertificateOfSigner, stack, ESM_fromHere, OFFalse);
-        if (result.good())
+        if (result.good() && stack.top()->isElement())
         {
           DcmElement *cert = (DcmElement *)stack.top();
           Uint8 *data = NULL;
index 08414ad93e6213bd6d58f425a8a66a464275fde6..a9d6218594f826b3f9d44dc272505879848f9194 100644 (file)
@@ -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() && stack.top()->isElement())
     {
         /* copy object from search stack */
         result = delem.copyFrom(*stack.top());
@@ -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() && stack.top()->isElement())
     {
         DcmElement *delem = OFstatic_cast(DcmElement *, stack.top());
         /* we need a reference to the original element in order to determine the SpecificCharacterSet */