Compare commits
No commits in common. 'i10ce' and 'i9ce' have entirely different histories.
@ -1 +1 @@
|
|||||||
a4b5bdd5130a15226755466e8c667cff91672b32 SOURCES/dcmtk-3.6.7.tar.gz
|
2e370b1d11ad840d34f151ea9fd51b7fd03fb5f2 SOURCES/dcmtk-3.6.6.tar.gz
|
||||||
|
@ -1 +1 @@
|
|||||||
SOURCES/dcmtk-3.6.7.tar.gz
|
SOURCES/dcmtk-3.6.6.tar.gz
|
||||||
|
@ -0,0 +1,116 @@
|
|||||||
|
From 3fa9f67fdaeee2f13efe93c93435a3e6462e9188 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Alessio <alciregi@fedoraproject.org>
|
||||||
|
Date: Thu, 2 Mar 2023 00:06:34 -0600
|
||||||
|
Subject: [PATCH 18/22] Fix for big-endian systems
|
||||||
|
|
||||||
|
---
|
||||||
|
dcmect/tests/t_roundtrip.cc | 15 +++++++++++----
|
||||||
|
dcmseg/tests/troundtrip.cc | 10 ++++++++--
|
||||||
|
2 files changed, 19 insertions(+), 6 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/dcmect/tests/t_roundtrip.cc b/dcmect/tests/t_roundtrip.cc
|
||||||
|
index 3cdeb907a..26839bdcc 100644
|
||||||
|
--- a/dcmect/tests/t_roundtrip.cc
|
||||||
|
+++ b/dcmect/tests/t_roundtrip.cc
|
||||||
|
@@ -28,6 +28,9 @@
|
||||||
|
|
||||||
|
#include "dcmtk/dcmect/enhanced_ct.h"
|
||||||
|
|
||||||
|
+#include "dcmtk/dcmdata/dcxfer.h"
|
||||||
|
+#include "dcmtk/dcmdata/dcswap.h"
|
||||||
|
+
|
||||||
|
#include "dcmtk/dcmfg/concatenationcreator.h"
|
||||||
|
#include "dcmtk/dcmfg/concatenationloader.h"
|
||||||
|
#include "dcmtk/dcmfg/fgctacquisitiondetails.h"
|
||||||
|
@@ -295,7 +298,6 @@ static void addSharedFGs(EctEnhancedCT* ct)
|
||||||
|
OFCHECK(exp_item->setCTDIVol(0.1).good());
|
||||||
|
CodeSequenceMacro* phantom_item = new CodeSequenceMacro("113682", "DCM", "ACR Accreditation Phantom - CT");
|
||||||
|
exp_item->getCTDIPhantomTypeCodeSequence().push_back(phantom_item);
|
||||||
|
- OFCHECK(exp_item->setEstimatedDoseSaving(0.2).good());
|
||||||
|
OFCHECK(exp_item->setExposureInMas(0.3).good());
|
||||||
|
OFCHECK(exp_item->setExposureModulationType("WEIRD").good());
|
||||||
|
OFCHECK(exp_item->setExposureTimeInMs(0.4).good());
|
||||||
|
@@ -619,6 +621,8 @@ static void checkConcatenationInstance(size_t numInstance, EctEnhancedCT* srcIns
|
||||||
|
// Check that all pixels are set to their original source instances frame number (starting from 1)
|
||||||
|
for (size_t pix = 0; pix < NUM_PIXELS_PER_FRAME; pix++)
|
||||||
|
{
|
||||||
|
+ // We need to swap the 16 bit value if the test runs on big endian platforms
|
||||||
|
+ swapIfNecessary(gLocalByteOrder, EBO_LittleEndian, &frame[pix], 2, sizeof(Uint16));
|
||||||
|
OFCHECK(frame[pix] == numInstance + 1);
|
||||||
|
}
|
||||||
|
delete concat;
|
||||||
|
@@ -658,7 +662,11 @@ static void prepareExpectedDump()
|
||||||
|
{
|
||||||
|
EXPECTED_DUMP += "\n";
|
||||||
|
EXPECTED_DUMP += "# Dicom-Data-Set\n";
|
||||||
|
- EXPECTED_DUMP += "# Used TransferSyntax: Little Endian Explicit\n";
|
||||||
|
+ // DcmDataset.print() produces dumps in local endianess, so make sure the dump reflects the current machine
|
||||||
|
+ if (gLocalByteOrder == EBO_LittleEndian)
|
||||||
|
+ EXPECTED_DUMP += "# Used TransferSyntax: Little Endian Explicit\n";
|
||||||
|
+ else
|
||||||
|
+ EXPECTED_DUMP += "# Used TransferSyntax: Big Endian Explicit\n";
|
||||||
|
EXPECTED_DUMP += "(0008,0008) CS [ORIGINAL\\PRIMARY\\VOLUME\\MAXIMUM] # 32, 4 ImageType\n";
|
||||||
|
EXPECTED_DUMP += "(0008,0016) UI =EnhancedCTImageStorage # 28, 1 SOPClassUID\n";
|
||||||
|
EXPECTED_DUMP
|
||||||
|
@@ -789,7 +797,7 @@ static void prepareExpectedDump()
|
||||||
|
EXPECTED_DUMP += " (fffe,e00d) na (ItemDelimitationItem for re-encoding) # 0, 0 ItemDelimitationItem\n";
|
||||||
|
EXPECTED_DUMP += " (fffe,e0dd) na (SequenceDelimitationItem for re-encod.) # 0, 0 SequenceDelimitationItem\n";
|
||||||
|
EXPECTED_DUMP += " (0018,9321) SQ (Sequence with explicit length #=1) # 0, 1 CTExposureSequence\n";
|
||||||
|
- EXPECTED_DUMP += " (fffe,e000) na (Item with explicit length #=10) # 0, 1 Item\n";
|
||||||
|
+ EXPECTED_DUMP += " (fffe,e000) na (Item with explicit length #=9) # 0, 1 Item\n";
|
||||||
|
EXPECTED_DUMP += " (0018,115e) DS [0.5] # 4, 1 "
|
||||||
|
"ImageAndFluoroscopyAreaDoseProduct\n";
|
||||||
|
EXPECTED_DUMP
|
||||||
|
@@ -807,7 +815,6 @@ static void prepareExpectedDump()
|
||||||
|
+= " (fffe,e0dd) na (SequenceDelimitationItem for re-encod.) # 0, 0 SequenceDelimitationItem\n";
|
||||||
|
EXPECTED_DUMP
|
||||||
|
+= " (0018,9323) CS [WEIRD] # 6, 1 ExposureModulationType\n";
|
||||||
|
- EXPECTED_DUMP += " (0018,9324) FD 0.2 # 8, 1 EstimatedDoseSaving\n";
|
||||||
|
EXPECTED_DUMP += " (0018,9328) FD 0.4 # 8, 1 ExposureTimeInms\n";
|
||||||
|
EXPECTED_DUMP += " (0018,9330) FD 0.7 # 8, 1 XRayTubeCurrentInmA\n";
|
||||||
|
EXPECTED_DUMP += " (0018,9332) FD 0.3 # 8, 1 ExposureInmAs\n";
|
||||||
|
diff --git a/dcmseg/tests/troundtrip.cc b/dcmseg/tests/troundtrip.cc
|
||||||
|
index 472eaf1ef..8a605ab68 100644
|
||||||
|
--- a/dcmseg/tests/troundtrip.cc
|
||||||
|
+++ b/dcmseg/tests/troundtrip.cc
|
||||||
|
@@ -31,6 +31,7 @@
|
||||||
|
#include "dcmtk/dcmfg/fgplanpo.h"
|
||||||
|
#include "dcmtk/dcmfg/fgseg.h"
|
||||||
|
#include "dcmtk/dcmiod/iodmacro.h"
|
||||||
|
+#include "dcmtk/dcmdata/dcxfer.h"
|
||||||
|
#include "dcmtk/ofstd/ofmem.h"
|
||||||
|
#include "dcmtk/ofstd/ofstrutl.h"
|
||||||
|
#include "dcmtk/ofstd/oftempf.h"
|
||||||
|
@@ -285,6 +286,7 @@ static void checkConcatenationInstance(size_t numInstance, DcmSegmentation* srcI
|
||||||
|
{
|
||||||
|
DcmSegmentation* concat = NULL;
|
||||||
|
OFCHECK(DcmSegmentation::loadDataset(*concatInstance, concat).good());
|
||||||
|
+ if (concat == NULL) return; // loadDataset() failed, we cannot continue
|
||||||
|
size_t numFrames;
|
||||||
|
numFrames = concat->getNumberOfFrames();
|
||||||
|
OFCHECK(numFrames == 1);
|
||||||
|
@@ -327,7 +329,7 @@ static void checkConcatenationInstance(size_t numInstance, DcmSegmentation* srcI
|
||||||
|
&& (cShared == concat->getFunctionalGroups().getShared()->end()));
|
||||||
|
DcmSequenceOfItems* cPerFrame = NULL;
|
||||||
|
OFCHECK(concatInstance->findAndGetSequence(DCM_PerFrameFunctionalGroupsSequence, cPerFrame).good());
|
||||||
|
- OFCHECK(cPerFrame->card() == 1);
|
||||||
|
+ OFCHECK(cPerFrame && (cPerFrame->card() == 1));
|
||||||
|
|
||||||
|
OFBool perFrame = OFFalse;
|
||||||
|
FGBase* fg = concat->getFunctionalGroups().get(0, DcmFGTypes::EFG_FRAMECONTENT, perFrame);
|
||||||
|
@@ -406,7 +408,11 @@ static void prepareExpectedDump()
|
||||||
|
{
|
||||||
|
EXPECTED_DUMP = "\n";
|
||||||
|
EXPECTED_DUMP += "# Dicom-Data-Set\n";
|
||||||
|
- EXPECTED_DUMP += "# Used TransferSyntax: Little Endian Explicit\n";
|
||||||
|
+ // DcmDataset.print() produces dumps in local endianess, so make sure the dump reflects the current machine
|
||||||
|
+ if (gLocalByteOrder == EBO_LittleEndian)
|
||||||
|
+ EXPECTED_DUMP += "# Used TransferSyntax: Little Endian Explicit\n";
|
||||||
|
+ else
|
||||||
|
+ EXPECTED_DUMP += "# Used TransferSyntax: Big Endian Explicit\n";
|
||||||
|
EXPECTED_DUMP += "(0008,0008) CS [DERIVED\\PRIMARY] # 16, 2 ImageType\n";
|
||||||
|
EXPECTED_DUMP += "(0008,0016) UI =SegmentationStorage # 28, 1 SOPClassUID\n";
|
||||||
|
EXPECTED_DUMP
|
||||||
|
--
|
||||||
|
2.39.2
|
||||||
|
|
@ -0,0 +1,568 @@
|
|||||||
|
From 2b026afd64f077b4f6276afc2fa9a885b8b47d38 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Michael Onken <onken@open-connections.de>
|
||||||
|
Date: Sat, 2 Oct 2021 00:29:56 +0200
|
||||||
|
Subject: [PATCH 19/22] [CVE-2021-41687, CVE-2021-41688, CVE-2021-41690] Fixed
|
||||||
|
poss. NULL pointer dereference/double free.
|
||||||
|
|
||||||
|
Thanks to Jinsheng Ba <bajinsheng@u.nus.edu> for the report and some patches.
|
||||||
|
|
||||||
|
(cherry picked from commit a9697dfeb672b0b9412c00c7d36d801e27ec85cb)
|
||||||
|
---
|
||||||
|
.../dcmtk/dcmnet}/dulstruc.h | 8 ++
|
||||||
|
dcmnet/include/dcmtk/dcmnet/helpers.h | 38 +++++++
|
||||||
|
dcmnet/libsrc/CMakeLists.txt | 2 +-
|
||||||
|
dcmnet/libsrc/Makefile.in | 2 +-
|
||||||
|
dcmnet/libsrc/assoc.cc | 23 +---
|
||||||
|
dcmnet/libsrc/dcuserid.cc | 4 +-
|
||||||
|
dcmnet/libsrc/dul.cc | 2 +-
|
||||||
|
dcmnet/libsrc/dulconst.cc | 2 +-
|
||||||
|
dcmnet/libsrc/dulextra.cc | 2 +-
|
||||||
|
dcmnet/libsrc/dulfsm.cc | 51 +--------
|
||||||
|
dcmnet/libsrc/dulparse.cc | 100 +++++++++++++-----
|
||||||
|
dcmnet/libsrc/dulpres.cc | 2 +-
|
||||||
|
dcmnet/libsrc/helpers.cc | 71 +++++++++++++
|
||||||
|
13 files changed, 201 insertions(+), 106 deletions(-)
|
||||||
|
rename dcmnet/{libsrc => include/dcmtk/dcmnet}/dulstruc.h (98%)
|
||||||
|
create mode 100644 dcmnet/include/dcmtk/dcmnet/helpers.h
|
||||||
|
create mode 100644 dcmnet/libsrc/helpers.cc
|
||||||
|
|
||||||
|
diff --git a/dcmnet/libsrc/dulstruc.h b/dcmnet/include/dcmtk/dcmnet/dulstruc.h
|
||||||
|
similarity index 98%
|
||||||
|
rename from dcmnet/libsrc/dulstruc.h
|
||||||
|
rename to dcmnet/include/dcmtk/dcmnet/dulstruc.h
|
||||||
|
index 22da6ece1..6ac9a8f5d 100644
|
||||||
|
--- a/dcmnet/libsrc/dulstruc.h
|
||||||
|
+++ b/dcmnet/include/dcmtk/dcmnet/dulstruc.h
|
||||||
|
@@ -71,6 +71,11 @@
|
||||||
|
#include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */
|
||||||
|
#include "dcmtk/dcmnet/extneg.h"
|
||||||
|
#include "dcmtk/dcmnet/dcuserid.h"
|
||||||
|
+#include "dcmtk/dcmnet/dicom.h"
|
||||||
|
+#include "dcmtk/dcmnet/dntypes.h"
|
||||||
|
+#include "dcmtk/dcmnet/dul.h"
|
||||||
|
+#include "dcmtk/dcmnet/lst.h"
|
||||||
|
+
|
||||||
|
|
||||||
|
class DcmTransportConnection;
|
||||||
|
class DcmTransportLayer;
|
||||||
|
@@ -290,6 +295,9 @@ typedef struct dul_datapdu {
|
||||||
|
DUL_PRESENTATIONDATAVALUE presentationDataValue;
|
||||||
|
} DUL_DATAPDU;
|
||||||
|
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+
|
||||||
|
#define DUL_PROTOCOL (unsigned short) 0x01
|
||||||
|
|
||||||
|
#define DUL_TYPEAPPLICATIONCONTEXT (unsigned char)0x10
|
||||||
|
diff --git a/dcmnet/include/dcmtk/dcmnet/helpers.h b/dcmnet/include/dcmtk/dcmnet/helpers.h
|
||||||
|
new file mode 100644
|
||||||
|
index 000000000..7d7e382be
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/dcmnet/include/dcmtk/dcmnet/helpers.h
|
||||||
|
@@ -0,0 +1,38 @@
|
||||||
|
+/*
|
||||||
|
+ *
|
||||||
|
+ * Copyright (C) 2021, OFFIS e.V.
|
||||||
|
+ * All rights reserved. See COPYRIGHT file for details.
|
||||||
|
+ *
|
||||||
|
+ * This software and supporting documentation were partly developed by
|
||||||
|
+ *
|
||||||
|
+ * OFFIS e.V.
|
||||||
|
+ * R&D Division Health
|
||||||
|
+ * Escherweg 2
|
||||||
|
+ * D-26121 Oldenburg, Germany
|
||||||
|
+ *
|
||||||
|
+ *
|
||||||
|
+ * Module: dcmnet
|
||||||
|
+ *
|
||||||
|
+ * Author: Michael Onken
|
||||||
|
+ *
|
||||||
|
+ * Purpose: Collection of helper functions
|
||||||
|
+ *
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+#ifndef DCMHET_HELPERS_H
|
||||||
|
+#define DCMHET_HELPERS_H
|
||||||
|
+
|
||||||
|
+#include "dcmtk/ofstd/ofcond.h"
|
||||||
|
+#include "dcmtk/dcmnet/dulstruc.h"
|
||||||
|
+
|
||||||
|
+struct T_ASC_Parameters;
|
||||||
|
+class LST_HEAD;
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+void
|
||||||
|
+destroyPresentationContextList(LST_HEAD ** l);
|
||||||
|
+
|
||||||
|
+void
|
||||||
|
+destroyUserInformationLists(DUL_USERINFO * userInfo);
|
||||||
|
+
|
||||||
|
+#endif
|
||||||
|
diff --git a/dcmnet/libsrc/CMakeLists.txt b/dcmnet/libsrc/CMakeLists.txt
|
||||||
|
index ed902ddc1..ee39d0f14 100644
|
||||||
|
--- a/dcmnet/libsrc/CMakeLists.txt
|
||||||
|
+++ b/dcmnet/libsrc/CMakeLists.txt
|
||||||
|
@@ -1,5 +1,5 @@
|
||||||
|
# create library from source files
|
||||||
|
-DCMTK_ADD_LIBRARY(dcmnet assoc cond dcasccff dcasccfg dccfenmp dccfpcmp dccfprmp dccfrsmp dccftsmp dccfuidh dcmlayer dcmtrans dcompat dimcancl dimcmd dimdump dimecho dimfind dimget dimmove dimse dimstore diutil dul dulconst dulextra dulfsm dulparse dulpres extneg lst dfindscu dstorscp dstorscu dcuserid scu scp scpthrd scpcfg scppool dwrap)
|
||||||
|
+DCMTK_ADD_LIBRARY(dcmnet assoc cond dcasccff dcasccfg dccfenmp dccfpcmp dccfprmp dccfrsmp dccftsmp dccfuidh dcmlayer dcmtrans dcompat dimcancl dimcmd dimdump dimecho dimfind dimget dimmove dimse dimstore diutil dul dulconst dulextra dulfsm dulparse dulpres extneg helpers lst dfindscu dstorscp dstorscu dcuserid scu scp scpthrd scpcfg scppool dwrap)
|
||||||
|
|
||||||
|
DCMTK_TARGET_LINK_MODULES(dcmnet ofstd oflog dcmdata)
|
||||||
|
DCMTK_TARGET_LINK_LIBRARIES(dcmnet ${WRAP_LIBS})
|
||||||
|
diff --git a/dcmnet/libsrc/Makefile.in b/dcmnet/libsrc/Makefile.in
|
||||||
|
index 66d8c527b..d767bea35 100644
|
||||||
|
--- a/dcmnet/libsrc/Makefile.in
|
||||||
|
+++ b/dcmnet/libsrc/Makefile.in
|
||||||
|
@@ -25,7 +25,7 @@ objs = assoc.o cond.o dcompat.o dimcancl.o dimcmd.o dimdump.o dimecho.o \
|
||||||
|
dulfsm.o dulparse.o dulpres.o dul.o lst.o extneg.o dimget.o dcmlayer.o \
|
||||||
|
dcmtrans.o dcasccfg.o dcasccff.o dccfuidh.o dccftsmp.o dccfpcmp.o \
|
||||||
|
dccfrsmp.o dccfenmp.o dccfprmp.o dfindscu.o dstorscp.o dstorscu.o \
|
||||||
|
- dcuserid.o scu.o scp.o scpcfg.o scpthrd.o scppool.o dwrap.o
|
||||||
|
+ dcuserid.o helper.o scu.o scp.o scpcfg.o scpthrd.o scppool.o dwrap.o
|
||||||
|
|
||||||
|
library = libdcmnet.$(LIBEXT)
|
||||||
|
|
||||||
|
diff --git a/dcmnet/libsrc/assoc.cc b/dcmnet/libsrc/assoc.cc
|
||||||
|
index 6dbe4ef4d..a97f10699 100644
|
||||||
|
--- a/dcmnet/libsrc/assoc.cc
|
||||||
|
+++ b/dcmnet/libsrc/assoc.cc
|
||||||
|
@@ -125,6 +125,7 @@
|
||||||
|
#include "dcmtk/ofstd/ofconsol.h"
|
||||||
|
#include "dcmtk/ofstd/ofstd.h"
|
||||||
|
#include "dcmtk/dcmnet/dcmtrans.h"
|
||||||
|
+#include "dcmtk/dcmnet/helpers.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Constant Definitions
|
||||||
|
@@ -343,25 +344,6 @@ ASC_createAssociationParameters(T_ASC_Parameters ** params,
|
||||||
|
return EC_Normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
-static void
|
||||||
|
-destroyPresentationContextList(LST_HEAD ** lst)
|
||||||
|
-{
|
||||||
|
- DUL_PRESENTATIONCONTEXT *pc;
|
||||||
|
- DUL_TRANSFERSYNTAX *ts;
|
||||||
|
-
|
||||||
|
- if ((lst == NULL) || (*lst == NULL))
|
||||||
|
- return;
|
||||||
|
- while ((pc = (DUL_PRESENTATIONCONTEXT*) LST_Dequeue(lst)) != NULL) {
|
||||||
|
- if (pc->proposedTransferSyntax != NULL) {
|
||||||
|
- while ((ts = (DUL_TRANSFERSYNTAX*) LST_Dequeue(&pc->proposedTransferSyntax)) != NULL) {
|
||||||
|
- free(ts);
|
||||||
|
- }
|
||||||
|
- LST_Destroy(&pc->proposedTransferSyntax);
|
||||||
|
- }
|
||||||
|
- free(pc);
|
||||||
|
- }
|
||||||
|
- LST_Destroy(lst);
|
||||||
|
-}
|
||||||
|
|
||||||
|
OFCondition
|
||||||
|
ASC_destroyAssociationParameters(T_ASC_Parameters ** params)
|
||||||
|
@@ -1706,8 +1688,7 @@ ASC_destroyAssociation(T_ASC_Association ** association)
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((*association)->params != NULL) {
|
||||||
|
- cond = ASC_destroyAssociationParameters(&(*association)->params);
|
||||||
|
- if (cond.bad()) return cond;
|
||||||
|
+ ASC_destroyAssociationParameters(&(*association)->params);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((*association)->sendPDVBuffer != NULL)
|
||||||
|
diff --git a/dcmnet/libsrc/dcuserid.cc b/dcmnet/libsrc/dcuserid.cc
|
||||||
|
index 6a2d72a20..f1530fe79 100644
|
||||||
|
--- a/dcmnet/libsrc/dcuserid.cc
|
||||||
|
+++ b/dcmnet/libsrc/dcuserid.cc
|
||||||
|
@@ -1,6 +1,6 @@
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
- * Copyright (C) 1997-2018, OFFIS e.V.
|
||||||
|
+ * Copyright (C) 1997-2021, OFFIS e.V.
|
||||||
|
* All rights reserved. See COPYRIGHT file for details.
|
||||||
|
*
|
||||||
|
* This software and supporting documentation were developed by
|
||||||
|
@@ -23,7 +23,7 @@
|
||||||
|
#include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */
|
||||||
|
#include "dcmtk/dcmnet/dcuserid.h"
|
||||||
|
#include "dcmtk/dcmnet/dul.h"
|
||||||
|
-#include "dulstruc.h"
|
||||||
|
+#include "dcmtk/dcmnet/dulstruc.h"
|
||||||
|
|
||||||
|
/* ************************************************************************* */
|
||||||
|
/* Implementation of class UserIdentityNegotiationSubItem */
|
||||||
|
diff --git a/dcmnet/libsrc/dul.cc b/dcmnet/libsrc/dul.cc
|
||||||
|
index b8e9cc044..38a8d730e 100644
|
||||||
|
--- a/dcmnet/libsrc/dul.cc
|
||||||
|
+++ b/dcmnet/libsrc/dul.cc
|
||||||
|
@@ -142,7 +142,7 @@ END_EXTERN_C
|
||||||
|
#include "dcmtk/ofstd/ofstd.h"
|
||||||
|
|
||||||
|
#include "dcmtk/dcmnet/dul.h"
|
||||||
|
-#include "dulstruc.h"
|
||||||
|
+#include "dcmtk/dcmnet/dulstruc.h"
|
||||||
|
#include "dulpriv.h"
|
||||||
|
#include "dulfsm.h"
|
||||||
|
#include "dcmtk/dcmnet/dcmtrans.h"
|
||||||
|
diff --git a/dcmnet/libsrc/dulconst.cc b/dcmnet/libsrc/dulconst.cc
|
||||||
|
index c0643c2bc..13738e8ea 100644
|
||||||
|
--- a/dcmnet/libsrc/dulconst.cc
|
||||||
|
+++ b/dcmnet/libsrc/dulconst.cc
|
||||||
|
@@ -77,7 +77,7 @@
|
||||||
|
#include "dcmtk/dcmnet/diutil.h"
|
||||||
|
#include "dcmtk/dcmnet/lst.h"
|
||||||
|
#include "dcmtk/dcmnet/dul.h"
|
||||||
|
-#include "dulstruc.h"
|
||||||
|
+#include "dcmtk/dcmnet/dulstruc.h"
|
||||||
|
#include "dulpriv.h"
|
||||||
|
#include "dcmtk/ofstd/ofconsol.h"
|
||||||
|
|
||||||
|
diff --git a/dcmnet/libsrc/dulextra.cc b/dcmnet/libsrc/dulextra.cc
|
||||||
|
index 9845f3e4c..bec14fc2b 100644
|
||||||
|
--- a/dcmnet/libsrc/dulextra.cc
|
||||||
|
+++ b/dcmnet/libsrc/dulextra.cc
|
||||||
|
@@ -102,7 +102,7 @@
|
||||||
|
#include "dcmtk/dcmnet/lst.h"
|
||||||
|
#include "dcmtk/dcmnet/cond.h"
|
||||||
|
#include "dcmtk/dcmnet/dul.h"
|
||||||
|
-#include "dulstruc.h"
|
||||||
|
+#include "dcmtk/dcmnet/dulstruc.h"
|
||||||
|
#include "dulpriv.h"
|
||||||
|
#include "dcmtk/dcmnet/dcmtrans.h"
|
||||||
|
#include "dcmtk/dcmnet/diutil.h"
|
||||||
|
diff --git a/dcmnet/libsrc/dulfsm.cc b/dcmnet/libsrc/dulfsm.cc
|
||||||
|
index 91dcc7fcb..9bbe3462a 100644
|
||||||
|
--- a/dcmnet/libsrc/dulfsm.cc
|
||||||
|
+++ b/dcmnet/libsrc/dulfsm.cc
|
||||||
|
@@ -113,7 +113,7 @@ END_EXTERN_C
|
||||||
|
#include "dcmtk/dcmnet/lst.h"
|
||||||
|
#include "dcmtk/dcmnet/cond.h"
|
||||||
|
#include "dcmtk/dcmnet/dul.h"
|
||||||
|
-#include "dulstruc.h"
|
||||||
|
+#include "dcmtk/dcmnet/dulstruc.h"
|
||||||
|
#include "dulpriv.h"
|
||||||
|
#include "dulfsm.h"
|
||||||
|
#include "dcmtk/ofstd/ofbmanip.h"
|
||||||
|
@@ -122,6 +122,7 @@ END_EXTERN_C
|
||||||
|
#include "dcmtk/dcmnet/dcmtrans.h"
|
||||||
|
#include "dcmtk/dcmnet/dcmlayer.h"
|
||||||
|
#include "dcmtk/dcmnet/diutil.h"
|
||||||
|
+#include "dcmtk/dcmnet/helpers.h"
|
||||||
|
#include "dcmtk/ofstd/ofsockad.h" /* for class OFSockAddr */
|
||||||
|
|
||||||
|
/* At least Solaris doesn't define this */
|
||||||
|
@@ -310,9 +311,6 @@ findPresentationCtx(LST_HEAD ** lst, DUL_PRESENTATIONCONTEXTID contextID);
|
||||||
|
PRV_SCUSCPROLE *
|
||||||
|
findSCUSCPRole(LST_HEAD ** lst, char *abstractSyntax);
|
||||||
|
|
||||||
|
-void destroyPresentationContextList(LST_HEAD ** l);
|
||||||
|
-void destroyUserInformationLists(DUL_USERINFO * userInfo);
|
||||||
|
-
|
||||||
|
static volatile FSM_Event_Description Event_Table[] = {
|
||||||
|
{A_ASSOCIATE_REQ_LOCAL_USER, "A-ASSOCIATE request (local user)"},
|
||||||
|
{TRANS_CONN_CONFIRM_LOCAL_USER, "Transport conn confirmation (local)"},
|
||||||
|
@@ -3988,48 +3986,3 @@ findSCUSCPRole(LST_HEAD ** lst, char *abstractSyntax)
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
-
|
||||||
|
-void
|
||||||
|
-destroyPresentationContextList(LST_HEAD ** l)
|
||||||
|
-{
|
||||||
|
- PRV_PRESENTATIONCONTEXTITEM
|
||||||
|
- * prvCtx;
|
||||||
|
- DUL_SUBITEM
|
||||||
|
- * subItem;
|
||||||
|
-
|
||||||
|
- if (*l == NULL)
|
||||||
|
- return;
|
||||||
|
-
|
||||||
|
- prvCtx = (PRV_PRESENTATIONCONTEXTITEM*)LST_Dequeue(l);
|
||||||
|
- while (prvCtx != NULL) {
|
||||||
|
- subItem = (DUL_SUBITEM*)LST_Dequeue(&prvCtx->transferSyntaxList);
|
||||||
|
- while (subItem != NULL) {
|
||||||
|
- free(subItem);
|
||||||
|
- subItem = (DUL_SUBITEM*)LST_Dequeue(&prvCtx->transferSyntaxList);
|
||||||
|
- }
|
||||||
|
- LST_Destroy(&prvCtx->transferSyntaxList);
|
||||||
|
- free(prvCtx);
|
||||||
|
- prvCtx = (PRV_PRESENTATIONCONTEXTITEM*)LST_Dequeue(l);
|
||||||
|
- }
|
||||||
|
- LST_Destroy(l);
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
-void
|
||||||
|
-destroyUserInformationLists(DUL_USERINFO * userInfo)
|
||||||
|
-{
|
||||||
|
- PRV_SCUSCPROLE
|
||||||
|
- * role;
|
||||||
|
-
|
||||||
|
- role = (PRV_SCUSCPROLE*)LST_Dequeue(&userInfo->SCUSCPRoleList);
|
||||||
|
- while (role != NULL) {
|
||||||
|
- free(role);
|
||||||
|
- role = (PRV_SCUSCPROLE*)LST_Dequeue(&userInfo->SCUSCPRoleList);
|
||||||
|
- }
|
||||||
|
- LST_Destroy(&userInfo->SCUSCPRoleList);
|
||||||
|
-
|
||||||
|
- /* extended negotiation */
|
||||||
|
- delete userInfo->extNegList; userInfo->extNegList = NULL;
|
||||||
|
-
|
||||||
|
- /* user identity negotiation */
|
||||||
|
- delete userInfo->usrIdent; userInfo->usrIdent = NULL;
|
||||||
|
-}
|
||||||
|
diff --git a/dcmnet/libsrc/dulparse.cc b/dcmnet/libsrc/dulparse.cc
|
||||||
|
index 0a84f3850..decd60dc5 100644
|
||||||
|
--- a/dcmnet/libsrc/dulparse.cc
|
||||||
|
+++ b/dcmnet/libsrc/dulparse.cc
|
||||||
|
@@ -75,7 +75,8 @@
|
||||||
|
#include "dcmtk/dcmnet/lst.h"
|
||||||
|
#include "dcmtk/dcmnet/dul.h"
|
||||||
|
#include "dcmtk/dcmnet/diutil.h"
|
||||||
|
-#include "dulstruc.h"
|
||||||
|
+#include "dcmtk/dcmnet/dulstruc.h"
|
||||||
|
+#include "dcmtk/dcmnet/helpers.h"
|
||||||
|
#include "dulpriv.h"
|
||||||
|
#include "dcmtk/ofstd/ofconsol.h"
|
||||||
|
|
||||||
|
@@ -147,9 +148,6 @@ parseAssociate(unsigned char *buf, unsigned long pduLength,
|
||||||
|
* context;
|
||||||
|
|
||||||
|
(void) memset(assoc, 0, sizeof(*assoc));
|
||||||
|
- if ((assoc->presentationContextList = LST_Create()) == NULL) return EC_MemoryExhausted;
|
||||||
|
- if ((assoc->userInfo.SCUSCPRoleList = LST_Create()) == NULL) return EC_MemoryExhausted;
|
||||||
|
-
|
||||||
|
// Check if the PDU actually is long enough for the fields we read
|
||||||
|
if (pduLength < 2 + 2 + 16 + 16 + 32)
|
||||||
|
return makeLengthError("associate PDU", pduLength, 2 + 2 + 16 + 16 + 32);
|
||||||
|
@@ -210,6 +208,8 @@ parseAssociate(unsigned char *buf, unsigned long pduLength,
|
||||||
|
<< "Called AP Title: " << assoc->calledAPTitle << OFendl
|
||||||
|
<< "Calling AP Title: " << assoc->callingAPTitle);
|
||||||
|
}
|
||||||
|
+ if ((assoc->presentationContextList = LST_Create()) == NULL) return EC_MemoryExhausted;
|
||||||
|
+ if ((assoc->userInfo.SCUSCPRoleList = LST_Create()) == NULL) return EC_MemoryExhausted;
|
||||||
|
while ((cond.good()) && (pduLength > 0))
|
||||||
|
{
|
||||||
|
type = *buf;
|
||||||
|
@@ -224,44 +224,80 @@ parseAssociate(unsigned char *buf, unsigned long pduLength,
|
||||||
|
{
|
||||||
|
buf += itemLength;
|
||||||
|
if (!OFStandard::safeSubtract(pduLength, itemLength, pduLength))
|
||||||
|
- return makeUnderflowError("Application Context item", pduLength, itemLength);
|
||||||
|
- DCMNET_TRACE("Successfully parsed Application Context");
|
||||||
|
+ {
|
||||||
|
+ cond = makeUnderflowError("Application Context item", pduLength, itemLength);
|
||||||
|
+ }
|
||||||
|
+ else
|
||||||
|
+ {
|
||||||
|
+ DCMNET_TRACE("Successfully parsed Application Context");
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case DUL_TYPEPRESENTATIONCONTEXTRQ:
|
||||||
|
case DUL_TYPEPRESENTATIONCONTEXTAC:
|
||||||
|
context = (PRV_PRESENTATIONCONTEXTITEM*)malloc(sizeof(PRV_PRESENTATIONCONTEXTITEM));
|
||||||
|
- if (context == NULL) return EC_MemoryExhausted;
|
||||||
|
- (void) memset(context, 0, sizeof(*context));
|
||||||
|
- cond = parsePresentationContext(type, context, buf, &itemLength, pduLength);
|
||||||
|
- if (cond.bad()) return cond;
|
||||||
|
- buf += itemLength;
|
||||||
|
- if (!OFStandard::safeSubtract(pduLength, itemLength, pduLength))
|
||||||
|
- return makeUnderflowError("Presentation Context item", pduLength, itemLength);
|
||||||
|
- LST_Enqueue(&assoc->presentationContextList, (LST_NODE*)context);
|
||||||
|
- DCMNET_TRACE("Successfully parsed Presentation Context");
|
||||||
|
+ if (context != NULL)
|
||||||
|
+ {
|
||||||
|
+ (void) memset(context, 0, sizeof(*context));
|
||||||
|
+ cond = parsePresentationContext(type, context, buf, &itemLength, pduLength);
|
||||||
|
+ if (cond.bad())
|
||||||
|
+ {
|
||||||
|
+ free(context);
|
||||||
|
+ }
|
||||||
|
+ else
|
||||||
|
+ {
|
||||||
|
+ buf += itemLength;
|
||||||
|
+ if (!OFStandard::safeSubtract(pduLength, itemLength, pduLength))
|
||||||
|
+ {
|
||||||
|
+ cond = makeUnderflowError("Presentation Context item", pduLength, itemLength);
|
||||||
|
+ }
|
||||||
|
+ else
|
||||||
|
+ {
|
||||||
|
+ LST_Enqueue(&assoc->presentationContextList, (LST_NODE*)context);
|
||||||
|
+ DCMNET_TRACE("Successfully parsed Presentation Context");
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ else
|
||||||
|
+ {
|
||||||
|
+ cond = EC_MemoryExhausted;
|
||||||
|
+ }
|
||||||
|
break;
|
||||||
|
case DUL_TYPEUSERINFO:
|
||||||
|
// parse user info, which can contain several sub-items like User
|
||||||
|
// Identity Negotiation or SOP Class Extended Negotiation
|
||||||
|
cond = parseUserInfo(&assoc->userInfo, buf, &itemLength, assoc->type, pduLength);
|
||||||
|
- if (cond.bad())
|
||||||
|
- return cond;
|
||||||
|
- buf += itemLength;
|
||||||
|
- if (!OFStandard::safeSubtract(pduLength, itemLength, pduLength))
|
||||||
|
- return makeUnderflowError("User Information item", pduLength, itemLength);
|
||||||
|
- DCMNET_TRACE("Successfully parsed User Information");
|
||||||
|
+ if (cond.good())
|
||||||
|
+ {
|
||||||
|
+ buf += itemLength;
|
||||||
|
+ if (!OFStandard::safeSubtract(pduLength, itemLength, pduLength))
|
||||||
|
+ {
|
||||||
|
+ cond = makeUnderflowError("User Information item", pduLength, itemLength);
|
||||||
|
+ }
|
||||||
|
+ else
|
||||||
|
+ {
|
||||||
|
+ DCMNET_TRACE("Successfully parsed User Information");
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
cond = parseDummy(buf, &itemLength, pduLength);
|
||||||
|
- if (cond.bad())
|
||||||
|
- return cond;
|
||||||
|
- buf += itemLength;
|
||||||
|
- if (!OFStandard::safeSubtract(pduLength, itemLength, pduLength))
|
||||||
|
- return makeUnderflowError("unknown item type", pduLength, itemLength);
|
||||||
|
+ if (cond.good())
|
||||||
|
+ {
|
||||||
|
+ buf += itemLength;
|
||||||
|
+ if (!OFStandard::safeSubtract(pduLength, itemLength, pduLength))
|
||||||
|
+ {
|
||||||
|
+ cond = makeUnderflowError("unknown item type", pduLength, itemLength);
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
+ if (cond.bad())
|
||||||
|
+ {
|
||||||
|
+ destroyPresentationContextList(&assoc->presentationContextList);
|
||||||
|
+ destroyUserInformationLists(&assoc->userInfo);
|
||||||
|
+ }
|
||||||
|
return cond;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -409,7 +445,11 @@ parsePresentationContext(unsigned char type,
|
||||||
|
subItem = (DUL_SUBITEM*)malloc(sizeof(DUL_SUBITEM));
|
||||||
|
if (subItem == NULL) return EC_MemoryExhausted;
|
||||||
|
cond = parseSubItem(subItem, buf, &length, presentationLength);
|
||||||
|
- if (cond.bad()) return cond;
|
||||||
|
+ if (cond.bad())
|
||||||
|
+ {
|
||||||
|
+ free(subItem);
|
||||||
|
+ return cond;
|
||||||
|
+ }
|
||||||
|
LST_Enqueue(&context->transferSyntaxList, (LST_NODE*)subItem);
|
||||||
|
buf += length;
|
||||||
|
if (!OFStandard::safeSubtract(presentationLength, length, presentationLength))
|
||||||
|
@@ -530,7 +570,11 @@ parseUserInfo(DUL_USERINFO * userInfo,
|
||||||
|
role = (PRV_SCUSCPROLE*)malloc(sizeof(PRV_SCUSCPROLE));
|
||||||
|
if (role == NULL) return EC_MemoryExhausted;
|
||||||
|
cond = parseSCUSCPRole(role, buf, &length, userLength);
|
||||||
|
- if (cond.bad()) return cond;
|
||||||
|
+ if (cond.bad())
|
||||||
|
+ {
|
||||||
|
+ free(role);
|
||||||
|
+ return cond;
|
||||||
|
+ }
|
||||||
|
LST_Enqueue(&userInfo->SCUSCPRoleList, (LST_NODE*)role);
|
||||||
|
buf += length;
|
||||||
|
if (!OFStandard::safeSubtract(userLength, OFstatic_cast(short unsigned int, length), userLength))
|
||||||
|
diff --git a/dcmnet/libsrc/dulpres.cc b/dcmnet/libsrc/dulpres.cc
|
||||||
|
index a0b8d618c..77be86c24 100644
|
||||||
|
--- a/dcmnet/libsrc/dulpres.cc
|
||||||
|
+++ b/dcmnet/libsrc/dulpres.cc
|
||||||
|
@@ -74,7 +74,7 @@
|
||||||
|
#include "dcmtk/dcmnet/cond.h"
|
||||||
|
#include "dcmtk/dcmnet/lst.h"
|
||||||
|
#include "dcmtk/dcmnet/dul.h"
|
||||||
|
-#include "dulstruc.h"
|
||||||
|
+#include "dcmtk/dcmnet/dulstruc.h"
|
||||||
|
#include "dulpriv.h"
|
||||||
|
#include "dulfsm.h"
|
||||||
|
|
||||||
|
diff --git a/dcmnet/libsrc/helpers.cc b/dcmnet/libsrc/helpers.cc
|
||||||
|
new file mode 100644
|
||||||
|
index 000000000..9cd20cefc
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/dcmnet/libsrc/helpers.cc
|
||||||
|
@@ -0,0 +1,71 @@
|
||||||
|
+/*
|
||||||
|
+ *
|
||||||
|
+ * Copyright (C) 2021, OFFIS e.V.
|
||||||
|
+ * All rights reserved. See COPYRIGHT file for details.
|
||||||
|
+ *
|
||||||
|
+ * This software and supporting documentation were partly developed by
|
||||||
|
+ *
|
||||||
|
+ * OFFIS e.V.
|
||||||
|
+ * R&D Division Health
|
||||||
|
+ * Escherweg 2
|
||||||
|
+ * D-26121 Oldenburg, Germany
|
||||||
|
+ *
|
||||||
|
+ *
|
||||||
|
+ * Module: dcmnet
|
||||||
|
+ *
|
||||||
|
+ * Author: Michael Onken
|
||||||
|
+ *
|
||||||
|
+ * Purpose: Collection of helper functions
|
||||||
|
+ *
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+#include "dcmtk/dcmnet/helpers.h"
|
||||||
|
+#include "dcmtk/dcmnet/lst.h"
|
||||||
|
+#include "dcmtk/dcmnet/assoc.h"
|
||||||
|
+#include "dcmtk/dcmnet/dulstruc.h"
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+void
|
||||||
|
+destroyPresentationContextList(LST_HEAD ** l)
|
||||||
|
+{
|
||||||
|
+ PRV_PRESENTATIONCONTEXTITEM
|
||||||
|
+ * prvCtx;
|
||||||
|
+ DUL_SUBITEM
|
||||||
|
+ * subItem;
|
||||||
|
+
|
||||||
|
+ if (*l == NULL)
|
||||||
|
+ return;
|
||||||
|
+
|
||||||
|
+ prvCtx = (PRV_PRESENTATIONCONTEXTITEM*)LST_Dequeue(l);
|
||||||
|
+ while (prvCtx != NULL) {
|
||||||
|
+ subItem = (DUL_SUBITEM*)LST_Dequeue(&prvCtx->transferSyntaxList);
|
||||||
|
+ while (subItem != NULL) {
|
||||||
|
+ free(subItem);
|
||||||
|
+ subItem = (DUL_SUBITEM*)LST_Dequeue(&prvCtx->transferSyntaxList);
|
||||||
|
+ }
|
||||||
|
+ LST_Destroy(&prvCtx->transferSyntaxList);
|
||||||
|
+ free(prvCtx);
|
||||||
|
+ prvCtx = (PRV_PRESENTATIONCONTEXTITEM*)LST_Dequeue(l);
|
||||||
|
+ }
|
||||||
|
+ LST_Destroy(l);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+void
|
||||||
|
+destroyUserInformationLists(DUL_USERINFO * userInfo)
|
||||||
|
+{
|
||||||
|
+ PRV_SCUSCPROLE
|
||||||
|
+ * role;
|
||||||
|
+
|
||||||
|
+ role = (PRV_SCUSCPROLE*)LST_Dequeue(&userInfo->SCUSCPRoleList);
|
||||||
|
+ while (role != NULL) {
|
||||||
|
+ free(role);
|
||||||
|
+ role = (PRV_SCUSCPROLE*)LST_Dequeue(&userInfo->SCUSCPRoleList);
|
||||||
|
+ }
|
||||||
|
+ LST_Destroy(&userInfo->SCUSCPRoleList);
|
||||||
|
+
|
||||||
|
+ /* extended negotiation */
|
||||||
|
+ delete userInfo->extNegList; userInfo->extNegList = NULL;
|
||||||
|
+
|
||||||
|
+ /* user identity negotiation */
|
||||||
|
+ delete userInfo->usrIdent; userInfo->usrIdent = NULL;
|
||||||
|
+}
|
||||||
|
--
|
||||||
|
2.39.2
|
||||||
|
|
@ -0,0 +1,30 @@
|
|||||||
|
From 0e507235266dab0f9046a94231c3eb09fc27ceca Mon Sep 17 00:00:00 2001
|
||||||
|
From: Michael Onken <onken@open-connections.de>
|
||||||
|
Date: Wed, 15 Sep 2021 09:04:12 +0200
|
||||||
|
Subject: [PATCH 20/22] [CVE-2021-41689] Fixed possible NULL pointer
|
||||||
|
dereference.
|
||||||
|
|
||||||
|
Thanks to Jinsheng Ba <bajinsheng@u.nus.edu> for the report and patch.
|
||||||
|
|
||||||
|
(cherry picked from commit 5c14bf53fb42ceca12bbcc0016e8704b1580920d)
|
||||||
|
---
|
||||||
|
dcmnet/libsrc/diutil.cc | 3 ++-
|
||||||
|
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/dcmnet/libsrc/diutil.cc b/dcmnet/libsrc/diutil.cc
|
||||||
|
index 856143d8c..fc446dd43 100644
|
||||||
|
--- a/dcmnet/libsrc/diutil.cc
|
||||||
|
+++ b/dcmnet/libsrc/diutil.cc
|
||||||
|
@@ -177,7 +177,8 @@ DU_getStringDOElement(DcmItem *obj, DcmTagKey t, char *s, size_t bufsize)
|
||||||
|
s[0] = '\0';
|
||||||
|
} else {
|
||||||
|
ec = elem->getString(aString);
|
||||||
|
- OFStandard::strlcpy(s, aString, bufsize);
|
||||||
|
+ if (ec == EC_Normal)
|
||||||
|
+ OFStandard::strlcpy(s, aString, bufsize);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return (ec == EC_Normal);
|
||||||
|
--
|
||||||
|
2.39.2
|
||||||
|
|
@ -0,0 +1,53 @@
|
|||||||
|
From 6aca095491009d88c4e2ea6be153ed1c5ee8e9c3 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Marco Eichelberg <dicom@offis.de>
|
||||||
|
Date: Wed, 30 Mar 2022 18:46:02 +0200
|
||||||
|
Subject: [PATCH 21/22] [CVE-2022-2119, CVE-2022-2120, CVE-2022-2121] Fixed
|
||||||
|
possible NULL pointer dereference.
|
||||||
|
|
||||||
|
Fixed a possible NULL pointer dereference that could occur when reading an
|
||||||
|
invalid DICOM file from stdin. Loading a file from the file system
|
||||||
|
and receiving data over a network connection were not affected by this bug.
|
||||||
|
|
||||||
|
Thanks to Sharon Brizinov and Noam Moshe from Claroty Research for the
|
||||||
|
bug report and sample file.
|
||||||
|
|
||||||
|
(cherry picked from commit 3e996a2749a9355c9b680fa464ecfd9ab9ff567f)
|
||||||
|
---
|
||||||
|
dcmdata/libsrc/dcfilefo.cc | 3 +++
|
||||||
|
dcmdata/libsrc/dcitem.cc | 6 +++++-
|
||||||
|
2 files changed, 8 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/dcmdata/libsrc/dcfilefo.cc b/dcmdata/libsrc/dcfilefo.cc
|
||||||
|
index 4b6b64899..ede677efd 100644
|
||||||
|
--- a/dcmdata/libsrc/dcfilefo.cc
|
||||||
|
+++ b/dcmdata/libsrc/dcfilefo.cc
|
||||||
|
@@ -736,6 +736,9 @@ OFCondition DcmFileFormat::readUntilTag(DcmInputStream &inStream,
|
||||||
|
errorFlag = metaInfo->read(inStream, EXS_Unknown, glenc, maxReadLength);
|
||||||
|
}
|
||||||
|
|
||||||
|
+ // bail out if the meta-header is still incomplete or an error occured
|
||||||
|
+ if (errorFlag.bad()) return errorFlag;
|
||||||
|
+
|
||||||
|
// determine xfer from tag (0002,0010) in the meta header
|
||||||
|
newxfer = lookForXfer(metaInfo);
|
||||||
|
if ((FileReadMode == ERM_fileOnly) || (FileReadMode == ERM_metaOnly))
|
||||||
|
diff --git a/dcmdata/libsrc/dcitem.cc b/dcmdata/libsrc/dcitem.cc
|
||||||
|
index 045f3c93f..a866b9845 100644
|
||||||
|
--- a/dcmdata/libsrc/dcitem.cc
|
||||||
|
+++ b/dcmdata/libsrc/dcitem.cc
|
||||||
|
@@ -1463,7 +1463,11 @@ OFCondition DcmItem::readUntilTag(DcmInputStream & inStream,
|
||||||
|
/* tag and length (and possibly VR) information as well as maybe some data */
|
||||||
|
/* data value information. We need to continue reading the data value */
|
||||||
|
/* information for this particular element. */
|
||||||
|
- errorFlag = elementList->get()->read(inStream, xfer, glenc, maxReadLength);
|
||||||
|
+ DcmObject *dO = elementList->get();
|
||||||
|
+ if (dO)
|
||||||
|
+ errorFlag = dO->read(inStream, xfer, glenc, maxReadLength);
|
||||||
|
+ else errorFlag = EC_InternalError; // should never happen
|
||||||
|
+
|
||||||
|
/* if reading was successful, we read the entire information */
|
||||||
|
/* for this element; hence lastElementComplete is true */
|
||||||
|
if (errorFlag.good())
|
||||||
|
--
|
||||||
|
2.39.2
|
||||||
|
|
Loading…
Reference in new issue