Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit a2d7ed9

Browse files
AT41hisham
andauthored
fix: handle 0x00E1 / 0x00E0 segments from Pixel phones (jpeg-js#84)
* add unit test to reproduce jpeg-js#82 * Added new case to deal with e0 and e1 unused byte markers * Popular invalid filemarkers now treated as exceptions Co-authored-by: Hisham Al-Shurafa <[email protected]> Co-authored-by: Anthony Tang <[email protected]>
1 parent 5e8ec27 commit a2d7ed9

File tree

4 files changed

+22
-1
lines changed

4 files changed

+22
-1
lines changed

lib/decoder.js

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -623,6 +623,7 @@ var JpegImage = (function jpegImage() {
623623
var quantizationTables = [], frames = [];
624624
var huffmanTablesAC = [], huffmanTablesDC = [];
625625
var fileMarker = readUint16();
626+
var malformedDataOffset = -1;
626627
this.comments = [];
627628
if (fileMarker != 0xFFD8) { // SOI (Start of Image)
628629
throw new Error("SOI not found");
@@ -813,7 +814,6 @@ var JpegImage = (function jpegImage() {
813814
offset--;
814815
}
815816
break;
816-
817817
default:
818818
if (data[offset - 3] == 0xFF &&
819819
data[offset - 2] >= 0xC0 && data[offset - 2] <= 0xFE) {
@@ -822,6 +822,19 @@ var JpegImage = (function jpegImage() {
822822
offset -= 3;
823823
break;
824824
}
825+
else if (fileMarker === 0xE0 || fileMarker == 0xE1) {
826+
// Recover from malformed APP1 markers popular in some phone models.
827+
// See https://github.com/eugeneware/jpeg-js/issues/82
828+
if (malformedDataOffset !== -1) {
829+
throw new Error(`first unknown JPEG marker at offset ${malformedDataOffset.toString(16)}, second unknown JPEG marker ${fileMarker.toString(16)} at offset ${(offset - 1).toString(16)}`);
830+
}
831+
malformedDataOffset = offset - 1;
832+
const nextOffset = readUint16();
833+
if (data[offset + nextOffset - 2] === 0xFF) {
834+
offset += nextOffset - 2;
835+
break;
836+
}
837+
}
825838
throw new Error("unknown JPEG marker " + fileMarker.toString(16));
826839
}
827840
fileMarker = readUint16();

test/fixtures/table-with-bad-e1.jpg

591 KB
Loading

test/fixtures/table-with-good-e1.jpg

591 KB
Loading

test/index.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,14 @@ const SUPER_LARGE_JPEG_BASE64 =
1212

1313
const SUPER_LARGE_JPEG_BUFFER = Buffer.from(SUPER_LARGE_JPEG_BASE64, 'base64');
1414

15+
it('should be able read image with a bad e1 marker not preceeded by ff', function () {
16+
var jpegData = fixture('table-with-bad-e1.jpg');
17+
var rawImageData = jpeg.decode(jpegData);
18+
var expected = fixture('table-with-good-e1.jpg');
19+
var rawExpectedImageData = jpeg.decode(expected);
20+
expect(rawImageData.data).toEqual(rawExpectedImageData.data);
21+
});
22+
1523
it('should be able to decode a JPEG', function () {
1624
var jpegData = fixture('grumpycat.jpg');
1725
var rawImageData = jpeg.decode(jpegData);

0 commit comments

Comments
 (0)