From: Marco Eichelberg Date: Mon, 15 Apr 2024 10:12:51 +0000 (+0200) Subject: [PATCH] Fixed unchecked typecasts of DcmItem::search results. X-Git-Tag: archive/raspbian/3.6.8-7+rpi1^2~8 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=84bf55e1f56ff1bebc76e6e30466ec13def0d0e8;p=dcmtk.git [PATCH] Fixed unchecked typecasts of DcmItem::search results. DcmItem::search() returns a stack of DcmObject pointers as search results. These pointers in most instances need to be casted to DcmItem, DcmElement or a subclass of these. In many cases, the type of the object was not properly checked before the typecast. This could lead to segmentation faults when invalid DICOM datasets were processed where elements had the wrong value representation. Gbp-Pq: Name 0001-Fixed-unchecked-typecasts-of-DcmItem-search-results.patch --- diff --git a/dcmdata/include/dcmtk/dcmdata/dcelem.h b/dcmdata/include/dcmtk/dcmdata/dcelem.h index b6ffeb7e..2978e961 100644 --- a/dcmdata/include/dcmtk/dcmdata/dcelem.h +++ b/dcmdata/include/dcmtk/dcmdata/dcelem.h @@ -1,6 +1,6 @@ /* * - * Copyright (C) 1994-2023, OFFIS e.V. + * Copyright (C) 1994-2024, OFFIS e.V. * All rights reserved. See COPYRIGHT file for details. * * This software and supporting documentation were developed by @@ -144,6 +144,11 @@ class DCMTK_DCMDATA_EXPORT DcmElement */ virtual OFBool isLeaf() const { return OFTrue; } + /** check if this element can be safely casted to DcmElement + * @return true if DcmElement, false otherwise + */ + virtual OFBool isElement() const { return OFTrue; } + /** check if value of this element is loaded into main memory * @return true if value is present in memory, false if value still resides in file */ diff --git a/dcmdata/include/dcmtk/dcmdata/dcobject.h b/dcmdata/include/dcmtk/dcmdata/dcobject.h index 60490f6b..714520bc 100644 --- a/dcmdata/include/dcmtk/dcmdata/dcobject.h +++ b/dcmdata/include/dcmtk/dcmdata/dcobject.h @@ -1,6 +1,6 @@ /* * - * Copyright (C) 1994-2020, OFFIS e.V. + * Copyright (C) 1994-2024, OFFIS e.V. * All rights reserved. See COPYRIGHT file for details. * * This software and supporting documentation were developed by @@ -308,6 +308,11 @@ class DCMTK_DCMDATA_EXPORT DcmObject */ virtual OFBool isLeaf() const = 0; + /** check if this element can be safely casted to DcmElement + * @return true if DcmElement, false otherwise + */ + virtual OFBool isElement() const { return OFFalse; } + /** check if this element is nested in a sequence of items, i.e.\ not a * top-level or stand-alone element * @return true if this element is nested, false otherwise diff --git a/dcmdata/libsrc/dcddirif.cc b/dcmdata/libsrc/dcddirif.cc index 3ff1057d..9e51dad8 100644 --- a/dcmdata/libsrc/dcddirif.cc +++ b/dcmdata/libsrc/dcddirif.cc @@ -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)) diff --git a/dcmdata/libsrc/dcdirrec.cc b/dcmdata/libsrc/dcdirrec.cc index c5d53e32..fbd56aef 100644 --- a/dcmdata/libsrc/dcdirrec.cc +++ b/dcmdata/libsrc/dcdirrec.cc @@ -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); diff --git a/dcmdata/libsrc/dcfilefo.cc b/dcmdata/libsrc/dcfilefo.cc index 4f72dee8..5771e604 100644 --- a/dcmdata/libsrc/dcfilefo.cc +++ b/dcmdata/libsrc/dcfilefo.cc @@ -1,6 +1,6 @@ /* * - * Copyright (C) 1994-2022, OFFIS e.V. + * Copyright (C) 1994-2024, OFFIS e.V. * All rights reserved. See COPYRIGHT file for details. * * This software and supporting documentation were developed by @@ -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) diff --git a/dcmdata/libsrc/dcitem.cc b/dcmdata/libsrc/dcitem.cc index 3960fceb..51f95d21 100644 --- a/dcmdata/libsrc/dcitem.cc +++ b/dcmdata/libsrc/dcitem.cc @@ -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()); diff --git a/dcmimgle/libsrc/didocu.cc b/dcmimgle/libsrc/didocu.cc index 00b73b56..2f1589cb 100644 --- a/dcmimgle/libsrc/didocu.cc +++ b/dcmimgle/libsrc/didocu.cc @@ -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()); } diff --git a/dcmiod/libsrc/iodutil.cc b/dcmiod/libsrc/iodutil.cc index 23a5d0ef..30274214 100644 --- a/dcmiod/libsrc/iodutil.cc +++ b/dcmiod/libsrc/iodutil.cc @@ -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()); diff --git a/dcmjpeg/libsrc/djcodece.cc b/dcmjpeg/libsrc/djcodece.cc index 4128a204..d0371f6c 100644 --- a/dcmjpeg/libsrc/djcodece.cc +++ b/dcmjpeg/libsrc/djcodece.cc @@ -1,6 +1,6 @@ /* * - * Copyright (C) 2001-2022, OFFIS e.V. + * Copyright (C) 2001-2024, OFFIS e.V. * All rights reserved. See COPYRIGHT file for details. * * This software and supporting documentation were developed by @@ -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()); } diff --git a/dcmnet/apps/storescu.cc b/dcmnet/apps/storescu.cc index 4c351ff3..72e17260 100644 --- a/dcmnet/apps/storescu.cc +++ b/dcmnet/apps/storescu.cc @@ -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()); diff --git a/dcmnet/libsrc/dimcmd.cc b/dcmnet/libsrc/dimcmd.cc index 6dca3954..a3d8d52d 100644 --- a/dcmnet/libsrc/dimcmd.cc +++ b/dcmnet/libsrc/dimcmd.cc @@ -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); } /* diff --git a/dcmnet/libsrc/diutil.cc b/dcmnet/libsrc/diutil.cc index b294afe5..c2268233 100644 --- a/dcmnet/libsrc/diutil.cc +++ b/dcmnet/libsrc/diutil.cc @@ -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 diff --git a/dcmnet/libsrc/dstorscu.cc b/dcmnet/libsrc/dstorscu.cc index 869f52ee..198142b9 100644 --- a/dcmnet/libsrc/dstorscu.cc +++ b/dcmnet/libsrc/dstorscu.cc @@ -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) diff --git a/dcmpstat/apps/dcmmklut.cc b/dcmpstat/apps/dcmmklut.cc index 044a17b3..6a72ed38 100644 --- a/dcmpstat/apps/dcmmklut.cc +++ b/dcmpstat/apps/dcmmklut.cc @@ -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) diff --git a/dcmpstat/apps/dcmpschk.cc b/dcmpstat/apps/dcmpschk.cc index ada6b164..12826b23 100644 --- a/dcmpstat/apps/dcmpschk.cc +++ b/dcmpstat/apps/dcmpschk.cc @@ -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 diff --git a/dcmpstat/libsrc/dviface.cc b/dcmpstat/libsrc/dviface.cc index 0d6ca23c..60350152 100644 --- a/dcmpstat/libsrc/dviface.cc +++ b/dcmpstat/libsrc/dviface.cc @@ -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()); diff --git a/dcmpstat/libsrc/dvpsabl.cc b/dcmpstat/libsrc/dvpsabl.cc index 62cc1d51..bbda1818 100644 --- a/dcmpstat/libsrc/dvpsabl.cc +++ b/dcmpstat/libsrc/dvpsabl.cc @@ -1,6 +1,6 @@ /* * - * Copyright (C) 1999-2010, OFFIS e.V. + * Copyright (C) 1999-2024, OFFIS e.V. * All rights reserved. See COPYRIGHT file for details. * * This software and supporting documentation were developed by @@ -69,7 +69,7 @@ OFCondition DVPSAnnotationContent_PList::read(DcmItem &dset) DcmSequenceOfItems *dseq=NULL; DcmItem *ditem=NULL; - if (EC_Normal == dset.search(DCM_RETIRED_AnnotationContentSequence, stack, ESM_fromHere, OFFalse)) + if (EC_Normal == dset.search(DCM_RETIRED_AnnotationContentSequence, stack, ESM_fromHere, OFFalse) && (stack.top()->ident() == EVR_SQ)) { dseq=(DcmSequenceOfItems *)stack.top(); if (dseq) diff --git a/dcmpstat/libsrc/dvpscu.cc b/dcmpstat/libsrc/dvpscu.cc index be3c81fe..02a19452 100644 --- a/dcmpstat/libsrc/dvpscu.cc +++ b/dcmpstat/libsrc/dvpscu.cc @@ -1,6 +1,6 @@ /* * - * Copyright (C) 1998-2020, OFFIS e.V. + * Copyright (C) 1998-2024, OFFIS e.V. * All rights reserved. See COPYRIGHT file for details. * * This software and supporting documentation were developed by @@ -80,14 +80,14 @@ 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()); } diff --git a/dcmpstat/libsrc/dvpsdal.cc b/dcmpstat/libsrc/dvpsdal.cc index 519aa977..969c1829 100644 --- a/dcmpstat/libsrc/dvpsdal.cc +++ b/dcmpstat/libsrc/dvpsdal.cc @@ -1,6 +1,6 @@ /* * - * Copyright (C) 1999-2010, OFFIS e.V. + * Copyright (C) 1999-2024, OFFIS e.V. * All rights reserved. See COPYRIGHT file for details. * * This software and supporting documentation were developed by @@ -67,7 +67,7 @@ OFCondition DVPSDisplayedArea_PList::read(DcmItem &dset) DcmSequenceOfItems *dseq=NULL; DcmItem *ditem=NULL; - if (EC_Normal == dset.search(DCM_DisplayedAreaSelectionSequence, stack, ESM_fromHere, OFFalse)) + if (EC_Normal == dset.search(DCM_DisplayedAreaSelectionSequence, stack, ESM_fromHere, OFFalse) && (stack.top()->ident() == EVR_SQ)) { dseq=(DcmSequenceOfItems *)stack.top(); if (dseq) diff --git a/dcmpstat/libsrc/dvpsfs.cc b/dcmpstat/libsrc/dvpsfs.cc index 5a5173c1..ba311b25 100644 --- a/dcmpstat/libsrc/dvpsfs.cc +++ b/dcmpstat/libsrc/dvpsfs.cc @@ -1,6 +1,6 @@ /* * - * Copyright (C) 1998-2021, OFFIS e.V. + * Copyright (C) 1998-2024, OFFIS e.V. * All rights reserved. See COPYRIGHT file for details. * * This software and supporting documentation were developed by @@ -280,7 +280,7 @@ 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) diff --git a/dcmpstat/libsrc/dvpsgal.cc b/dcmpstat/libsrc/dvpsgal.cc index 909deac9..89d893de 100644 --- a/dcmpstat/libsrc/dvpsgal.cc +++ b/dcmpstat/libsrc/dvpsgal.cc @@ -1,6 +1,6 @@ /* * - * Copyright (C) 1998-2010, OFFIS e.V. + * Copyright (C) 1998-2024, OFFIS e.V. * All rights reserved. See COPYRIGHT file for details. * * This software and supporting documentation were developed by @@ -69,7 +69,7 @@ OFCondition DVPSGraphicAnnotation_PList::read(DcmItem &dset) DcmSequenceOfItems *dseq=NULL; DcmItem *ditem=NULL; - if (EC_Normal == dset.search(DCM_GraphicAnnotationSequence, stack, ESM_fromHere, OFFalse)) + if (EC_Normal == dset.search(DCM_GraphicAnnotationSequence, stack, ESM_fromHere, OFFalse) && (stack.top()->ident() == EVR_SQ)) { dseq=(DcmSequenceOfItems *)stack.top(); if (dseq) diff --git a/dcmpstat/libsrc/dvpsgll.cc b/dcmpstat/libsrc/dvpsgll.cc index d82d2086..fbf5d97d 100644 --- a/dcmpstat/libsrc/dvpsgll.cc +++ b/dcmpstat/libsrc/dvpsgll.cc @@ -1,6 +1,6 @@ /* * - * Copyright (C) 1998-2017, OFFIS e.V. + * Copyright (C) 1998-2024, OFFIS e.V. * All rights reserved. See COPYRIGHT file for details. * * This software and supporting documentation were developed by @@ -75,7 +75,7 @@ OFCondition DVPSGraphicLayer_PList::read(DcmItem &dset) DcmSequenceOfItems *dseq=NULL; DcmItem *ditem=NULL; - if (EC_Normal == dset.search(DCM_GraphicLayerSequence, stack, ESM_fromHere, OFFalse)) + if (EC_Normal == dset.search(DCM_GraphicLayerSequence, stack, ESM_fromHere, OFFalse) && (stack.top()->ident() == EVR_SQ)) { dseq=(DcmSequenceOfItems *)stack.top(); if (dseq) diff --git a/dcmpstat/libsrc/dvpsgrl.cc b/dcmpstat/libsrc/dvpsgrl.cc index 14d0e713..61dd6565 100644 --- a/dcmpstat/libsrc/dvpsgrl.cc +++ b/dcmpstat/libsrc/dvpsgrl.cc @@ -1,6 +1,6 @@ /* * - * Copyright (C) 1998-2010, OFFIS e.V. + * Copyright (C) 1998-2024, OFFIS e.V. * All rights reserved. See COPYRIGHT file for details. * * This software and supporting documentation were developed by @@ -66,7 +66,7 @@ OFCondition DVPSGraphicObject_PList::read(DcmItem &dset) DcmSequenceOfItems *dseq=NULL; DcmItem *ditem=NULL; - if (EC_Normal == dset.search(DCM_GraphicObjectSequence, stack, ESM_fromHere, OFFalse)) + if (EC_Normal == dset.search(DCM_GraphicObjectSequence, stack, ESM_fromHere, OFFalse) && (stack.top()->ident() == EVR_SQ)) { dseq=(DcmSequenceOfItems *)stack.top(); if (dseq) diff --git a/dcmpstat/libsrc/dvpshlp.cc b/dcmpstat/libsrc/dvpshlp.cc index dc0576d6..7691f078 100644 --- a/dcmpstat/libsrc/dvpshlp.cc +++ b/dcmpstat/libsrc/dvpshlp.cc @@ -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()); diff --git a/dcmpstat/libsrc/dvpsib.cc b/dcmpstat/libsrc/dvpsib.cc index 096c5b3e..57fee576 100644 --- a/dcmpstat/libsrc/dvpsib.cc +++ b/dcmpstat/libsrc/dvpsib.cc @@ -1,6 +1,6 @@ /* * - * Copyright (C) 1998-2018, OFFIS e.V. + * Copyright (C) 1998-2024, OFFIS e.V. * All rights reserved. See COPYRIGHT file for details. * * This software and supporting documentation were developed by @@ -153,7 +153,7 @@ 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) diff --git a/dcmpstat/libsrc/dvpsibl.cc b/dcmpstat/libsrc/dvpsibl.cc index e3768d5a..ef069eb8 100644 --- a/dcmpstat/libsrc/dvpsibl.cc +++ b/dcmpstat/libsrc/dvpsibl.cc @@ -1,6 +1,6 @@ /* * - * Copyright (C) 1999-2010, OFFIS e.V. + * Copyright (C) 1999-2024, OFFIS e.V. * All rights reserved. See COPYRIGHT file for details. * * This software and supporting documentation were developed by @@ -68,7 +68,7 @@ OFCondition DVPSImageBoxContent_PList::read(DcmItem &dset, DVPSPresentationLUT_P DcmSequenceOfItems *dseq=NULL; DcmItem *ditem=NULL; - if (EC_Normal == dset.search(DCM_RETIRED_ImageBoxContentSequence, stack, ESM_fromHere, OFFalse)) + if (EC_Normal == dset.search(DCM_RETIRED_ImageBoxContentSequence, stack, ESM_fromHere, OFFalse) && (stack.top()->ident() == EVR_SQ)) { dseq=(DcmSequenceOfItems *)stack.top(); if (dseq) diff --git a/dcmpstat/libsrc/dvpspll.cc b/dcmpstat/libsrc/dvpspll.cc index 1b2b7a35..46465171 100644 --- a/dcmpstat/libsrc/dvpspll.cc +++ b/dcmpstat/libsrc/dvpspll.cc @@ -1,6 +1,6 @@ /* * - * Copyright (C) 1999-2022, OFFIS e.V. + * Copyright (C) 1999-2024, OFFIS e.V. * All rights reserved. See COPYRIGHT file for details. * * This software and supporting documentation were developed by @@ -72,7 +72,7 @@ OFCondition DVPSPresentationLUT_PList::read(DcmItem &dset) DcmSequenceOfItems *dseq=NULL; DcmItem *ditem=NULL; - if (EC_Normal == dset.search(DCM_RETIRED_PresentationLUTContentSequence, stack, ESM_fromHere, OFFalse)) + if (EC_Normal == dset.search(DCM_RETIRED_PresentationLUTContentSequence, stack, ESM_fromHere, OFFalse) && (stack.top()->ident() == EVR_SQ)) { dseq=(DcmSequenceOfItems *)stack.top(); if (dseq) diff --git a/dcmpstat/libsrc/dvpsril.cc b/dcmpstat/libsrc/dvpsril.cc index 793e6906..9dee1f6b 100644 --- a/dcmpstat/libsrc/dvpsril.cc +++ b/dcmpstat/libsrc/dvpsril.cc @@ -1,6 +1,6 @@ /* * - * Copyright (C) 1998-2022, OFFIS e.V. + * Copyright (C) 1998-2024, OFFIS e.V. * All rights reserved. See COPYRIGHT file for details. * * This software and supporting documentation were developed by @@ -71,7 +71,7 @@ OFCondition DVPSReferencedImage_PList::read(DcmItem &dset) DcmSequenceOfItems *dseq=NULL; DcmItem *ditem=NULL; - if (EC_Normal == dset.search(DCM_ReferencedImageSequence, stack, ESM_fromHere, OFFalse)) + if (EC_Normal == dset.search(DCM_ReferencedImageSequence, stack, ESM_fromHere, OFFalse) && (stack.top()->ident() == EVR_SQ)) { dseq=(DcmSequenceOfItems *)stack.top(); if (dseq) diff --git a/dcmpstat/libsrc/dvpsrsl.cc b/dcmpstat/libsrc/dvpsrsl.cc index 4b0c83aa..d2f9dcff 100644 --- a/dcmpstat/libsrc/dvpsrsl.cc +++ b/dcmpstat/libsrc/dvpsrsl.cc @@ -1,6 +1,6 @@ /* * - * Copyright (C) 1998-2010, OFFIS e.V. + * Copyright (C) 1998-2024, OFFIS e.V. * All rights reserved. See COPYRIGHT file for details. * * This software and supporting documentation were developed by @@ -69,7 +69,7 @@ OFCondition DVPSReferencedSeries_PList::read(DcmItem &dset) DcmSequenceOfItems *dseq=NULL; DcmItem *ditem=NULL; - if (EC_Normal == dset.search(DCM_ReferencedSeriesSequence, stack, ESM_fromHere, OFFalse)) + if (EC_Normal == dset.search(DCM_ReferencedSeriesSequence, stack, ESM_fromHere, OFFalse) && (stack.top()->ident() == EVR_SQ)) { dseq=(DcmSequenceOfItems *)stack.top(); if (dseq) diff --git a/dcmpstat/libsrc/dvpssp.cc b/dcmpstat/libsrc/dvpssp.cc index 98b1201a..717c8146 100644 --- a/dcmpstat/libsrc/dvpssp.cc +++ b/dcmpstat/libsrc/dvpssp.cc @@ -1,6 +1,6 @@ /* * - * Copyright (C) 1998-2021, OFFIS e.V. + * Copyright (C) 1998-2024, OFFIS e.V. * All rights reserved. See COPYRIGHT file for details. * * This software and supporting documentation were developed by @@ -328,7 +328,7 @@ 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) diff --git a/dcmpstat/libsrc/dvpstxl.cc b/dcmpstat/libsrc/dvpstxl.cc index ffb6dcc1..8e35ff7a 100644 --- a/dcmpstat/libsrc/dvpstxl.cc +++ b/dcmpstat/libsrc/dvpstxl.cc @@ -1,6 +1,6 @@ /* * - * Copyright (C) 1998-2010, OFFIS e.V. + * Copyright (C) 1998-2024, OFFIS e.V. * All rights reserved. See COPYRIGHT file for details. * * This software and supporting documentation were developed by @@ -66,7 +66,7 @@ OFCondition DVPSTextObject_PList::read(DcmItem &dset) DcmSequenceOfItems *dseq=NULL; DcmItem *ditem=NULL; - if (EC_Normal == dset.search(DCM_TextObjectSequence, stack, ESM_fromHere, OFFalse)) + if (EC_Normal == dset.search(DCM_TextObjectSequence, stack, ESM_fromHere, OFFalse) && (stack.top()->ident() == EVR_SQ)) { dseq=(DcmSequenceOfItems *)stack.top(); if (dseq) diff --git a/dcmpstat/libsrc/dvpsvll.cc b/dcmpstat/libsrc/dvpsvll.cc index 3859f4ab..17a62770 100644 --- a/dcmpstat/libsrc/dvpsvll.cc +++ b/dcmpstat/libsrc/dvpsvll.cc @@ -1,6 +1,6 @@ /* * - * Copyright (C) 1998-2010, OFFIS e.V. + * Copyright (C) 1998-2024, OFFIS e.V. * All rights reserved. See COPYRIGHT file for details. * * This software and supporting documentation were developed by @@ -66,7 +66,7 @@ OFCondition DVPSVOILUT_PList::read(DcmItem &dset) DcmSequenceOfItems *dseq=NULL; DcmItem *ditem=NULL; - if (EC_Normal == dset.search(DCM_VOILUTSequence, stack, ESM_fromHere, OFFalse)) + if (EC_Normal == dset.search(DCM_VOILUTSequence, stack, ESM_fromHere, OFFalse) && (stack.top()->ident() == EVR_SQ)) { dseq=(DcmSequenceOfItems *)stack.top(); if (dseq) diff --git a/dcmrt/libsrc/drttypes.cc b/dcmrt/libsrc/drttypes.cc index 3aee4312..77ff1674 100644 --- a/dcmrt/libsrc/drttypes.cc +++ b/dcmrt/libsrc/drttypes.cc @@ -1,14 +1,12 @@ /* * - * Copyright (c) 2008-2021, OFFIS e.V. and ICSMED AG, Oldenburg, Germany - * Copyright (C) 2013-2021, J. Riesmeier, Oldenburg, Germany + * Copyright (c) 2008-2024, OFFIS e.V. and ICSMED AG, Oldenburg, Germany + * Copyright (C) 2013-2024, J. Riesmeier, Oldenburg, Germany * All rights reserved. See COPYRIGHT file for details. * * Source file for class DRTTypes * * Generated manually based on dsrtypes.cc - * File created on 2008-12-05 - * Last modified on 2016-02-12 by Riesmeier * */ @@ -212,7 +210,7 @@ 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) diff --git a/dcmsign/libsrc/dcsignat.cc b/dcmsign/libsrc/dcsignat.cc index b104ec1e..c5b57099 100644 --- a/dcmsign/libsrc/dcsignat.cc +++ b/dcmsign/libsrc/dcsignat.cc @@ -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()) diff --git a/dcmsign/libsrc/sicert.cc b/dcmsign/libsrc/sicert.cc index 683f4f1a..02824e94 100644 --- a/dcmsign/libsrc/sicert.cc +++ b/dcmsign/libsrc/sicert.cc @@ -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; diff --git a/dcmsr/libsrc/dsrtypes.cc b/dcmsr/libsrc/dsrtypes.cc index 08414ad9..a9d62185 100644 --- a/dcmsr/libsrc/dsrtypes.cc +++ b/dcmsr/libsrc/dsrtypes.cc @@ -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 */