@@ -164,17 +164,20 @@ func (d *decoder) parseIFD(p []byte) error {
164
164
}
165
165
166
166
// readBits reads n bits from the internal buffer starting at the current offset.
167
- func (d * decoder ) readBits (n uint ) uint32 {
167
+ func (d * decoder ) readBits (n uint ) ( v uint32 , ok bool ) {
168
168
for d .nbits < n {
169
169
d .v <<= 8
170
+ if d .off >= len (d .buf ) {
171
+ return 0 , false
172
+ }
170
173
d .v |= uint32 (d .buf [d .off ])
171
174
d .off ++
172
175
d .nbits += 8
173
176
}
174
177
d .nbits -= n
175
178
rv := d .v >> d .nbits
176
179
d .v &^= rv << d .nbits
177
- return rv
180
+ return rv , true
178
181
}
179
182
180
183
// flushBits discards the unread bits in the buffer used by readBits.
@@ -203,24 +206,29 @@ func (d *decoder) decode(dst image.Image, xmin, ymin, xmax, ymax int) error {
203
206
if d .firstVal (tPredictor ) == prHorizontal {
204
207
if d .bpp == 16 {
205
208
var off int
206
- spp := len (d .features [tBitsPerSample ]) // samples per pixel
207
- bpp := spp * 2 // bytes per pixel
209
+ n := 2 * len (d .features [tBitsPerSample ]) // bytes per sample times samples per pixel
208
210
for y := ymin ; y < ymax ; y ++ {
209
- off += spp * 2
210
- for x := 0 ; x < (xmax - xmin - 1 )* bpp ; x += 2 {
211
- v0 := d .byteOrder .Uint16 (d .buf [off - bpp : off - bpp + 2 ])
211
+ off += n
212
+ for x := 0 ; x < (xmax - xmin - 1 )* n ; x += 2 {
213
+ if off + 2 > len (d .buf ) {
214
+ return FormatError ("not enough pixel data" )
215
+ }
216
+ v0 := d .byteOrder .Uint16 (d .buf [off - n : off - n + 2 ])
212
217
v1 := d .byteOrder .Uint16 (d .buf [off : off + 2 ])
213
218
d .byteOrder .PutUint16 (d .buf [off :off + 2 ], v1 + v0 )
214
219
off += 2
215
220
}
216
221
}
217
222
} else if d .bpp == 8 {
218
223
var off int
219
- spp := len (d .features [tBitsPerSample ]) // samples per pixel
224
+ n := 1 * len (d .features [tBitsPerSample ]) // bytes per sample times samples per pixel
220
225
for y := ymin ; y < ymax ; y ++ {
221
- off += spp
222
- for x := 0 ; x < (xmax - xmin - 1 )* spp ; x ++ {
223
- d .buf [off ] += d .buf [off - spp ]
226
+ off += n
227
+ for x := 0 ; x < (xmax - xmin - 1 )* n ; x ++ {
228
+ if off >= len (d .buf ) {
229
+ return FormatError ("not enough pixel data" )
230
+ }
231
+ d .buf [off ] += d .buf [off - n ]
224
232
off ++
225
233
}
226
234
}
@@ -235,6 +243,9 @@ func (d *decoder) decode(dst image.Image, xmin, ymin, xmax, ymax int) error {
235
243
img := dst .(* image.Gray16 )
236
244
for y := ymin ; y < rMaxY ; y ++ {
237
245
for x := xmin ; x < rMaxX ; x ++ {
246
+ if d .off + 2 > len (d .buf ) {
247
+ return FormatError ("not enough pixel data" )
248
+ }
238
249
v := d .byteOrder .Uint16 (d .buf [d .off : d .off + 2 ])
239
250
d .off += 2
240
251
if d .mode == mGrayInvert {
@@ -248,11 +259,15 @@ func (d *decoder) decode(dst image.Image, xmin, ymin, xmax, ymax int) error {
248
259
max := uint32 ((1 << d .bpp ) - 1 )
249
260
for y := ymin ; y < rMaxY ; y ++ {
250
261
for x := xmin ; x < rMaxX ; x ++ {
251
- v := uint8 (d .readBits (d .bpp ) * 0xff / max )
262
+ v , ok := d .readBits (d .bpp )
263
+ if ! ok {
264
+ return FormatError ("not enough pixel data" )
265
+ }
266
+ v = v * 0xff / max
252
267
if d .mode == mGrayInvert {
253
268
v = 0xff - v
254
269
}
255
- img .SetGray (x , y , color.Gray {v })
270
+ img .SetGray (x , y , color.Gray {uint8 ( v ) })
256
271
}
257
272
d .flushBits ()
258
273
}
@@ -261,7 +276,11 @@ func (d *decoder) decode(dst image.Image, xmin, ymin, xmax, ymax int) error {
261
276
img := dst .(* image.Paletted )
262
277
for y := ymin ; y < rMaxY ; y ++ {
263
278
for x := xmin ; x < rMaxX ; x ++ {
264
- img .SetColorIndex (x , y , uint8 (d .readBits (d .bpp )))
279
+ v , ok := d .readBits (d .bpp )
280
+ if ! ok {
281
+ return FormatError ("not enough pixel data" )
282
+ }
283
+ img .SetColorIndex (x , y , uint8 (v ))
265
284
}
266
285
d .flushBits ()
267
286
}
@@ -270,6 +289,9 @@ func (d *decoder) decode(dst image.Image, xmin, ymin, xmax, ymax int) error {
270
289
img := dst .(* image.RGBA64 )
271
290
for y := ymin ; y < rMaxY ; y ++ {
272
291
for x := xmin ; x < rMaxX ; x ++ {
292
+ if d .off + 6 > len (d .buf ) {
293
+ return FormatError ("not enough pixel data" )
294
+ }
273
295
r := d .byteOrder .Uint16 (d .buf [d .off + 0 : d .off + 2 ])
274
296
g := d .byteOrder .Uint16 (d .buf [d .off + 2 : d .off + 4 ])
275
297
b := d .byteOrder .Uint16 (d .buf [d .off + 4 : d .off + 6 ])
@@ -284,6 +306,9 @@ func (d *decoder) decode(dst image.Image, xmin, ymin, xmax, ymax int) error {
284
306
max := img .PixOffset (rMaxX , y )
285
307
off := (y - ymin ) * (xmax - xmin ) * 3
286
308
for i := min ; i < max ; i += 4 {
309
+ if d .off + 3 > len (d .buf ) {
310
+ return FormatError ("not enough pixel data" )
311
+ }
287
312
img .Pix [i + 0 ] = d .buf [off + 0 ]
288
313
img .Pix [i + 1 ] = d .buf [off + 1 ]
289
314
img .Pix [i + 2 ] = d .buf [off + 2 ]
@@ -297,6 +322,9 @@ func (d *decoder) decode(dst image.Image, xmin, ymin, xmax, ymax int) error {
297
322
img := dst .(* image.NRGBA64 )
298
323
for y := ymin ; y < rMaxY ; y ++ {
299
324
for x := xmin ; x < rMaxX ; x ++ {
325
+ if d .off + 8 > len (d .buf ) {
326
+ return FormatError ("not enough pixel data" )
327
+ }
300
328
r := d .byteOrder .Uint16 (d .buf [d .off + 0 : d .off + 2 ])
301
329
g := d .byteOrder .Uint16 (d .buf [d .off + 2 : d .off + 4 ])
302
330
b := d .byteOrder .Uint16 (d .buf [d .off + 4 : d .off + 6 ])
@@ -310,15 +338,21 @@ func (d *decoder) decode(dst image.Image, xmin, ymin, xmax, ymax int) error {
310
338
for y := ymin ; y < rMaxY ; y ++ {
311
339
min := img .PixOffset (xmin , y )
312
340
max := img .PixOffset (rMaxX , y )
313
- buf := d .buf [(y - ymin )* (xmax - xmin )* 4 : (y - ymin + 1 )* (xmax - xmin )* 4 ]
314
- copy (img .Pix [min :max ], buf )
341
+ i0 , i1 := (y - ymin )* (xmax - xmin )* 4 , (y - ymin + 1 )* (xmax - xmin )* 4
342
+ if i1 > len (d .buf ) {
343
+ return FormatError ("not enough pixel data" )
344
+ }
345
+ copy (img .Pix [min :max ], d .buf [i0 :i1 ])
315
346
}
316
347
}
317
348
case mRGBA :
318
349
if d .bpp == 16 {
319
350
img := dst .(* image.RGBA64 )
320
351
for y := ymin ; y < rMaxY ; y ++ {
321
352
for x := xmin ; x < rMaxX ; x ++ {
353
+ if d .off + 8 > len (d .buf ) {
354
+ return FormatError ("not enough pixel data" )
355
+ }
322
356
r := d .byteOrder .Uint16 (d .buf [d .off + 0 : d .off + 2 ])
323
357
g := d .byteOrder .Uint16 (d .buf [d .off + 2 : d .off + 4 ])
324
358
b := d .byteOrder .Uint16 (d .buf [d .off + 4 : d .off + 6 ])
@@ -332,8 +366,11 @@ func (d *decoder) decode(dst image.Image, xmin, ymin, xmax, ymax int) error {
332
366
for y := ymin ; y < rMaxY ; y ++ {
333
367
min := img .PixOffset (xmin , y )
334
368
max := img .PixOffset (rMaxX , y )
335
- buf := d .buf [(y - ymin )* (xmax - xmin )* 4 : (y - ymin + 1 )* (xmax - xmin )* 4 ]
336
- copy (img .Pix [min :max ], buf )
369
+ i0 , i1 := (y - ymin )* (xmax - xmin )* 4 , (y - ymin + 1 )* (xmax - xmin )* 4
370
+ if i1 > len (d .buf ) {
371
+ return FormatError ("not enough pixel data" )
372
+ }
373
+ copy (img .Pix [min :max ], d .buf [i0 :i1 ])
337
374
}
338
375
}
339
376
}
0 commit comments