Package: libpoppler4
Version: 0.10.6-1
Severity: normal

poppler uses the strtok() function, while it's not safe to do so in a multi-threaded application (or in a library aimed to be used in a multi-threaded applications).

The attached patch fixes the problem.

--
Jakub Wilk
diff --git a/fofi/FoFiType1.cc b/fofi/FoFiType1.cc
--- a/fofi/FoFiType1.cc
+++ b/fofi/FoFiType1.cc
@@ -192,6 +192,7 @@
   char buf[256];
   char c;
   int n, code, i, j;
+  char *tokptr;
 
   for (i = 1, line = (char *)file;
        i <= 100 && line && (!name || !encoding);
@@ -202,7 +203,7 @@
       strncpy(buf, line, 255);
       buf[255] = '\0';
       if ((p = strchr(buf+9, '/')) &&
-	  (p = strtok(p+1, " \t\n\r"))) {
+	  (p = strtok_r(p+1, " \t\n\r", &tokptr))) {
 	name = copyString(p);
       }
       line = getNextLine(line);
@@ -270,8 +271,8 @@
 	    }
 	  }
 	} else {
-	  if (strtok(buf, " \t") &&
-	      (p = strtok(NULL, " \t\n\r")) && !strcmp(p, "def")) {
+	  if (strtok_r(buf, " \t", &tokptr) &&
+	      (p = strtok_r(NULL, " \t\n\r", &tokptr)) && !strcmp(p, "def")) {
 	    break;
 	  }
 	}
diff --git a/poppler/CharCodeToUnicode.cc b/poppler/CharCodeToUnicode.cc
--- a/poppler/CharCodeToUnicode.cc
+++ b/poppler/CharCodeToUnicode.cc
@@ -124,6 +124,7 @@
   Unicode *uBuf = (Unicode *)gmallocn(uBufSize, sizeof(Unicode));
   CharCodeToUnicode *ctu;
   int line, n, i;
+  char *tokptr;
 
   if (!(f = fopen(fileName->getCString(), "r"))) {
     gfree(uBuf);
@@ -142,14 +143,14 @@
   line = 0;
   while (getLine(buf, sizeof(buf), f)) {
     ++line;
-    if (!(tok = strtok(buf, " \t\r\n")) ||
+    if (!(tok = strtok_r(buf, " \t\r\n", &tokptr)) ||
 	sscanf(tok, "%x", &u0) != 1) {
       error(-1, "Bad line (%d) in unicodeToUnicode file '%s'",
 	    line, fileName->getCString());
       continue;
     }
     n = 0;
-    while ((tok = strtok(NULL, " \t\r\n"))) {
+    while ((tok = strtok_r(NULL, " \t\r\n", &tokptr))) {
       if (n >= uBufSize)
       {
         uBufSize += 8;
diff --git a/poppler/GlobalParams.cc b/poppler/GlobalParams.cc
--- a/poppler/GlobalParams.cc
+++ b/poppler/GlobalParams.cc
@@ -712,6 +712,7 @@
   char buf[256];
   int line;
   Unicode u;
+  char *tokptr;
 
   if (!(f = fopen(name->getCString(), "r"))) {
     error(-1, "Couldn't open 'nameToUnicode' file '%s'",
@@ -720,8 +721,8 @@
   }
   line = 1;
   while (getLine(buf, sizeof(buf), f)) {
-    tok1 = strtok(buf, " \t\r\n");
-    tok2 = strtok(NULL, " \t\r\n");
+    tok1 = strtok_r(buf, " \t\r\n", &tokptr);
+    tok2 = strtok_r(NULL, " \t\r\n", &tokptr);
     if (tok1 && tok2) {
       sscanf(tok1, "%x", &u);
       nameToUnicode->add(tok2, u);
diff --git a/poppler/PDFDoc.cc b/poppler/PDFDoc.cc
--- a/poppler/PDFDoc.cc
+++ b/poppler/PDFDoc.cc
@@ -310,6 +310,7 @@
 void PDFDoc::checkHeader() {
   char hdrBuf[headerSearchSize+1];
   char *p;
+  char *tokptr;
   int i;
 
   pdfVersion = 0;
@@ -327,7 +328,7 @@
     return;
   }
   str->moveStart(i);
-  if (!(p = strtok(&hdrBuf[i+5], " \t\n\r"))) {
+  if (!(p = strtok_r(&hdrBuf[i+5], " \t\n\r", &tokptr))) {
     error(-1, "May not be a PDF file (continuing anyway)");
     return;
   }
diff --git a/poppler/UnicodeMap.cc b/poppler/UnicodeMap.cc
--- a/poppler/UnicodeMap.cc
+++ b/poppler/UnicodeMap.cc
@@ -43,6 +43,7 @@
   char buf[256];
   int line, nBytes, i, x;
   char *tok1, *tok2, *tok3;
+  char *tokptr;
 
   if (!(f = globalParams->getUnicodeMapFile(encodingNameA))) {
     error(-1, "Couldn't find unicodeMap file for the '%s' encoding",
@@ -58,9 +59,9 @@
 
   line = 1;
   while (getLine(buf, sizeof(buf), f)) {
-    if ((tok1 = strtok(buf, " \t\r\n")) &&
-	(tok2 = strtok(NULL, " \t\r\n"))) {
-      if (!(tok3 = strtok(NULL, " \t\r\n"))) {
+    if ((tok1 = strtok_r(buf, " \t\r\n", &tokptr)) &&
+	(tok2 = strtok_r(NULL, " \t\r\n", &tokptr))) {
+      if (!(tok3 = strtok_r(NULL, " \t\r\n", &tokptr))) {
 	tok3 = tok2;
 	tok2 = tok1;
       }

Reply via email to