From 51b156bf1278fc0f9476de70c89697576c0f4b55 Mon Sep 17 00:00:00 2001 From: Conrad Scherb <68687721+conrad-scherb@users.noreply.github.com> Date: Wed, 14 Dec 2022 11:32:16 +1300 Subject: [PATCH] fix: infinite loop on dcm with no meta length (#331) --- packages/adapters/src/DicomMessage.js | 11 ++++++-- packages/adapters/test/data.test.js | 25 ++++++++++++++++++ .../adapters/test/no-meta-length-test.dcm | Bin 0 -> 338 bytes 3 files changed, 34 insertions(+), 2 deletions(-) create mode 100644 packages/adapters/test/no-meta-length-test.dcm diff --git a/packages/adapters/src/DicomMessage.js b/packages/adapters/src/DicomMessage.js index 9c053f30f..e563707ca 100644 --- a/packages/adapters/src/DicomMessage.js +++ b/packages/adapters/src/DicomMessage.js @@ -200,8 +200,15 @@ class DicomMessage { if (stream.readAsciiString(4) !== "DICM") { throw new Error("Invalid DICOM file, expected header is missing"); } - var el = DicomMessage._readTag(stream, useSyntax), - metaLength = el.values[0]; + + var el = DicomMessage._readTag(stream, useSyntax); + if (el.tag.toCleanString() !== "00020000") { + throw new Error( + "Invalid DICOM file, meta length tag is malformed or not present." + ); + } + + var metaLength = el.values[0]; //read header buffer var metaStream = stream.more(metaLength); diff --git a/packages/adapters/test/data.test.js b/packages/adapters/test/data.test.js index 11a8b02a8..f55ca2473 100644 --- a/packages/adapters/test/data.test.js +++ b/packages/adapters/test/data.test.js @@ -765,3 +765,28 @@ it("Reads and writes numbers with NaN and Infinity values of tags with type FD ( Infinity ); }); + +it("Tests that reading fails on a DICOM without a meta length tag", () => { + const rawFile = fs.readFileSync("test/no-meta-length-test.dcm"); + + let arrayBuffer = rawFile.buffer; + if ( + rawFile.byteOffset !== 0 || + rawFile.byteLength !== arrayBuffer.byteLength + ) { + arrayBuffer = arrayBuffer.slice( + rawFile.byteOffset, + rawFile.byteOffset + rawFile.byteLength + ); + } + + expect(() => { + dcmjs.data.DicomMessage.readFile(arrayBuffer, { + ignoreErrors: false, + untilTag: "0020000E", + includeUntilTagValue: true + }); + }).toThrow( + "Invalid DICOM file, meta length tag is malformed or not present." + ); +}); \ No newline at end of file diff --git a/packages/adapters/test/no-meta-length-test.dcm b/packages/adapters/test/no-meta-length-test.dcm new file mode 100644 index 0000000000000000000000000000000000000000..777b93d0f0bf4b91594e697f809467f71771321f GIT binary patch literal 338 zcmc(ZF$w}f3`IYqNE$^%#KK}v5Ry0})5>nM#a8R~-v1Q-(ay%wKp-LSB?0~$!`M#= z3CnnaYiP};Ze~@Bx@M;9O`XJw%;wEp+3ndKzl`QL^1zvVNX-zOer^|>$*k!(`3}Qf i5EgD8MPPVLyd0%k6+F?;{CDoKrIX;~cdXiP&3^$(1Ro&) literal 0 HcmV?d00001