-From 490f9dd15d1c98cd3b79e5088136cda1fb2d7405 Mon Sep 17 00:00:00 2001
+From b8e1d6f7a0e2fba1b0dd138c790751bf88220464 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.
when invalid DICOM datasets were processed where elements had the wrong
value representation.
---
- dcmdata/apps/cda2dcm.cc | 0
- dcmdata/apps/stl2dcm.cc | 0
- dcmdata/include/dcmtk/dcmdata/dcelem.h | 5 +++
- 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 | 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 +--
- 39 files changed, 191 insertions(+), 167 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
+ 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(-)
---- a/dcmdata/include/dcmtk/dcmdata/dcelem.h
-+++ b/dcmdata/include/dcmtk/dcmdata/dcelem.h
-@@ -143,6 +143,11 @@
- */
- 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
- */
---- 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 @@
- */
- 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
--- a/dcmdata/libsrc/dcddirif.cc
+++ b/dcmdata/libsrc/dcddirif.cc
@@ -433,7 +433,7 @@
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())
++ while (item1->nextObject(stack1, first).good() && item2->nextObject(stack2, first).good() && (dynamic_cast<DcmElement*>(stack1.top()) != nullptr) && (dynamic_cast<DcmElement*>(stack2.top()) != nullptr))
{
if (!compareAttributes(OFstatic_cast(DcmElement *, stack1.top()), OFstatic_cast(DcmElement *, stack2.top()), fromSequence, i++, reason))
break;
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())
++ while (record->nextObject(stack, first).good() && (result || !abortCheck) && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
{
delem = OFstatic_cast(DcmElement *, stack.top());
if ((delem != NULL) && (delem->getLength() > 0))
OFBool result = OFFalse;
- if (search(key, stack, ESM_fromHere, searchIntoSub).good())
-+ if (search(key, stack, ESM_fromHere, searchIntoSub).good() && stack.top()->isElement())
++ if (search(key, stack, ESM_fromHere, searchIntoSub).good() && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
{
DcmElement *elem = OFstatic_cast(DcmElement *, stack.top());
if (elem != NULL)
/* find the element */
OFCondition status = search(tagKey, stack, ESM_fromHere, searchIntoSub);
- if (status.good())
-+ if (status.good() && stack.top()->isElement())
++ if (status.good() && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
{
element = OFstatic_cast(DcmElement *, stack.top());
/* should never happen but ... */
/* find the element */
OFCondition status = search(seqTagKey, stack, ESM_fromHere, searchIntoSub);
- if (status.good())
-+ if (status.good() && stack.top()->isElement())
++ if (status.good() && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
{
DcmElement *delem = OFstatic_cast(DcmElement *, stack.top());
/* should never happen but ... */
/* find sequence */
OFCondition status = search(seqTagKey, stack, ESM_fromHere, OFFalse /*searchIntoSub*/);
- if (status.good())
-+ if (status.good() && stack.top()->isElement())
++ if (status.good() && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
{
/* get element */
DcmElement *delem = OFstatic_cast(DcmElement *, stack.top());
DcmSequenceOfItems *sequence = NULL;
/* sequence found? */
- if (status.good())
-+ if (status.good() && stack.top()->isElement())
++ if (status.good() && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
{
/* get element */
DcmElement *delem = OFstatic_cast(DcmElement *, stack.top());
/* find sequence */
OFCondition status = search(seqTagKey, stack, ESM_fromHere, OFFalse /*searchIntoSub*/);
- if (status.good())
-+ if (status.good() && stack.top()->isElement())
++ if (status.good() && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
{
/* get element */
DcmElement *delem = OFstatic_cast(DcmElement *, stack.top());
DcmSequenceOfItems *sequence = NULL;
/* sequence found? */
- if (status.good())
-+ if (status.good() && stack.top()->isElement())
++ if (status.good() && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
{
/* get element */
DcmElement *delem = OFstatic_cast(DcmElement *, stack.top());
// 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())
++ (stack.top()->getLength(Xfer) > 0) && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
{
return OFstatic_cast(DcmElement *, stack.top());
}
const DcmTagKey tagKey = delem.getTag();
OFCondition result = dataset.search(tagKey, stack, ESM_fromHere, OFFalse /*searchIntoSub*/);
- if (result.good())
-+ if (result.good() && stack.top()->isElement())
++ if (result.good() && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
{
/* copy object from search stack */
result = delem.copyFrom(*stack.top());
DcmStack stack;
OFCondition result = dataset.search(tagKey, stack, ESM_fromHere, OFFalse /*searchIntoSub*/);
- if (result.good())
-+ if (result.good() && stack.top()->isElement())
++ if (result.good() && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
{
/* copy object from search stack */
delem = OFstatic_cast(DcmElement*, stack.top()->clone());
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())
++ if ((dataset->search(DCM_WindowCenter, stack, ESM_fromHere, OFFalse)).good() && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
{
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())
++ if ((dataset->search(DCM_WindowWidth, stack, ESM_fromHere, OFFalse)).good() && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
{
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())
++ if ((dataset->search(DCM_WindowCenterWidthExplanation, stack, ESM_fromHere, OFFalse)).good() && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
{
explanation = OFreinterpret_cast(DcmElement*, stack.top());
}
return OFFalse;
}
-+ if (! stack.top()->isElement())
++ if (! (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
+ {
+ OFLOG_ERROR(storescuLogger, "updateStringAttributeValue: not a DcmElement: " << tag.getTagName() << " " << key);
+ return OFFalse;
ec = obj->search(t, stack);
- elem = (DcmElement*)stack.top();
- if (ec == EC_Normal && elem != NULL) {
-+ if (ec.good() && stack.top()->isElement())
++ if (ec.good() && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
+ elem = (DcmElement*)stack.top();
+
+ if (elem != NULL) {
ec = obj->search(t, stack);
- elem = (DcmElement*)stack.top();
- if (ec == EC_Normal && elem != NULL) {
-+ if (ec.good() && stack.top()->isElement())
++ if (ec.good() && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
+ elem = (DcmElement*)stack.top();
+
+ if (elem != NULL) {
ec = obj->search(t, stack);
- elem = (DcmElement*)stack.top();
- if (ec == EC_Normal && elem != NULL) {
-+ if (ec.good() && stack.top()->isElement())
++ if (ec.good() && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
+ elem = (DcmElement*)stack.top();
+
+ if (elem != NULL) {
ec = obj->search(t, stack);
- elem = (DcmElement*)stack.top();
- if (ec == EC_Normal && elem != NULL) {
-+ if (ec.good() && stack.top()->isElement())
++ if (ec.good() && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
+ elem = (DcmElement*)stack.top();
+
+ if (elem) {
- 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()) {
++ if (ec.good() && (stack.top() != NULL) && (dynamic_cast<DcmElement*>(stack.top()) != nullptr)) {
+ DcmElement *elem = (DcmElement *) stack.top();
if (elem->getLength() == 0) {
s[0] = '\0';
- if (ec == EC_Normal && elem != NULL) {
- ec = elem->getUint16(*us, 0);
+ OFCondition ec = obj->search(t, stack);
-+ if (ec.good() && stack.top()->isElement())
++ if (ec.good() && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
+ {
+ elem = (DcmElement*) stack.top();
+ if (elem) ec = elem->getUint16(*us, 0);
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())
++ while (dataset->search(DCM_ReferencedFileID, stack, ESM_afterStackTop, OFTrue).good() && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
{
// make sure that the dataset and element pointer are there
if (stack.card() > 1)
ec = dset->search(key, stack, ESM_fromHere, OFFalse);
- elem = (DcmElement*) stack.top();
-+ if (ec.good() && stack.top()->isElement())
++ if (ec.good() && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
+ {
+ elem = (DcmElement*) stack.top();
+ }
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())
++ if (EC_Normal == dset->search(DCM_SOPInstanceUID, stack, ESM_fromHere, OFFalse) && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
{
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())
++ if (EC_Normal == dset->search(DCM_SOPClassUID, stack, ESM_fromHere, OFFalse) && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
{
OFstatic_cast(DcmElement *, stack.top())->getString(classUID);
}
/* 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())
++ if (EC_Normal == dset.search(key, stack, ESM_fromHere, OFFalse) && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
{
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())
++ if (EC_Normal == dset.search(key, stack, ESM_fromHere, OFFalse) && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
{
d_curveDimensions = (DcmElement *)(stack.top());
} else return EC_IllegalCall;
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())
++ if (EC_Normal == dset.search(key, stack, ESM_fromHere, OFFalse) && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
{
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())
++ if (EC_Normal == dset.search(key, stack, ESM_fromHere, OFFalse) && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
{
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())
++ if (EC_Normal == dset.search(key, stack, ESM_fromHere, OFFalse) && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
{
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())
++ if (EC_Normal == dset.search(key, stack, ESM_fromHere, OFFalse) && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
{
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())
++ if (EC_Normal == dset.search(key, stack, ESM_fromHere, OFFalse) && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
{
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())
++ if (EC_Normal == dset.search(key, stack, ESM_fromHere, OFFalse) && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
{
d_curveLabel = (DcmElement *)(stack.top());
}
{
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())
++ if (rqDataset && (EC_Normal == rqDataset->search(DCM_PixelData, stack, ESM_fromHere, OFFalse)) && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
{
pixelData = new DcmPixelData(DCM_PixelData);
if (pixelData)
DcmStack stack;
OFCondition result = dataset.search(tagKey, stack, ESM_fromHere, OFFalse /*searchIntoSub*/);
- if (result.good())
-+ if (result.good() && stack.top()->isElement())
++ if (result.good() && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
{
DcmElement *element = OFstatic_cast(DcmElement *, stack.top());
if (element != NULL)
DcmStack stack;
OFCondition result = item.search(DCM_MACIDNumber, stack, ESM_fromHere, OFFalse);
- if (result.good() && (stack.top()->isLeaf()))
-+ if (result.good() && (stack.top()->isElement()))
++ if (result.good() && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
{
result = ((DcmElement *)(stack.top()))->getUint16(macid);
}
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()))
++ if ((selectedMacParametersItem->search(DCM_MACCalculationTransferSyntaxUID, stack, ESM_fromHere, OFFalse)).good() && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
{
char *uid = NULL;
if ((((DcmElement *)(stack.top()))->getString(uid)).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()))
++ if ((selectedMacParametersItem->search(DCM_MACAlgorithm, stack, ESM_fromHere, OFFalse)).good() && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
{
OFString macidentifier;
if ((((DcmElement *)(stack.top()))->getOFString(macidentifier, 0)).good())
// 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()))
++ if ((selectedMacParametersItem->search(DCM_MACCalculationTransferSyntaxUID, stack, ESM_fromHere, OFFalse)).good() && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
{
char *uid = NULL;
if ((((DcmElement *)(stack.top()))->getString(uid)).good() && uid)
// 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 ((selectedMacParametersItem->search(DCM_MACAlgorithm, stack, ESM_fromHere, OFFalse)).good() && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
{
if ((((DcmElement *)(stack.top()))->getOFString(str, 0)).good()) result = EC_Normal;
}
// 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 ((selectedSignatureItem->search(DCM_DigitalSignatureUID, stack, ESM_fromHere, OFFalse)).good() && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
{
if ((((DcmElement *)(stack.top()))->getOFString(str, 0)).good()) result = EC_Normal;
}
// 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 ((selectedSignatureItem->search(DCM_DigitalSignatureDateTime, stack, ESM_fromHere, OFFalse)).good() && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
{
if ((((DcmElement *)(stack.top()))->getOFString(str, 0)).good()) result = EC_Normal;
}
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()))
++ if ((selectedMacParametersItem->search(DCM_MACCalculationTransferSyntaxUID, stack, ESM_fromHere, OFFalse)).good() && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
{
char *uid = NULL;
if ((((DcmElement *)(stack.top()))->getString(uid)).good())
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()))
++ if ((selectedMacParametersItem->search(DCM_MACAlgorithm, stack, ESM_fromHere, OFFalse)).good() && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
{
OFString macidentifier;
if ((((DcmElement *)(stack.top()))->getOFString(macidentifier, 0)).good())
DcmStack stack;
result = item.search(DCM_CertificateType, stack, ESM_fromHere, OFFalse);
- if (result.good())
-+ if (result.good() && stack.top()->isElement())
++ if (result.good() && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
{
result = ((DcmElement *)(stack.top()))->getOFString(aString, 0);
if (result.good())
stack.clear();
result = item.search(DCM_CertificateOfSigner, stack, ESM_fromHere, OFFalse);
- if (result.good())
-+ if (result.good() && stack.top()->isElement())
++ if (result.good() && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
{
DcmElement *cert = (DcmElement *)stack.top();
Uint8 *data = NULL;
const DcmTagKey tagKey = delem.getTag();
OFCondition result = dataset.search(tagKey, stack, ESM_fromHere, OFFalse /*searchIntoSub*/);
- if (result.good())
-+ if (result.good() && stack.top()->isElement())
++ if (result.good() && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
{
/* copy object from search stack */
result = delem.copyFrom(*stack.top());
DcmStack stack;
OFCondition result = dataset.search(tagKey, stack, ESM_fromHere, OFFalse /*searchIntoSub*/);
- if (result.good())
-+ if (result.good() && stack.top()->isElement())
++ if (result.good() && (dynamic_cast<DcmElement*>(stack.top()) != nullptr))
{
DcmElement *delem = OFstatic_cast(DcmElement *, stack.top());
/* we need a reference to the original element in order to determine the SpecificCharacterSet */