Fix LuaTeX compatibility with Poppler 0.75. Upstream LuaTeX have moved from Poppler to "pplib" and thus upstream 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 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 @@ -363,7 +363,7 @@ void copyReal(PDF pdf, double d) static void copyString(PDF pdf, GooString * string) { - char *p; + const char *p; unsigned char c; size_t i, l; p = string->getCString(); @@ -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++) { @@ -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) 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; } } @@ -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); 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; @@ -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; @@ -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; \ @@ -889,7 +889,7 @@ static int m_Array_getNF(lua_State * L) if (i > 0 && i <= len) { 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; @@ -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; @@ -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) pdfdoc_changed_error(L); num = luaL_checkint(L, 2); gen = luaL_checkint(L, 3); - *((Object *) uin->d) = Object(num, gen); + *((Object *) uin->d) = Object({num, gen}); return 0; } @@ -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; @@ -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; } @@ -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) 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) lua_pushlstring(L, gs->getCString(), gs->getLength()); else @@ -2559,7 +2559,7 @@ static int m_PDFDoc_readMetadata(lua_State * L) 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) lua_pushlstring(L, gs->getCString(), gs->getLength()); 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; --- 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;