2019-04-17 17:46:59 +02:00
|
|
|
Fix LuaTeX compatibility with Poppler 0.75.
|
2018-12-09 00:40:05 +01:00
|
|
|
|
|
|
|
Upstream LuaTeX have moved from Poppler to "pplib" and thus upstream
|
2019-04-17 17:46:59 +02:00
|
|
|
fixes are unavailable. This is based on Archs patch, with minor
|
|
|
|
tweaks to comply with texlive-bin-CVE-2018-17407.patch.
|
|
|
|
https://git.archlinux.org/svntogit/packages.git/tree/trunk?h=packages/texlive-bin&id=418dd6f008c3d41a461353fdb60f2d73d87c58ed
|
2018-12-09 00:40:05 +01:00
|
|
|
|
|
|
|
diff --git a/texk/web2c/luatexdir/image/pdftoepdf.w b/texk/web2c/luatexdir/image/pdftoepdf.w
|
|
|
|
--- a/texk/web2c/luatexdir/image/pdftoepdf.w
|
|
|
|
+++ b/texk/web2c/luatexdir/image/pdftoepdf.w
|
2019-04-17 17:46:59 +02:00
|
|
|
@@ -363,7 +363,7 @@ void copyReal(PDF pdf, double d)
|
2018-12-09 00:40:05 +01:00
|
|
|
|
|
|
|
static void copyString(PDF pdf, GooString * string)
|
|
|
|
{
|
|
|
|
- char *p;
|
|
|
|
+ const char *p;
|
|
|
|
unsigned char c;
|
|
|
|
size_t i, l;
|
2019-04-17 17:46:59 +02:00
|
|
|
p = string->getCString();
|
2018-12-09 00:40:05 +01:00
|
|
|
@@ -393,7 +393,7 @@ static void copyString(PDF pdf, GooString * string)
|
|
|
|
pdf->cave = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
-static void copyName(PDF pdf, char *s)
|
|
|
|
+static void copyName(PDF pdf, const char *s)
|
|
|
|
{
|
|
|
|
pdf_out(pdf, '/');
|
|
|
|
for (; *s != 0; s++) {
|
2019-04-17 17:46:59 +02:00
|
|
|
@@ -412,7 +412,7 @@ static void copyArray(PDF pdf, PdfDocument * pdf_doc, Array * array)
|
|
|
|
Object obj1;
|
|
|
|
pdf_begin_array(pdf);
|
|
|
|
for (i = 0, l = array->getLength(); i < l; ++i) {
|
|
|
|
- obj1 = array->getNF(i);
|
|
|
|
+ obj1 = array->getNF(i).copy();
|
|
|
|
copyObject(pdf, pdf_doc, &obj1);
|
|
|
|
}
|
|
|
|
pdf_end_array(pdf);
|
|
|
|
@@ -425,7 +425,7 @@ static void copyDict(PDF pdf, PdfDocument * pdf_doc, Dict * dict)
|
|
|
|
pdf_begin_dict(pdf);
|
|
|
|
for (i = 0, l = dict->getLength(); i < l; ++i) {
|
|
|
|
copyName(pdf, dict->getKey(i));
|
|
|
|
- obj1 = dict->getValNF(i);
|
|
|
|
+ obj1 = dict->getValNF(i).copy();
|
|
|
|
copyObject(pdf, pdf_doc, &obj1);
|
|
|
|
}
|
|
|
|
pdf_end_dict(pdf);
|
|
|
|
@@ -475,7 +475,7 @@ static void copyObject(PDF pdf, PdfDocument * pdf_doc, Object * obj)
|
2018-12-09 00:40:05 +01:00
|
|
|
copyString(pdf, (GooString *)obj->getString());
|
|
|
|
break;
|
|
|
|
case objName:
|
|
|
|
- copyName(pdf, (char *)obj->getName());
|
|
|
|
+ copyName(pdf, obj->getName());
|
|
|
|
break;
|
|
|
|
case objNull:
|
|
|
|
pdf_add_null(pdf);
|
|
|
|
@@ -531,22 +531,22 @@ static PDFRectangle *get_pagebox(Page * page, int pagebox_spec)
|
|
|
|
{
|
|
|
|
switch (pagebox_spec) {
|
|
|
|
case PDF_BOX_SPEC_MEDIA:
|
|
|
|
- return page->getMediaBox();
|
|
|
|
+ return (PDFRectangle *) page->getMediaBox();
|
|
|
|
break;
|
|
|
|
case PDF_BOX_SPEC_CROP:
|
|
|
|
- return page->getCropBox();
|
|
|
|
+ return (PDFRectangle *) page->getCropBox();
|
|
|
|
break;
|
|
|
|
case PDF_BOX_SPEC_BLEED:
|
|
|
|
- return page->getBleedBox();
|
|
|
|
+ return (PDFRectangle *) page->getBleedBox();
|
|
|
|
break;
|
|
|
|
case PDF_BOX_SPEC_TRIM:
|
|
|
|
- return page->getTrimBox();
|
|
|
|
+ return (PDFRectangle *) page->getTrimBox();
|
|
|
|
break;
|
|
|
|
case PDF_BOX_SPEC_ART:
|
|
|
|
- return page->getArtBox();
|
|
|
|
+ return (PDFRectangle *) page->getArtBox();
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
- return page->getMediaBox();
|
|
|
|
+ return (PDFRectangle *) page->getMediaBox();
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2019-04-17 17:46:59 +02:00
|
|
|
@@ -788,12 +788,12 @@ void write_epdf(PDF pdf, image_dict * idict, int suppress_optional_info)
|
|
|
|
Now all relevant parts of the Page dictionary are copied. Metadata validity
|
|
|
|
check is needed(as a stream it must be indirect).
|
|
|
|
*/
|
|
|
|
- obj1 = pageDict->lookupNF("Metadata");
|
|
|
|
+ obj1 = pageDict->lookupNF("Metadata").copy();
|
|
|
|
if (!obj1.isNull() && !obj1.isRef())
|
|
|
|
formatted_warning("pdf inclusion","/Metadata must be indirect object");
|
|
|
|
/* copy selected items in Page dictionary */
|
|
|
|
for (i = 0; pagedictkeys[i] != NULL; i++) {
|
|
|
|
- obj1 = pageDict->lookupNF(pagedictkeys[i]);
|
|
|
|
+ obj1 = pageDict->lookupNF(pagedictkeys[i]).copy();
|
|
|
|
if (!obj1.isNull()) {
|
|
|
|
pdf_add_name(pdf, pagedictkeys[i]);
|
|
|
|
/* preserves indirection */
|
|
|
|
@@ -806,13 +806,13 @@ void write_epdf(PDF pdf, image_dict * idict, int suppress_optional_info)
|
|
|
|
PDF file, climbing up the tree until the Resources are found.
|
|
|
|
(This fixes a problem with Scribus 1.3.3.14.)
|
|
|
|
*/
|
|
|
|
- obj1 = pageDict->lookupNF("Resources");
|
|
|
|
+ obj1 = pageDict->lookupNF("Resources").copy();
|
|
|
|
if (obj1.isNull()) {
|
|
|
|
op1 = &pagesobj1;
|
|
|
|
op2 = &pagesobj2;
|
|
|
|
*op1 = pageDict->lookup("Parent");
|
|
|
|
while (op1->isDict()) {
|
|
|
|
- obj1 = op1->dictLookupNF("Resources");
|
|
|
|
+ obj1 = op1->dictLookupNF("Resources").copy();
|
|
|
|
if (!obj1.isNull()) {
|
|
|
|
pdf_add_name(pdf, "Resources");
|
|
|
|
copyObject(pdf, pdf_doc, &obj1);
|
2018-12-09 00:40:05 +01:00
|
|
|
diff --git a/texk/web2c/luatexdir/lua/lepdflib.cc b/texk/web2c/luatexdir/lua/lepdflib.cc
|
|
|
|
--- a/texk/web2c/luatexdir/lua/lepdflib.cc
|
|
|
|
+++ b/texk/web2c/luatexdir/lua/lepdflib.cc
|
|
|
|
@@ -240,7 +240,7 @@ static int l_new_Attribute(lua_State * L)
|
|
|
|
if (uobj->pd != NULL && uobj->pd->pc != uobj->pc)
|
|
|
|
pdfdoc_changed_error(L);
|
|
|
|
uout = new_Attribute_userdata(L);
|
|
|
|
- uout->d = new Attribute(n, nlen, (Object *)uobj->d);
|
|
|
|
+ uout->d = new Attribute((GooString)n, (Object *)uobj->d);
|
|
|
|
uout->atype = ALLOC_LEPDF;
|
|
|
|
uout->pc = uobj->pc;
|
|
|
|
uout->pd = uobj->pd;
|
2019-04-17 17:46:59 +02:00
|
|
|
@@ -496,7 +496,7 @@ static int l_new_Object(lua_State * L)
|
|
|
|
double numA = lua_tonumber(L,1);
|
|
|
|
double genA = lua_tonumber(L,2);
|
|
|
|
if ( ((numA)==(int)(numA)) && ((genA)==(int)(genA)) ){
|
|
|
|
- uout->d = new Object((int)(numA), (int)(genA));
|
|
|
|
+ uout->d = new Object({(int)(numA), (int)(genA)});
|
|
|
|
uout->atype = ALLOC_LEPDF;
|
|
|
|
uout->pc = 0;
|
|
|
|
uout->pd = NULL;
|
2018-12-09 00:40:05 +01:00
|
|
|
@@ -596,7 +596,7 @@ static int m_##in##_##function(lua_State * L) \
|
|
|
|
uin = (udstruct *) luaL_checkudata(L, 1, M_##in); \
|
|
|
|
if (uin->pd != NULL && uin->pd->pc != uin->pc) \
|
|
|
|
pdfdoc_changed_error(L); \
|
|
|
|
- o = ((in *) uin->d)->function(); \
|
|
|
|
+ o = (out *) ((in *) uin->d)->function(); \
|
|
|
|
if (o != NULL) { \
|
|
|
|
uout = new_##out##_userdata(L); \
|
|
|
|
uout->d = o; \
|
2019-04-17 17:46:59 +02:00
|
|
|
@@ -889,7 +889,7 @@ static int m_Array_getNF(lua_State * L)
|
2018-12-09 00:40:05 +01:00
|
|
|
if (i > 0 && i <= len) {
|
2019-04-17 17:46:59 +02:00
|
|
|
uout = new_Object_userdata(L);
|
|
|
|
uout->d = new Object();
|
|
|
|
- *((Object *) uout->d) = ((Array *) uin->d)->getNF(i - 1);
|
|
|
|
+ *((Object *) uout->d) = ((Array *) uin->d)->getNF(i - 1).copy();
|
|
|
|
uout->atype = ALLOC_LEPDF;
|
|
|
|
uout->pc = uin->pc;
|
|
|
|
uout->pd = uin->pd;
|
2018-12-09 00:40:05 +01:00
|
|
|
@@ -1125,12 +1125,12 @@ m_poppler_get_INT(Dict, getLength);
|
|
|
|
|
|
|
|
static int m_Dict_add(lua_State * L)
|
|
|
|
{
|
|
|
|
- char *s;
|
|
|
|
+ const char *s;
|
|
|
|
udstruct *uin, *uobj;
|
|
|
|
uin = (udstruct *) luaL_checkudata(L, 1, M_Dict);
|
|
|
|
if (uin->pd != NULL && uin->pd->pc != uin->pc)
|
|
|
|
pdfdoc_changed_error(L);
|
|
|
|
- s = copyString(luaL_checkstring(L, 2));
|
|
|
|
+ s = luaL_checkstring(L, 2);
|
|
|
|
uobj = (udstruct *) luaL_checkudata(L, 3, M_Object);
|
|
|
|
((Dict *) uin->d)->add(s, std::move(*((Object *) uobj->d)));
|
|
|
|
return 0;
|
2019-04-17 17:46:59 +02:00
|
|
|
@@ -1190,7 +1190,7 @@ static int m_Dict_lookupNF(lua_State * L)
|
|
|
|
s = luaL_checkstring(L, 2);
|
|
|
|
uout = new_Object_userdata(L);
|
|
|
|
uout->d = new Object();
|
|
|
|
- *((Object *) uout->d) = ((Dict *) uin->d)->lookupNF(s);
|
|
|
|
+ *((Object *) uout->d) = ((Dict *) uin->d)->lookupNF(s).copy();
|
|
|
|
uout->atype = ALLOC_LEPDF;
|
|
|
|
uout->pc = uin->pc;
|
|
|
|
uout->pd = uin->pd;
|
|
|
|
@@ -1263,7 +1263,7 @@ static int m_Dict_getValNF(lua_State * L)
|
|
|
|
if (i > 0 && i <= len) {
|
|
|
|
uout = new_Object_userdata(L);
|
|
|
|
uout->d = new Object();
|
|
|
|
- *((Object *) uout->d) = ((Dict *) uin->d)->getValNF(i - 1);
|
|
|
|
+ *((Object *) uout->d) = ((Dict *) uin->d)->getValNF(i - 1).copy();
|
|
|
|
uout->atype = ALLOC_LEPDF;
|
|
|
|
uout->pc = uin->pc;
|
|
|
|
uout->pd = uin->pd;
|
|
|
|
@@ -1653,7 +1653,7 @@ static int m_Object_initRef(lua_State * L)
|
2018-12-09 00:40:05 +01:00
|
|
|
pdfdoc_changed_error(L);
|
2019-04-17 17:46:59 +02:00
|
|
|
num = luaL_checkint(L, 2);
|
|
|
|
gen = luaL_checkint(L, 3);
|
|
|
|
- *((Object *) uin->d) = Object(num, gen);
|
|
|
|
+ *((Object *) uin->d) = Object({num, gen});
|
2018-12-09 00:40:05 +01:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2019-04-17 17:46:59 +02:00
|
|
|
@@ -2011,7 +2011,7 @@ static int m_Object_arrayGetNF(lua_State * L)
|
|
|
|
if (i > 0 && i <= len) {
|
|
|
|
uout = new_Object_userdata(L);
|
|
|
|
uout->d = new Object();
|
|
|
|
- *((Object *) uout->d) = ((Object *) uin->d)->arrayGetNF(i - 1);
|
|
|
|
+ *((Object *) uout->d) = ((Object *) uin->d)->arrayGetNF(i - 1).copy();
|
|
|
|
uout->atype = ALLOC_LEPDF;
|
|
|
|
uout->pc = uin->pc;
|
|
|
|
uout->pd = uin->pd;
|
2018-12-09 00:40:05 +01:00
|
|
|
@@ -2051,7 +2051,7 @@ static int m_Object_dictAdd(lua_State * L)
|
|
|
|
pdfdoc_changed_error(L);
|
|
|
|
if (!((Object *) uin->d)->isDict())
|
|
|
|
luaL_error(L, "Object is not a Dict");
|
|
|
|
- ((Object *) uin->d)->dictAdd(copyString(s), std::move(*((Object *) uobj->d)));
|
|
|
|
+ ((Object *) uin->d)->dictAdd(s, std::move(*((Object *) uobj->d)));
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2019-04-17 17:46:59 +02:00
|
|
|
@@ -2104,7 +2104,7 @@ static int m_Object_dictLookupNF(lua_State * L)
|
|
|
|
if (((Object *) uin->d)->isDict()) {
|
|
|
|
uout = new_Object_userdata(L);
|
|
|
|
uout->d = new Object();
|
|
|
|
- *((Object *) uout->d) = ((Object *) uin->d)->dictLookupNF(s);
|
|
|
|
+ *((Object *) uout->d) = ((Object *) uin->d)->dictLookupNF(s).copy();
|
|
|
|
uout->atype = ALLOC_LEPDF;
|
|
|
|
uout->pc = uin->pc;
|
|
|
|
uout->pd = uin->pd;
|
|
|
|
@@ -2169,7 +2169,7 @@ static int m_Object_dictGetValNF(lua_State * L)
|
|
|
|
if (i > 0 && i <= len) {
|
|
|
|
uout = new_Object_userdata(L);
|
|
|
|
uout->d = new Object();
|
|
|
|
- *((Object *) uout->d) = ((Object *) uin->d)->dictGetValNF(i - 1);
|
|
|
|
+ *((Object *) uout->d) = ((Object *) uin->d)->dictGetValNF(i - 1).copy();
|
|
|
|
uout->atype = ALLOC_LEPDF;
|
|
|
|
uout->pc = uin->pc;
|
|
|
|
uout->pd = uin->pd;
|
|
|
|
@@ -2470,7 +2470,7 @@ static int m_PDFDoc_getFileName(lua_State * L)
|
2018-12-09 00:40:05 +01:00
|
|
|
uin = (udstruct *) luaL_checkudata(L, 1, M_PDFDoc);
|
|
|
|
if (uin->pd != NULL && uin->pd->pc != uin->pc)
|
|
|
|
pdfdoc_changed_error(L);
|
|
|
|
- gs = ((PdfDocument *) uin->d)->doc->getFileName();
|
|
|
|
+ gs = (GooString *) ((PdfDocument *) uin->d)->doc->getFileName();
|
|
|
|
if (gs != NULL)
|
2019-04-17 17:46:59 +02:00
|
|
|
lua_pushlstring(L, gs->getCString(), gs->getLength());
|
2018-12-09 00:40:05 +01:00
|
|
|
else
|
2019-04-17 17:46:59 +02:00
|
|
|
@@ -2559,7 +2559,7 @@ static int m_PDFDoc_readMetadata(lua_State * L)
|
2018-12-09 00:40:05 +01:00
|
|
|
if (uin->pd != NULL && uin->pd->pc != uin->pc)
|
|
|
|
pdfdoc_changed_error(L);
|
|
|
|
if (((PdfDocument *) uin->d)->doc->getCatalog()->isOk()) {
|
|
|
|
- gs = ((PdfDocument *) uin->d)->doc->readMetadata();
|
|
|
|
+ gs = (GooString *) ((PdfDocument *) uin->d)->doc->readMetadata();
|
|
|
|
if (gs != NULL)
|
2019-04-17 17:46:59 +02:00
|
|
|
lua_pushlstring(L, gs->getCString(), gs->getLength());
|
2018-12-09 00:40:05 +01:00
|
|
|
else
|
|
|
|
@@ -2577,7 +2577,7 @@ static int m_PDFDoc_getStructTreeRoot(lua_State * L)
|
|
|
|
if (uin->pd != NULL && uin->pd->pc != uin->pc)
|
|
|
|
pdfdoc_changed_error(L);
|
|
|
|
if (((PdfDocument *) uin->d)->doc->getCatalog()->isOk()) {
|
|
|
|
- obj = ((PdfDocument *) uin->d)->doc->getStructTreeRoot();
|
|
|
|
+ obj = (StructTreeRoot *) ((PdfDocument *) uin->d)->doc->getStructTreeRoot();
|
|
|
|
uout = new_StructTreeRoot_userdata(L);
|
|
|
|
uout->d = obj;
|
|
|
|
uout->pc = uin->pc;
|
2019-06-15 12:31:49 +02:00
|
|
|
--- texlive-source/texk/web2c/luatexdir/lua/lepdflib.cc.orig 2019-04-24 09:41:05.090522664 +0000
|
|
|
|
+++ texlive-source/texk/web2c/luatexdir/lua/lepdflib.cc 2019-04-24 09:43:37.119184926 +0000
|
|
|
|
@@ -994,7 +994,8 @@
|
|
|
|
pdfdoc_changed_error(L);
|
|
|
|
num = luaL_checkint(L, 2);
|
|
|
|
gen = luaL_checkint(L, 3);
|
|
|
|
- i = ((Catalog *) uin->d)->findPage(num, gen);
|
|
|
|
+ Ref numgen = {num, gen};
|
|
|
|
+ i = ((Catalog *) uin->d)->findPage(numgen);
|
|
|
|
if (i > 0)
|
|
|
|
lua_pushinteger(L, i);
|
|
|
|
else
|
|
|
|
@@ -2596,8 +2597,9 @@
|
|
|
|
pdfdoc_changed_error(L);
|
|
|
|
num = luaL_checkint(L, 2);
|
|
|
|
gen = luaL_checkint(L, 3);
|
|
|
|
+ Ref numgen = {num, gen};
|
|
|
|
if (((PdfDocument *) uin->d)->doc->getCatalog()->isOk()) {
|
|
|
|
- i = ((PdfDocument *) uin->d)->doc->findPage(num, gen);
|
|
|
|
+ i = ((PdfDocument *) uin->d)->doc->findPage(numgen);
|
|
|
|
if (i > 0)
|
|
|
|
lua_pushinteger(L, i);
|
|
|
|
else
|
|
|
|
--- texlive-source/texk/web2c/luatexdir/image/pdftoepdf.w.orig 2019-04-24 09:56:38.406498975 +0000
|
|
|
|
+++ texlive-source/texk/web2c/luatexdir/image/pdftoepdf.w 2019-04-24 09:56:57.020081327 +0000
|
|
|
|
@@ -630,7 +630,7 @@
|
|
|
|
if (link == NULL || !link->isOk())
|
|
|
|
formatted_error("pdf inclusion","invalid destination '%s'",img_pagename(idict));
|
|
|
|
Ref ref = link->getPageRef();
|
|
|
|
- img_pagenum(idict) = catalog->findPage(ref.num, ref.gen);
|
|
|
|
+ img_pagenum(idict) = catalog->findPage(ref);
|
|
|
|
if (img_pagenum(idict) == 0)
|
|
|
|
formatted_error("pdf inclusion","destination is not a page '%s'",img_pagename(idict));
|
|
|
|
delete link;
|