Show an error when opening an encrypted PDF file.

This commit is contained in:
Michael R Sweet 2021-08-30 11:18:23 -04:00
parent 6aa5585eb4
commit b2db43afcb
No known key found for this signature in database
GPG Key ID: 999559A027815955

View File

@ -1166,7 +1166,7 @@ load_xref(pdfio_file_t *pdf, // I - PDF file
PDFIO_DEBUG("load_xref: xref_offset=%lu, line='%s'\n", (unsigned long)xref_offset, line); PDFIO_DEBUG("load_xref: xref_offset=%lu, line='%s'\n", (unsigned long)xref_offset, line);
if (isdigit(line[0] & 255) && strlen(line) > 4 && !strcmp(line + strlen(line) - 4, " obj")) if (isdigit(line[0] & 255) && strlen(line) > 4 && (!strcmp(line + strlen(line) - 4, " obj") || ((ptr = strstr(line, " obj")) != NULL && ptr[4] == '<')))
{ {
// Cross-reference stream // Cross-reference stream
pdfio_obj_t *obj; // Object pdfio_obj_t *obj; // Object
@ -1201,12 +1201,14 @@ load_xref(pdfio_file_t *pdf, // I - PDF file
while (isspace(*ptr & 255)) while (isspace(*ptr & 255))
ptr ++; ptr ++;
if (strcmp(ptr, "obj")) if (strncmp(ptr, "obj", 3))
{ {
_pdfioFileError(pdf, "Bad xref table header '%s'.", line); _pdfioFileError(pdf, "Bad xref table header '%s'.", line);
return (false); return (false);
} }
_pdfioFileSeek(pdf, xref_offset + ptr + 3 - line, SEEK_SET);
PDFIO_DEBUG("load_xref: Loading object %lu %u.\n", (unsigned long)number, (unsigned)generation); PDFIO_DEBUG("load_xref: Loading object %lu %u.\n", (unsigned long)number, (unsigned)generation);
if ((obj = add_obj(pdf, (size_t)number, (unsigned short)generation, xref_offset)) == NULL) if ((obj = add_obj(pdf, (size_t)number, (unsigned short)generation, xref_offset)) == NULL)
@ -1227,6 +1229,12 @@ load_xref(pdfio_file_t *pdf, // I - PDF file
_pdfioFileError(pdf, "Cross-reference stream does not have a dictionary."); _pdfioFileError(pdf, "Cross-reference stream does not have a dictionary.");
return (false); return (false);
} }
else if (_pdfioDictGetValue(pdf->trailer, "Encrypt"))
{
// Encryption not yet supported...
_pdfioFileError(pdf, "Sorry, PDFio currently does not support encrypted PDF files.");
return (false);
}
obj->value = trailer; obj->value = trailer;
@ -1468,6 +1476,12 @@ load_xref(pdfio_file_t *pdf, // I - PDF file
_pdfioFileError(pdf, "Trailer is not a dictionary."); _pdfioFileError(pdf, "Trailer is not a dictionary.");
return (false); return (false);
} }
else if (_pdfioDictGetValue(pdf->trailer, "Encrypt"))
{
// Encryption not yet supported...
_pdfioFileError(pdf, "Sorry, PDFio currently does not support encrypted PDF files.");
return (false);
}
_pdfioTokenFlush(&tb); _pdfioTokenFlush(&tb);
} }