diff options
Diffstat (limited to 'backport-CVE-2024-6239.patch')
| -rw-r--r-- | backport-CVE-2024-6239.patch | 188 | 
1 files changed, 84 insertions, 104 deletions
diff --git a/backport-CVE-2024-6239.patch b/backport-CVE-2024-6239.patch index 82c0ed8..a90c60e 100644 --- a/backport-CVE-2024-6239.patch +++ b/backport-CVE-2024-6239.patch @@ -3,126 +3,106 @@ From: Albert Astals Cid <aacid@kde.org>  Date: Fri, 7 Jun 2024 00:54:55 +0200  Subject: [PATCH] pdfinfo: Fix crash in broken documents when using -dests -Reference:https://gitlab.freedesktop.org/poppler/poppler/-/commit/0554731052d1a97745cb179ab0d45620589dd9c4 -Conflict:add StdTextStringToUCS4() to avoid header interface change;remove unnecessary changes in version 0.90.0  --- - utils/pdfinfo.cc | 62 ++++++++++++++++++++++++++++++++++-------------- - 1 file changed, 44 insertions(+), 18 deletions(-) + utils/pdfinfo.cc | 35 +++++++++++++++-------------------- + 1 file changed, 15 insertions(+), 20 deletions(-)  diff --git a/utils/pdfinfo.cc b/utils/pdfinfo.cc -index 2b5eb02..009298e 100644 +index 5d37ef64f..7d569749b 100644  --- a/utils/pdfinfo.cc  +++ b/utils/pdfinfo.cc -@@ -59,6 +59,7 @@ - #include "Page.h" - #include "PDFDoc.h" - #include "PDFDocFactory.h" -+#include "PDFDocEncoding.h" - #include "CharTypes.h" - #include "UnicodeMap.h" - #include "UTF.h" -@@ -297,12 +298,6 @@ static void printStruct(const StructElement *element, unsigned indent) { -   } - } -  --struct GooStringCompare { --  bool operator() (GooString* lhs, GooString* rhs) const { --    return lhs->cmp(const_cast<GooString*>(rhs)) < 0; --  } --}; -- - static void printLinkDest(const std::unique_ptr<LinkDest>& dest) { -   GooString s; +@@ -15,7 +15,7 @@ + // under GPL version 2 or later + // + // Copyright (C) 2006 Dom Lachowicz <cinamod@hotmail.com> +-// Copyright (C) 2007-2010, 2012, 2016-2022 Albert Astals Cid <aacid@kde.org> ++// Copyright (C) 2007-2010, 2012, 2016-2022, 2024 Albert Astals Cid <aacid@kde.org> + // Copyright (C) 2010 Hib Eris <hib@hiberis.nl> + // Copyright (C) 2011 Vittal Aithal <vittal.aithal@cognidox.com> + // Copyright (C) 2012, 2013, 2016-2018, 2021 Adrian Johnson <ajohnson@redneon.com> +@@ -113,16 +113,21 @@ static const ArgDesc argDesc[] = { { "-f", argInt, &firstPage, 0, "first page to +                                    { "-?", argFlag, &printHelp, 0, "print usage information" }, +                                    {} }; -@@ -374,30 +369,62 @@ static void printLinkDest(const std::unique_ptr<LinkDest>& dest) { -   printf("%s", s.c_str()); +-static void printTextString(const GooString *s, const UnicodeMap *uMap) ++static void printStdTextString(const std::string &s, const UnicodeMap *uMap) + { +     char buf[8]; +-    std::vector<Unicode> u = TextStringToUCS4(s->toStr()); ++    const std::vector<Unicode> u = TextStringToUCS4(s); +     for (const auto &c : u) { +         int n = uMap->mapUnicode(c, buf, sizeof(buf)); +         fwrite(buf, 1, n, stdout); +     }   } -+static int StdTextStringToUCS4(const std::string &textStr, Unicode **ucs4) ++static void printTextString(const GooString *s, const UnicodeMap *uMap)  +{ -+  int i, len; -+  const char *s; -+  Unicode *u; -+ -+  len = textStr.size(); -+  s = textStr.c_str(); -+  if (len == 0) { -+    *ucs4 = nullptr; -+    return 0; -+  } -+ -+  if (GooString::hasUnicodeMarker(textStr)) { -+    Unicode *utf16; -+    len = len/2 - 1; -+    if (len > 0) { -+      utf16 = new Unicode[len]; -+      for (i = 0 ; i < len; i++) { -+        utf16[i] = (s[2 + i*2] & 0xff) << 8 | (s[3 + i*2] & 0xff); -+      } -+      len = UTF16toUCS4(utf16, len, &u); -+      delete[] utf16; -+    } else { -+      u = nullptr; -+    } -+  } else { -+    u = (Unicode*)gmallocn(len, sizeof(Unicode)); -+    for (i = 0 ; i < len; i++) { -+      u[i] = pdfDocEncoding[s[i] & 0xff]; -+    } -+  } -+  *ucs4 = u; -+  return len; ++    printStdTextString(s->toStr(), uMap);  +}  + - static void printDestinations(PDFDoc *doc, const UnicodeMap *uMap) { --  std::map<Ref,std::map<GooString*,std::unique_ptr<LinkDest>,GooStringCompare> > map; -+  std::map<Ref, std::map<std::string, std::unique_ptr<LinkDest>>> map; -  -   int numDests = doc->getCatalog()->numDestNameTree(); -   for (int i = 0; i < numDests; i++) { --    GooString *name = new GooString(doc->getCatalog()->getDestNameTreeName(i)); -+    const GooString *name = doc->getCatalog()->getDestNameTreeName(i); -     std::unique_ptr<LinkDest> dest = doc->getCatalog()->getDestNameTreeDest(i); --    if (dest && dest->isPageRef()) { -+    if (name && dest && dest->isPageRef()) { -       Ref pageRef = dest->getPageRef(); --      map[pageRef].insert(std::make_pair(name, std::move(dest))); --    } else { --      delete name; -+      map[pageRef].insert(std::make_pair(name->toStr(), std::move(dest))); + static void printUCS4String(const Unicode *u, int len, const UnicodeMap *uMap) + { +     char buf[8]; +@@ -294,11 +299,6 @@ static void printStruct(const StructElement *element, unsigned indent)       } -   } + } -   numDests = doc->getCatalog()->numDests(); -   for (int i = 0; i < numDests; i++) { --    GooString *name = new GooString(doc->getCatalog()->getDestsName(i)); -+    const char *name = doc->getCatalog()->getDestsName(i); -     std::unique_ptr<LinkDest> dest = doc->getCatalog()->getDestsDest(i); --    if (dest && dest->isPageRef()) { -+    if (name && dest && dest->isPageRef()) { -       Ref pageRef = dest->getPageRef(); -       map[pageRef].insert(std::make_pair(name, std::move(dest))); --    } else { --      delete name; +-struct GooStringCompare +-{ +-    bool operator()(GooString *lhs, GooString *rhs) const { return lhs->cmp(const_cast<GooString *>(rhs)) < 0; } +-}; +- + static void printLinkDest(const std::unique_ptr<LinkDest> &dest) + { +     GooString s; +@@ -369,29 +369,25 @@ static void printLinkDest(const std::unique_ptr<LinkDest> &dest) +  + static void printDestinations(PDFDoc *doc, const UnicodeMap *uMap) + { +-    std::map<Ref, std::map<GooString *, std::unique_ptr<LinkDest>, GooStringCompare>> map; ++    std::map<Ref, std::map<std::string, std::unique_ptr<LinkDest>>> map; +  +     int numDests = doc->getCatalog()->numDestNameTree(); +     for (int i = 0; i < numDests; i++) { +-        GooString *name = new GooString(doc->getCatalog()->getDestNameTreeName(i)); ++        const GooString *name = doc->getCatalog()->getDestNameTreeName(i); +         std::unique_ptr<LinkDest> dest = doc->getCatalog()->getDestNameTreeDest(i); +-        if (dest && dest->isPageRef()) { ++        if (name && dest && dest->isPageRef()) { +             Ref pageRef = dest->getPageRef(); +-            map[pageRef].insert(std::make_pair(name, std::move(dest))); +-        } else { +-            delete name; ++            map[pageRef].insert(std::make_pair(name->toStr(), std::move(dest))); +         }       } -   } -@@ -413,14 +440,13 @@ static void printDestinations(PDFDoc *doc, const UnicodeMap *uMap) { - 	  printf(" \""); - 	  Unicode *u; - 	  char buf[8]; --	  const int len = TextStringToUCS4(it.first, &u); -+	  const int len = StdTextStringToUCS4(it.first, &u); - 	  for (int j = 0; j < len; j++) { - 	    const int n = uMap->mapUnicode(u[j], buf, sizeof(buf)); - 	    fwrite(buf, 1, n, stdout); - 	  } - 	  gfree(u); - 	  printf("\"\n"); --	  delete it.first; - 	} -       } +     numDests = doc->getCatalog()->numDests(); +     for (int i = 0; i < numDests; i++) { +-        GooString *name = new GooString(doc->getCatalog()->getDestsName(i)); ++        const char *name = doc->getCatalog()->getDestsName(i); +         std::unique_ptr<LinkDest> dest = doc->getCatalog()->getDestsDest(i); +-        if (dest && dest->isPageRef()) { ++        if (name && dest && dest->isPageRef()) { +             Ref pageRef = dest->getPageRef(); +             map[pageRef].insert(std::make_pair(name, std::move(dest))); +-        } else { +-            delete name; +         }       } +  +@@ -405,9 +401,8 @@ static void printDestinations(PDFDoc *doc, const UnicodeMap *uMap) +                     printf("%4d ", i); +                     printLinkDest(it.second); +                     printf(" \""); +-                    printTextString(it.first, uMap); ++                    printStdTextString(it.first, uMap); +                     printf("\"\n"); +-                    delete it.first; +                 } +             } +         }  --   GitLab  | 
