Skip to content

Commit

Permalink
Fixed possible overflows when allocating memory.
Browse files Browse the repository at this point in the history
Thanks to GitHub user "bananabr" (Daniel Berredo) for the report and
suggested patch.
  • Loading branch information
michaelonken committed Feb 21, 2024
1 parent e1ca2e8 commit ec52e99
Show file tree
Hide file tree
Showing 6 changed files with 531 additions and 4 deletions.
14 changes: 13 additions & 1 deletion dcmect/libsrc/enhanced_ct.cc
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
#include "dcmtk/dcmect/types.h"
#include "dcmtk/dcmfg/concatenationcreator.h"
#include "dcmtk/dcmfg/concatenationloader.h"
#include "dcmtk/dcmfg/fgtypes.h"
#include "dcmtk/dcmiod/iodutil.h"
#include "dcmtk/dcmiod/modimagepixel.h"

Expand Down Expand Up @@ -103,8 +104,19 @@ struct EctEnhancedCT::WriteVisitor
m_CT.getRows(rows);
m_CT.getColumns(cols);
const size_t numFrames = m_CT.m_Frames.size();
if (numFrames > 2147483647)
{
DCMECT_ERROR("More than 2147483647 frames provided");
return FG_EC_PixelDataTooLarge;
}
const size_t numPixelsFrame = OFstatic_cast(size_t, rows) * OFstatic_cast(size_t, cols);
const size_t numBytesFrame = m_CT.m_Frames[0]->length;
const size_t numPixelsFrame = rows * cols;
if (numBytesFrame != numPixelsFrame * 2)
{
DCMECT_ERROR("Invalid number of bytes per frame: Expected " << numPixelsFrame * 2 << " but got "
<< numBytesFrame << " frame pixel data");
return ECT_InvalidPixelInfo;
}
// Creates the correct pixel data element, based on the image pixel module used.
DcmPixelData* pixData = new DcmPixelData(DCM_PixelData);
OFCondition result;
Expand Down
1 change: 1 addition & 0 deletions dcmect/tests/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
DCMTK_ADD_EXECUTABLE(dcmect_tests
tests.cc
t_huge_concat.cc
t_overflow.cc
t_roundtrip.cc
)

Expand Down
151 changes: 151 additions & 0 deletions dcmect/tests/Makefile.dep
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,157 @@ t_huge_concat.o: t_huge_concat.cc \
../../dcmfg/include/dcmtk/dcmfg/fgplanor.h \
../../dcmfg/include/dcmtk/dcmfg/fgplanpo.h \
../../dcmfg/include/dcmtk/dcmfg/fgtemporalposition.h
t_overflow.o: t_overflow.cc ../../config/include/dcmtk/config/osconfig.h \
../include/dcmtk/dcmect/enhanced_ct.h ../include/dcmtk/dcmect/def.h \
../../ofstd/include/dcmtk/ofstd/ofexport.h \
../include/dcmtk/dcmect/types.h ../../oflog/include/dcmtk/oflog/oflog.h \
../../oflog/include/dcmtk/oflog/logger.h \
../../oflog/include/dcmtk/oflog/config.h \
../../ofstd/include/dcmtk/ofstd/ofdefine.h \
../../ofstd/include/dcmtk/ofstd/ofcast.h \
../../ofstd/include/dcmtk/ofstd/ofstdinc.h \
../../oflog/include/dcmtk/oflog/config/defines.h \
../../oflog/include/dcmtk/oflog/helpers/threadcf.h \
../../oflog/include/dcmtk/oflog/loglevel.h \
../../ofstd/include/dcmtk/ofstd/ofvector.h \
../../ofstd/include/dcmtk/ofstd/oftypes.h \
../../ofstd/include/dcmtk/ofstd/ofstream.h \
../../oflog/include/dcmtk/oflog/tstring.h \
../../ofstd/include/dcmtk/ofstd/ofstring.h \
../../oflog/include/dcmtk/oflog/tchar.h \
../../oflog/include/dcmtk/oflog/spi/apndatch.h \
../../oflog/include/dcmtk/oflog/appender.h \
../../ofstd/include/dcmtk/ofstd/ofmem.h \
../../ofstd/include/dcmtk/ofstd/ofutil.h \
../../ofstd/include/dcmtk/ofstd/oftraits.h \
../../ofstd/include/dcmtk/ofstd/variadic/tuplefwd.h \
../../oflog/include/dcmtk/oflog/layout.h \
../../oflog/include/dcmtk/oflog/streams.h \
../../oflog/include/dcmtk/oflog/helpers/pointer.h \
../../oflog/include/dcmtk/oflog/thread/syncprim.h \
../../oflog/include/dcmtk/oflog/spi/filter.h \
../../oflog/include/dcmtk/oflog/helpers/lockfile.h \
../../oflog/include/dcmtk/oflog/spi/logfact.h \
../../oflog/include/dcmtk/oflog/logmacro.h \
../../oflog/include/dcmtk/oflog/helpers/snprintf.h \
../../oflog/include/dcmtk/oflog/tracelog.h \
../../ofstd/include/dcmtk/ofstd/ofcond.h \
../../ofstd/include/dcmtk/ofstd/ofdiag.h \
../../ofstd/include/dcmtk/ofstd/diag/push.def \
../../ofstd/include/dcmtk/ofstd/diag/useafree.def \
../../ofstd/include/dcmtk/ofstd/diag/pop.def \
../../dcmfg/include/dcmtk/dcmfg/fginterface.h \
../../dcmfg/include/dcmtk/dcmfg/fg.h \
../../dcmfg/include/dcmtk/dcmfg/fgbase.h \
../../dcmdata/include/dcmtk/dcmdata/dcitem.h \
../../ofstd/include/dcmtk/ofstd/offile.h \
../../ofstd/include/dcmtk/ofstd/ofstd.h \
../../ofstd/include/dcmtk/ofstd/oflist.h \
../../ofstd/include/dcmtk/ofstd/oflimits.h \
../../config/include/dcmtk/config/arith.h \
../../ofstd/include/dcmtk/ofstd/oferror.h \
../../dcmdata/include/dcmtk/dcmdata/dctypes.h \
../../dcmdata/include/dcmtk/dcmdata/dcdefine.h \
../../dcmdata/include/dcmtk/dcmdata/dcobject.h \
../../ofstd/include/dcmtk/ofstd/ofglobal.h \
../../ofstd/include/dcmtk/ofstd/ofthread.h \
../../dcmdata/include/dcmtk/dcmdata/dcerror.h \
../../dcmdata/include/dcmtk/dcmdata/dcxfer.h \
../../dcmdata/include/dcmtk/dcmdata/dcvr.h \
../../dcmdata/include/dcmtk/dcmdata/dctag.h \
../../dcmdata/include/dcmtk/dcmdata/dctagkey.h \
../../ofstd/include/dcmtk/ofstd/diag/ignrattr.def \
../../dcmdata/include/dcmtk/dcmdata/dcstack.h \
../../dcmdata/include/dcmtk/dcmdata/dclist.h \
../../dcmdata/include/dcmtk/dcmdata/dcpcache.h \
../../dcmfg/include/dcmtk/dcmfg/fgtypes.h \
../../dcmfg/include/dcmtk/dcmfg/fgdefine.h \
../../ofstd/include/dcmtk/ofstd/ofmap.h \
../../dcmiod/include/dcmtk/dcmiod/iodimage.h \
../../dcmiod/include/dcmtk/dcmiod/iodcommn.h \
../../dcmiod/include/dcmtk/dcmiod/iodrules.h \
../../dcmiod/include/dcmtk/dcmiod/iodtypes.h \
../../dcmiod/include/dcmtk/dcmiod/ioddef.h \
../../dcmiod/include/dcmtk/dcmiod/modcommoninstanceref.h \
../../dcmiod/include/dcmtk/dcmiod/iodmacro.h \
../../dcmdata/include/dcmtk/dcmdata/dcdeftag.h \
../../dcmdata/include/dcmtk/dcmdata/dcvrlo.h \
../../dcmdata/include/dcmtk/dcmdata/dcchrstr.h \
../../dcmdata/include/dcmtk/dcmdata/dcbytstr.h \
../../dcmdata/include/dcmtk/dcmdata/dcelem.h \
../../dcmdata/include/dcmtk/dcmdata/dcvris.h \
../../dcmdata/include/dcmtk/dcmdata/dcvrus.h \
../../dcmdata/include/dcmtk/dcmdata/dcvrlt.h \
../../dcmdata/include/dcmtk/dcmdata/dcvrcs.h \
../../dcmdata/include/dcmtk/dcmdata/dcvrpn.h \
../../dcmiod/include/dcmtk/dcmiod/modbase.h \
../../dcmiod/include/dcmtk/dcmiod/iodreferences.h \
../../dcmiod/include/dcmtk/dcmiod/modequipment.h \
../../dcmiod/include/dcmtk/dcmiod/modfor.h \
../../dcmiod/include/dcmtk/dcmiod/modgeneralseries.h \
../../dcmiod/include/dcmtk/dcmiod/modgeneralstudy.h \
../../dcmiod/include/dcmtk/dcmiod/modpatient.h \
../../dcmiod/include/dcmtk/dcmiod/modpatientstudy.h \
../../dcmiod/include/dcmtk/dcmiod/modsopcommon.h \
../../dcmiod/include/dcmtk/dcmiod/modgeneralimage.h \
../../dcmiod/include/dcmtk/dcmiod/modimagepixelvariant.h \
../../dcmiod/include/dcmtk/dcmiod/modimagepixelbase.h \
../../ofstd/include/dcmtk/ofstd/ofvriant.h \
../../ofstd/include/dcmtk/ofstd/variadic/variant.h \
../../ofstd/include/dcmtk/ofstd/variadic/helpers.h \
../../ofstd/include/dcmtk/ofstd/ofalign.h \
../../ofstd/include/dcmtk/ofstd/diag/cnvrsn.def \
../../ofstd/include/dcmtk/ofstd/diag/vsprfw.def \
../../ofstd/include/dcmtk/ofstd/diag/arrybnds.def \
../../ofstd/include/dcmtk/ofstd/diag/unrefprm.def \
../../dcmiod/include/dcmtk/dcmiod/modacquisitioncontext.h \
../../dcmiod/include/dcmtk/dcmiod/modenhequipment.h \
../../dcmiod/include/dcmtk/dcmiod/modimagepixel.h \
../../dcmiod/include/dcmtk/dcmiod/modmultiframedimension.h \
../../dcmiod/include/dcmtk/dcmiod/modmultiframefg.h \
../../dcmiod/include/dcmtk/dcmiod/modsynchronisation.h \
../../dcmdata/include/dcmtk/dcmdata/dcvrdt.h \
../../ofstd/include/dcmtk/ofstd/ofdatime.h \
../../ofstd/include/dcmtk/ofstd/ofdate.h \
../../ofstd/include/dcmtk/ofstd/oftime.h \
../../dcmdata/include/dcmtk/dcmdata/dcvrds.h \
../../dcmdata/include/dcmtk/dcmdata/dcvrfd.h \
../../ofstd/include/dcmtk/ofstd/oftempf.h \
../../ofstd/include/dcmtk/ofstd/oftest.h \
../../ofstd/include/dcmtk/ofstd/ofconapp.h \
../../ofstd/include/dcmtk/ofstd/ofcmdln.h \
../../ofstd/include/dcmtk/ofstd/ofexbl.h \
../../ofstd/include/dcmtk/ofstd/ofconsol.h \
../../ofstd/include/dcmtk/ofstd/ofexit.h \
../../dcmdata/include/dcmtk/dcmdata/dcuid.h \
../../dcmdata/include/dcmtk/dcmdata/dcdict.h \
../../dcmdata/include/dcmtk/dcmdata/dchashdi.h \
../../dcmdata/include/dcmtk/dcmdata/dcfilefo.h \
../../dcmdata/include/dcmtk/dcmdata/dcsequen.h \
../../dcmdata/include/dcmtk/dcmdata/dcdatset.h \
../../dcmfg/include/dcmtk/dcmfg/fgctacquisitiondetails.h \
../../dcmfg/include/dcmtk/dcmfg/fgctacquisitiontype.h \
../../dcmfg/include/dcmtk/dcmfg/fgctadditionalxraysource.h \
../../dcmdata/include/dcmtk/dcmdata/dcvrfl.h \
../../dcmdata/include/dcmtk/dcmdata/dcvrsh.h \
../../dcmfg/include/dcmtk/dcmfg/fgctexposure.h \
../../dcmfg/include/dcmtk/dcmfg/fgctgeometry.h \
../../dcmfg/include/dcmtk/dcmfg/fgctimageframetype.h \
../../dcmfg/include/dcmtk/dcmfg/fgctposition.h \
../../dcmfg/include/dcmtk/dcmfg/fgctreconstruction.h \
../../dcmfg/include/dcmtk/dcmfg/fgcttabledynamics.h \
../../dcmfg/include/dcmtk/dcmfg/fgctxraydetails.h \
../../dcmfg/include/dcmtk/dcmfg/fgfracon.h \
../../dcmdata/include/dcmtk/dcmdata/dcvrul.h \
../../dcmfg/include/dcmtk/dcmfg/fgframeanatomy.h \
../../dcmfg/include/dcmtk/dcmfg/fgirradiationeventid.h \
../../dcmdata/include/dcmtk/dcmdata/dcvrui.h \
../../dcmfg/include/dcmtk/dcmfg/fgpixeltransform.h \
../../dcmfg/include/dcmtk/dcmfg/fgpixmsr.h \
../../dcmfg/include/dcmtk/dcmfg/fgplanor.h \
../../dcmfg/include/dcmtk/dcmfg/fgplanpo.h \
../../dcmfg/include/dcmtk/dcmfg/fgrealworldvaluemapping.h \
../../dcmiod/include/dcmtk/dcmiod/iodcontentitemmacro.h
t_roundtrip.o: t_roundtrip.cc \
../../config/include/dcmtk/config/osconfig.h \
../../ofstd/include/dcmtk/ofstd/ofmem.h \
Expand Down
4 changes: 2 additions & 2 deletions dcmect/tests/Makefile.in
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,10 @@ LIBDIRS = -L$(top_srcdir)/libsrc -L$(ofstddir)/libsrc -L$(oflogdir)/libsrc \
-L$(oficonvdir)/libsrc
LOCALLIBS = -ldcmect -ldcmfg -ldcmiod -ldcmdata -loflog -lofstd -loficonv \
$(ZLIBLIBS) $(CHARCONVLIBS) $(MATHLIBS)
LOCALINCLUDES = -I$(top_srcdir)/include -I$(ofstddir)/include -I$(oflogdir)/include \
LOCALINCLUDES = -I$(top_srcdir)/include -I$(configdir)/include -I$(ofstddir)/include -I$(oflogdir)/include \
-I$(dcmdatadir)/include -I$(dcmioddir)/include -I$(dcmfgdir)/include

test_objs = tests.o t_huge_concat.o t_roundtrip.o
test_objs = tests.o t_huge_concat.o t_overflow.cc t_roundtrip.o
objs = $(test_objs)
progs = tests

Expand Down
Loading

0 comments on commit ec52e99

Please sign in to comment.