Skip to content

Commit e7430b6

Browse files
committed
Add index safety checks in apply_png_predictor()
Closes bug #1269.
1 parent a18de2a commit e7430b6

1 file changed

Lines changed: 22 additions & 14 deletions

File tree

pdfminer/utils.py

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -211,10 +211,14 @@ def apply_png_predictor(
211211
# bytes already decoded, and Prior() refers to the decoded bytes of
212212
# the prior scanline.
213213
for j, average_x in enumerate(line_encoded):
214-
raw_x_bpp = 0 if j < bpp else raw[j - bpp]
215-
prior_x = line_above[j]
216-
raw_x = (average_x + (raw_x_bpp + prior_x) // 2) & 255
217-
raw.append(raw_x)
214+
raw_x_bpp = 0
215+
if 0 <= (j - bpp) < len(raw):
216+
raw_x_bpp = 0 if j < bpp else raw[j - bpp]
217+
218+
if 0 <= j < len(line_above):
219+
prior_x = line_above[j]
220+
raw_x = (average_x + (raw_x_bpp + prior_x) // 2) & 255
221+
raw.append(raw_x)
218222

219223
elif filter_type == 4:
220224
# Filter type 4: Paeth
@@ -226,16 +230,20 @@ def apply_png_predictor(
226230
# already decoded. Exactly the same PaethPredictor() function is
227231
# used by both encoder and decoder.
228232
for j, paeth_x in enumerate(line_encoded):
229-
if j < bpp:
230-
raw_x_bpp = 0
231-
prior_x_bpp = 0
232-
else:
233-
raw_x_bpp = raw[j - bpp]
234-
prior_x_bpp = line_above[j - bpp]
235-
prior_x = line_above[j]
236-
paeth = paeth_predictor(raw_x_bpp, prior_x, prior_x_bpp)
237-
raw_x = (paeth_x + paeth) & 255
238-
raw.append(raw_x)
233+
raw_x_bpp = 0
234+
prior_x_bpp = 0
235+
236+
if j >= bpp:
237+
if 0 <= (j - bpp) < len(raw):
238+
raw_x_bpp = raw[j - bpp]
239+
if 0 <= (j - bpp) < len(line_above):
240+
prior_x_bpp = line_above[j - bpp]
241+
242+
if 0 <= j < len(line_above):
243+
prior_x = line_above[j]
244+
paeth = paeth_predictor(raw_x_bpp, prior_x, prior_x_bpp)
245+
raw_x = (paeth_x + paeth) & 255
246+
raw.append(raw_x)
239247

240248
else:
241249
raise PDFValueError(f"Unsupported predictor value: {filter_type}")

0 commit comments

Comments
 (0)