Skip to content

Commit

Permalink
* added back support for detecting malformed sequences.
Browse files Browse the repository at this point in the history
* updated readEncapsulatedPixelData to not use readSequenceItem() for finding delimeter item so the malfromed sequence check didn't cause it to fail
* made error message for non DICOM P10 files more clear
* improved clarity of some error messages by adding the source function to the message
  • Loading branch information
chafey committed May 4, 2016
1 parent a42c62a commit 12a338e
Show file tree
Hide file tree
Showing 15 changed files with 59 additions and 36 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -346,4 +346,4 @@ You can find out more about this by googling for "self documenting code"

Copyright
============
Copyright 2015 Chris Hafey [[email protected]](mailto:[email protected])
Copyright 2016 Chris Hafey [[email protected]](mailto:[email protected])
2 changes: 1 addition & 1 deletion bower.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "dicomParser",
"version": "1.4.0",
"version": "1.4.1",
"description": "Javascript parser for DICOM Part 10 data",
"main" : "dist/dicomParser.js",
"ignore": [
Expand Down
40 changes: 26 additions & 14 deletions dist/dicomParser.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
/*! dicom-parser - v1.4.0 - 2016-05-03 | (c) 2014 Chris Hafey | https://github.com/chafey/dicomParser */
/*! dicom-parser - v1.4.1 - 2016-05-04 | (c) 2014 Chris Hafey | https://github.com/chafey/dicomParser */
(function (root, factory) {

// node.js
Expand Down Expand Up @@ -558,14 +558,21 @@ var dicomParser = (function (dicomParser)
var fragments = [];
var bufferSize = 0;
while(byteStream.position < endOfFrame && byteStream.position < byteStream.byteArray.length) {
var fragment = dicomParser.readSequenceItem(byteStream);
// NOTE: we only encounter this for the sequence delimiter tag when extracting the last frame
if(fragment.tag === 'xfffee0dd') {

// read the fragment
var item = {
tag : dicomParser.readTag(byteStream),
length : byteStream.readUint32(),
dataOffset : byteStream.position
};

// NOTE: we only encounter this for the sequence delimiter item when extracting the last frame
if(item.tag === 'xfffee0dd') {
break;
}
fragments.push(fragment);
byteStream.seek(fragment.length);
bufferSize += fragment.length;
fragments.push(item);
byteStream.seek(item.length);
bufferSize += item.length;
}

// Convert the fragments into a single pixelData buffer
Expand Down Expand Up @@ -702,7 +709,7 @@ var dicomParser = (function (dicomParser)
else if(byteArray instanceof Uint8Array) {
return new Uint8Array(byteArray.buffer, byteOffset, length);
} else {
throw 'unknown buffer type';
throw 'dicomParser.from: unknown type for byteArray';
}
};

Expand All @@ -719,7 +726,7 @@ var dicomParser = (function (dicomParser)
else if(byteArray instanceof Uint8Array) {
return new Uint8Array(length);
} else {
throw 'unknown buffer type';
throw 'dicomParser.alloc: unknown type for byteArray';
}
};

Expand Down Expand Up @@ -928,7 +935,7 @@ var dicomParser = (function (dicomParser)
{
if(length < 0)
{
throw 'readFixedString - length cannot be less than 0';
throw 'dicomParser.readFixedString - length cannot be less than 0';
}

if(position + length > byteArray.length) {
Expand Down Expand Up @@ -1019,7 +1026,7 @@ var dicomParser = (function (dicomParser)
{
if(this.position + offset < 0)
{
throw "cannot seek to position < 0";
throw "dicomParser.ByteStream.prototype.seek: cannot seek to position < 0";
}
this.position += offset;
};
Expand All @@ -1033,7 +1040,7 @@ var dicomParser = (function (dicomParser)
dicomParser.ByteStream.prototype.readByteStream = function(numBytes)
{
if(this.position + numBytes > this.byteArray.length) {
throw 'readByteStream - buffer overread';
throw 'dicomParser.ByteStream.prototype.readByteStream: readByteStream - buffer overread';
}
var byteArrayView = dicomParser.from(this.byteArray, this.position, numBytes);
this.position += numBytes;
Expand Down Expand Up @@ -1963,7 +1970,7 @@ var dicomParser = (function(dicomParser) {
var prefix = littleEndianByteStream.readFixedString(4);
if(prefix !== "DICM")
{
throw "dicomParser.readPart10Header: DICM prefix not found at location 132";
throw "dicomParser.readPart10Header: DICM prefix not found at location 132 - this is not a valid DICOM P10 file.";
}
}

Expand Down Expand Up @@ -2259,6 +2266,11 @@ var dicomParser = (function (dicomParser)
dataOffset : byteStream.position
};

if (element.tag !== 'xfffee000') {
var startPosition = byteStream.position;
throw "dicomParser.readSequenceItem: item tag (FFFE,E000) not found at offset " + startPosition;
}

return element;
};

Expand Down Expand Up @@ -2312,7 +2324,7 @@ var dicomParser = (function (dicomParser)
dicomParser = {};
}

dicomParser.version = "1.4.0";
dicomParser.version = "1.4.1";

return dicomParser;
}(dicomParser));
Expand Down
4 changes: 2 additions & 2 deletions dist/dicomParser.min.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion dist/package.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
Package.describe({
name: 'chafey:dicom-parser',
summary: 'Javascript parser for DICOM Part 10 data',
version: '1.4.0',
version: '1.4.1',
git: 'https://github.com/chafey/dicomParser.git/',
documentation: null
});
Expand Down
2 changes: 1 addition & 1 deletion meteor/dicomParser/package.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
Package.describe({
name: 'chafey:dicom-parser',
summary: 'Javascript parser for DICOM Part 10 data',
version: '1.4.0',
version: '1.4.1',
git: 'https://github.com/chafey/dicomParser.git/',
documentation: null
});
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "dicom-parser",
"version": "1.4.0",
"version": "1.4.1",
"description": "Javascript parser for DICOM Part 10 data",
"keywords": [
"DICOM",
Expand Down
4 changes: 2 additions & 2 deletions src/alloc.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ var dicomParser = (function (dicomParser)
else if(byteArray instanceof Uint8Array) {
return new Uint8Array(byteArray.buffer, byteOffset, length);
} else {
throw 'unknown buffer type';
throw 'dicomParser.from: unknown type for byteArray';
}
};

Expand All @@ -44,7 +44,7 @@ var dicomParser = (function (dicomParser)
else if(byteArray instanceof Uint8Array) {
return new Uint8Array(length);
} else {
throw 'unknown buffer type';
throw 'dicomParser.alloc: unknown type for byteArray';
}
};

Expand Down
2 changes: 1 addition & 1 deletion src/byteArrayParser.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ var dicomParser = (function (dicomParser)
{
if(length < 0)
{
throw 'readFixedString - length cannot be less than 0';
throw 'dicomParser.readFixedString - length cannot be less than 0';
}

if(position + length > byteArray.length) {
Expand Down
4 changes: 2 additions & 2 deletions src/byteStream.js
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ var dicomParser = (function (dicomParser)
{
if(this.position + offset < 0)
{
throw "cannot seek to position < 0";
throw "dicomParser.ByteStream.prototype.seek: cannot seek to position < 0";
}
this.position += offset;
};
Expand All @@ -78,7 +78,7 @@ var dicomParser = (function (dicomParser)
dicomParser.ByteStream.prototype.readByteStream = function(numBytes)
{
if(this.position + numBytes > this.byteArray.length) {
throw 'readByteStream - buffer overread';
throw 'dicomParser.ByteStream.prototype.readByteStream: readByteStream - buffer overread';
}
var byteArrayView = dicomParser.from(this.byteArray, this.position, numBytes);
this.position += numBytes;
Expand Down
19 changes: 13 additions & 6 deletions src/readEncapsulatedPixelData.js
Original file line number Diff line number Diff line change
Expand Up @@ -36,14 +36,21 @@ var dicomParser = (function (dicomParser)
var fragments = [];
var bufferSize = 0;
while(byteStream.position < endOfFrame && byteStream.position < byteStream.byteArray.length) {
var fragment = dicomParser.readSequenceItem(byteStream);
// NOTE: we only encounter this for the sequence delimiter tag when extracting the last frame
if(fragment.tag === 'xfffee0dd') {

// read the fragment
var item = {
tag : dicomParser.readTag(byteStream),
length : byteStream.readUint32(),
dataOffset : byteStream.position
};

// NOTE: we only encounter this for the sequence delimiter item when extracting the last frame
if(item.tag === 'xfffee0dd') {
break;
}
fragments.push(fragment);
byteStream.seek(fragment.length);
bufferSize += fragment.length;
fragments.push(item);
byteStream.seek(item.length);
bufferSize += item.length;
}

// Convert the fragments into a single pixelData buffer
Expand Down
2 changes: 1 addition & 1 deletion src/readPart10Header.js
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ var dicomParser = (function(dicomParser) {
var prefix = littleEndianByteStream.readFixedString(4);
if(prefix !== "DICM")
{
throw "dicomParser.readPart10Header: DICM prefix not found at location 132";
throw "dicomParser.readPart10Header: DICM prefix not found at location 132 - this is not a valid DICOM P10 file.";
}
}

Expand Down
5 changes: 5 additions & 0 deletions src/readSequenceItem.js
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,11 @@ var dicomParser = (function (dicomParser)
dataOffset : byteStream.position
};

if (element.tag !== 'xfffee000') {
var startPosition = byteStream.position;
throw "dicomParser.readSequenceItem: item tag (FFFE,E000) not found at offset " + startPosition;
}

return element;
};

Expand Down
2 changes: 1 addition & 1 deletion src/version.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ var dicomParser = (function (dicomParser)
dicomParser = {};
}

dicomParser.version = "1.4.0";
dicomParser.version = "1.4.1";

return dicomParser;
}(dicomParser));
3 changes: 1 addition & 2 deletions test/readDicomElementImplicitTest.js
Original file line number Diff line number Diff line change
Expand Up @@ -158,8 +158,7 @@
var byteStream = new dicomParser.ByteStream(dicomParser.littleEndianByteArrayParser, convertToByteArray(bytes));

// Act/Assert
assert.throws(function() { dicomParser.readDicomElementImplicit(byteStream, undefined); }, /invalid value for parameter 'maxPosition'/);

assert.throws(function() { dicomParser.readDicomElementImplicit(byteStream, undefined); }, 'dicomParser.readSequenceItem: item tag (FFFE,E000) not found at offset 8');
});

test("bytes resembling an end-of-sequence tag are not treated like an SQ item when using a callback", function(assert) {
Expand Down

0 comments on commit 12a338e

Please sign in to comment.