Skip to content

Commit 13eef6f

Browse files
daniel.zhuangzhuangzegnfeng
authored andcommitted
Fix pdfiumload.c vips_foreign_load_pdf_generate(). Inconsistent PDF page dimensions (varying width/height) may generate empty Bitmaps, leading to crashes in PDFium versions prior to 6633.
1 parent ee262ff commit 13eef6f

File tree

2 files changed

+47
-41
lines changed

2 files changed

+47
-41
lines changed

ChangeLog

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ master
33
- add dcrawload, dcrawload_source, dcrawload_buffer: load raw camera files
44
using libraw [lxsameer]
55
- add magickload_source: load from a source with imagemagick
6+
- fix pdfiumload.c vips_foreign_load_pdf_generate(): crash risk when pdfium < 6633 [daniel]
67

78
8.17.1
89

libvips/foreign/pdfiumload.c

Lines changed: 46 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -584,47 +584,52 @@ vips_foreign_load_pdf_generate(VipsRegion *out_region,
584584

585585
top = r->top;
586586
while (top < VIPS_RECT_BOTTOM(r)) {
587-
VipsRect rect;
588-
FPDF_BITMAP bitmap;
589-
590-
vips_rect_intersectrect(r, &pdf->pages[i], &rect);
591-
592-
if (vips_foreign_load_pdf_get_page(pdf, pdf->page_no + i))
593-
return -1;
594-
595-
vips__worker_lock(&vips_pdfium_mutex);
596-
597-
/* 4 means RGBA.
598-
*/
599-
bitmap = FPDFBitmap_CreateEx(rect.width, rect.height, 4,
600-
VIPS_REGION_ADDR(out_region, rect.left, rect.top),
601-
VIPS_REGION_LSKIP(out_region));
602-
603-
/* Only paint the background if there's no transparency.
604-
*/
605-
if (!FPDFPage_HasTransparency(pdf->page)) {
606-
FPDF_DWORD ink = *((guint32 *) pdf->ink);
607-
608-
FPDFBitmap_FillRect(bitmap,
609-
0, 0, rect.width, rect.height, ink);
610-
}
611-
612-
// pdfium writes bgra by default, we need rgba
613-
FPDF_RenderPageBitmap(bitmap, pdf->page,
614-
pdf->pages[i].left - rect.left,
615-
pdf->pages[i].top - rect.top,
616-
pdf->pages[i].width, pdf->pages[i].height,
617-
0, FPDF_ANNOT | FPDF_REVERSE_BYTE_ORDER);
618-
619-
FPDF_FFLDraw(pdf->form, bitmap, pdf->page,
620-
pdf->pages[i].left - rect.left,
621-
pdf->pages[i].top - rect.top,
622-
pdf->pages[i].width, pdf->pages[i].height,
623-
0, FPDF_ANNOT | FPDF_REVERSE_BYTE_ORDER);
624-
625-
FPDFBitmap_Destroy(bitmap);
626-
627-
g_mutex_unlock(&vips_pdfium_mutex);
587+
FPDF_BITMAP bitmap;
588+
589+
/* Is the rect within this page? It might not be if the output is more
590+
* than one tile wide and this page is narrower.
591+
*/
592+
VipsRect rect;
593+
vips_rect_intersectrect(r, &pdf->pages[i], &rect);
594+
if (rect.width > 0 && rect.height > 0) {
595+
596+
if (vips_foreign_load_pdf_get_page(pdf, pdf->page_no + i))
597+
return -1;
598+
599+
vips__worker_lock(&vips_pdfium_mutex);
600+
601+
/* 4 means RGBA.
602+
*/
603+
bitmap = FPDFBitmap_CreateEx(rect.width, rect.height, 4,
604+
VIPS_REGION_ADDR(out_region, rect.left, rect.top),
605+
VIPS_REGION_LSKIP(out_region));
606+
607+
/* Only paint the background if there's no transparency.
608+
*/
609+
if (!FPDFPage_HasTransparency(pdf->page)) {
610+
FPDF_DWORD ink = *((guint32 *) pdf->ink);
611+
612+
FPDFBitmap_FillRect(bitmap,
613+
0, 0, rect.width, rect.height, ink);
614+
}
615+
616+
// pdfium writes bgra by default, we need rgba
617+
FPDF_RenderPageBitmap(bitmap, pdf->page,
618+
pdf->pages[i].left - rect.left,
619+
pdf->pages[i].top - rect.top,
620+
pdf->pages[i].width, pdf->pages[i].height,
621+
0, FPDF_ANNOT | FPDF_REVERSE_BYTE_ORDER);
622+
623+
FPDF_FFLDraw(pdf->form, bitmap, pdf->page,
624+
pdf->pages[i].left - rect.left,
625+
pdf->pages[i].top - rect.top,
626+
pdf->pages[i].width, pdf->pages[i].height,
627+
0, FPDF_ANNOT | FPDF_REVERSE_BYTE_ORDER);
628+
629+
FPDFBitmap_Destroy(bitmap);
630+
631+
g_mutex_unlock(&vips_pdfium_mutex);
632+
}
628633

629634
top += rect.height;
630635
i += 1;

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy