From a256df47de7f8da7fd4773b13745c450537cafb2 Mon Sep 17 00:00:00 2001 From: Jason Hostetter MD Date: Tue, 7 Jun 2022 22:33:31 -0400 Subject: [PATCH] Fix parsing of truncated byte arrays Return all parsed data in thrown exception --- src/parseDicom.js | 15 ++++++++++++--- test/parseDicom_test.js | 17 +++++++++++++++++ 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/src/parseDicom.js b/src/parseDicom.js index df0ebfee..f44c6769 100644 --- a/src/parseDicom.js +++ b/src/parseDicom.js @@ -158,11 +158,20 @@ export default function parseDicom(byteArray, options = {}) { // main function here function parseTheByteStream() { const metaHeaderDataSet = readPart10Header(byteArray, options); - const dataSet = readDataSet(metaHeaderDataSet); - return mergeDataSets(metaHeaderDataSet, dataSet); + try { + const dataSet = readDataSet(metaHeaderDataSet); + return mergeDataSets(metaHeaderDataSet, dataSet); + } catch (e) { + // If an exception is thrown when parsing main dataset (i.e. truncated + // byte array), go ahead and include everything parsed so far in the exception. + if (e.dataSet) { + e.dataSet = mergeDataSets(metaHeaderDataSet, e.dataSet); + } + throw e; + } } - + // This is where we actually start parsing return parseTheByteStream(); } diff --git a/test/parseDicom_test.js b/test/parseDicom_test.js index 751f45b4..b2f18759 100644 --- a/test/parseDicom_test.js +++ b/test/parseDicom_test.js @@ -220,4 +220,21 @@ describe('parseDicom', () => { expect(dataSet.string('x00201041')).to.equal('-43'); }); + it('should parse a truncated byte array and return all parsed elements in the exception (explicitLittleEndian)', () => { + // Arrange + const byteArray = makeExplicitLittleEndianTestData(); + // Truncate between x00201041 and x00280010 + const partialByteArray = byteArray.slice(0, 320) + + // Act + try { + const dataSet = parseDicom(partialByteArray); + } catch (err) { + // Assert + assertMetaHeaderElements(err.dataSet, '1.2.840.10008.1.2.1', 159); + expect(err.dataSet.string('x00020010')).to.equal('1.2.840.10008.1.2.1') + expect(err.dataSet.string('x00201041')).to.equal('-43'); + // expect(err.dataSet.uint16('x00280010')).to.equal(512); + } + }); });