|
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