|
51 | 51 | } |
52 | 52 | return outstr |
53 | 53 | } |
54 | | - |
55 | 54 | var fieldValue, dataSize, segmentType |
56 | 55 | var segmentStartPos = startOffset |
57 | 56 | while (segmentStartPos < startOffset + sectionLength) { |
|
61 | 60 | dataView.getUint8(segmentStartPos + 1) === 0x02 |
62 | 61 | ) { |
63 | 62 | segmentType = dataView.getUint8(segmentStartPos + 2) |
64 | | - |
65 | 63 | // only store data for known tags |
66 | 64 | if (segmentType in data.iptc.tags) { |
67 | 65 | dataSize = dataView.getInt16(segmentStartPos + 3) |
68 | 66 | fieldValue = getStringFromDB(dataView, segmentStartPos + 5, dataSize) |
69 | | - |
70 | 67 | // Check if we already stored a value with this name |
71 | 68 | if (data.iptc.hasOwnProperty(segmentType)) { |
72 | 69 | // Value already stored with this name, create multivalue field |
|
88 | 85 | if (options.disableIptc) { |
89 | 86 | return |
90 | 87 | } |
91 | | - |
| 88 | + var markerLength = offset + length |
92 | 89 | // Found '8BIM<EOT><EOT>' ? |
93 | 90 | var isFieldSegmentStart = function (dataView, offset) { |
94 | 91 | return ( |
95 | 92 | dataView.getUint32(offset) === 0x3842494d && |
96 | 93 | dataView.getUint16(offset + 4) === 0x0404 |
97 | 94 | ) |
98 | 95 | } |
99 | | - |
100 | 96 | // Hunt forward, looking for the correct IPTC block signature: |
101 | 97 | // Reference: https://metacpan.org/pod/distribution/Image-MetaData-JPEG/lib/Image/MetaData/JPEG/Structures.pod#Structure-of-a-Photoshop-style-APP13-segment |
102 | | - |
103 | 98 | // From https://github.com/exif-js/exif-js/blob/master/exif.js ~ line 474 on |
104 | | - while (offset < offset + length) { |
| 99 | + while (offset + 8 < markerLength) { |
105 | 100 | if (isFieldSegmentStart(dataView, offset)) { |
106 | 101 | var nameHeaderLength = dataView.getUint8(offset + 7) |
107 | 102 | if (nameHeaderLength % 2 !== 0) nameHeaderLength += 1 |
|
110 | 105 | // Always 4 |
111 | 106 | nameHeaderLength = 4 |
112 | 107 | } |
113 | | - |
114 | 108 | var startOffset = offset + 8 + nameHeaderLength |
| 109 | + if (startOffset > markerLength) { |
| 110 | + console.log('Invalid IPTC data: Invalid segment offset.') |
| 111 | + break |
| 112 | + } |
115 | 113 | var sectionLength = dataView.getUint16(offset + 6 + nameHeaderLength) |
116 | | - |
| 114 | + if (offset + sectionLength > markerLength) { |
| 115 | + console.log('Invalid IPTC data: Invalid segment size.') |
| 116 | + break |
| 117 | + } |
117 | 118 | // Create the iptc object to store the tags: |
118 | 119 | data.iptc = new loadImage.IptcMap() |
119 | | - |
120 | 120 | // Parse the tags |
121 | 121 | return loadImage.parseIptcTags( |
122 | 122 | dataView, |
|
0 commit comments