Blame SOURCES/ghostscript-cve-2019-14817.patch

dbb3ab
From be86d2ff2f0f0ea0e365707f3be0fa0c9e7315ee Mon Sep 17 00:00:00 2001
dbb3ab
From: Ray Johnston <ray.johnston@artifex.com>
dbb3ab
Date: Mon, 18 Feb 2019 12:11:45 -0800
dbb3ab
Subject: [PATCH 1/2] Bug 700599: Issue an error message if an ExtGstate is not
dbb3ab
 found.
dbb3ab
dbb3ab
Previously, this was silently ignored. Only issue a single warning,
dbb3ab
and respect PDFSTOPONERROR to prevent continuing with potentially
dbb3ab
incorrect output.
dbb3ab
dbb3ab
Note that tests_private/pdf/uploads/bug696410.pdf also now gets this
dbb3ab
error message (ExtGState" instead of ExtGState in object 10).
dbb3ab
---
dbb3ab
 Resource/Init/pdf_draw.ps | 11 ++++++++++-
dbb3ab
 1 file changed, 10 insertions(+), 1 deletion(-)
dbb3ab
dbb3ab
diff --git a/Resource/Init/pdf_draw.ps b/Resource/Init/pdf_draw.ps
dbb3ab
index 1add3f7..6a2773a 100644
dbb3ab
--- a/Resource/Init/pdf_draw.ps
dbb3ab
+++ b/Resource/Init/pdf_draw.ps
dbb3ab
@@ -494,7 +494,16 @@ end
dbb3ab
     dup {
dbb3ab
       oforce exch gsparamdict exch .knownget { exec } { pop } ifelse
dbb3ab
     } forall pop
dbb3ab
-  } if
dbb3ab
+  } {
dbb3ab
+    //pdfdict /.gs_warning_issued known not {
dbb3ab
+      (\n   **** Error 'gs' ignored -- ExtGState missing from Resources.\n)
dbb3ab
+      pdfformaterror
dbb3ab
+      (        Output may be incorrect.\n) pdfformaterror
dbb3ab
+      //pdfdict /.gs_warning_issued //true .forceput
dbb3ab
+      PDFSTOPONERROR { /gs /undefined signalerror } if
dbb3ab
+    } if
dbb3ab
+  }
dbb3ab
+  ifelse
dbb3ab
 } bind executeonly def
dbb3ab
 
dbb3ab
 % ------ Transparency support ------ %
dbb3ab
-- 
dbb3ab
2.20.1
dbb3ab
dbb3ab
dbb3ab
From cd1b1cacadac2479e291efe611979bdc1b3bdb19 Mon Sep 17 00:00:00 2001
dbb3ab
From: Ken Sharp <ken.sharp@artifex.com>
dbb3ab
Date: Wed, 21 Aug 2019 10:10:51 +0100
dbb3ab
Subject: [PATCH 2/2] PDF interpreter - review .forceput security
dbb3ab
dbb3ab
Bug #701450 "Safer Mode Bypass by .forceput Exposure in .pdfexectoken"
dbb3ab
dbb3ab
By abusing the error handler it was possible to get the PDFDEBUG portion
dbb3ab
of .pdfexectoken, which uses .forceput left readable.
dbb3ab
dbb3ab
Add an executeonly appropriately to make sure that clause isn't readable
dbb3ab
no mstter what.
dbb3ab
dbb3ab
Review all the uses of .forceput searching for similar cases, add
dbb3ab
executeonly as required to secure those. All cases in the PostScript
dbb3ab
support files seem to be covered already.
dbb3ab
---
dbb3ab
 Resource/Init/pdf_base.ps |  2 +-
dbb3ab
 Resource/Init/pdf_draw.ps | 14 +++++++-------
dbb3ab
 Resource/Init/pdf_font.ps | 23 ++++++++++++-----------
dbb3ab
 Resource/Init/pdf_main.ps |  6 +++---
dbb3ab
 Resource/Init/pdf_ops.ps  | 11 ++++++-----
dbb3ab
 5 files changed, 29 insertions(+), 27 deletions(-)
dbb3ab
dbb3ab
diff --git a/Resource/Init/pdf_base.ps b/Resource/Init/pdf_base.ps
dbb3ab
index d3c3a5f..5dabe4d 100644
dbb3ab
--- a/Resource/Init/pdf_base.ps
dbb3ab
+++ b/Resource/Init/pdf_base.ps
dbb3ab
@@ -154,7 +154,7 @@ currentdict /num-chars-dict .undef
dbb3ab
     {
dbb3ab
       dup ==only () = flush
dbb3ab
     } ifelse % PDFSTEP
dbb3ab
-  } if % PDFDEBUG
dbb3ab
+  } executeonly if % PDFDEBUG
dbb3ab
   2 copy .knownget {
dbb3ab
     exch pop exch pop exch pop exec
dbb3ab
   } {
dbb3ab
diff --git a/Resource/Init/pdf_draw.ps b/Resource/Init/pdf_draw.ps
dbb3ab
index 6a2773a..068ba7c 100644
dbb3ab
--- a/Resource/Init/pdf_draw.ps
dbb3ab
+++ b/Resource/Init/pdf_draw.ps
dbb3ab
@@ -501,8 +501,8 @@ end
dbb3ab
       (        Output may be incorrect.\n) pdfformaterror
dbb3ab
       //pdfdict /.gs_warning_issued //true .forceput
dbb3ab
       PDFSTOPONERROR { /gs /undefined signalerror } if
dbb3ab
-    } if
dbb3ab
-  }
dbb3ab
+    } executeonly if
dbb3ab
+  } executeonly
dbb3ab
   ifelse
dbb3ab
 } bind executeonly def
dbb3ab
 
dbb3ab
@@ -1127,7 +1127,7 @@ currentdict end readonly def
dbb3ab
           .setglobal
dbb3ab
           pdfformaterror
dbb3ab
         } executeonly ifelse
dbb3ab
-      }
dbb3ab
+      } executeonly
dbb3ab
       {
dbb3ab
         currentglobal //pdfdict gcheck .setglobal
dbb3ab
         //pdfdict /.Qqwarning_issued //true .forceput
dbb3ab
@@ -1135,8 +1135,8 @@ currentdict end readonly def
dbb3ab
         pdfformaterror
dbb3ab
       } executeonly ifelse
dbb3ab
       end
dbb3ab
-    } ifelse
dbb3ab
-  } loop
dbb3ab
+    } executeonly ifelse
dbb3ab
+  } executeonly loop
dbb3ab
   {
dbb3ab
     (\n   **** Error: File has unbalanced q/Q operators \(too many q's\)\n               Output may be incorrect.\n)
dbb3ab
     //pdfdict /.Qqwarning_issued .knownget
dbb3ab
@@ -1150,14 +1150,14 @@ currentdict end readonly def
dbb3ab
         .setglobal
dbb3ab
         pdfformaterror
dbb3ab
       } executeonly ifelse
dbb3ab
-    }
dbb3ab
+    } executeonly
dbb3ab
     {
dbb3ab
       currentglobal //pdfdict gcheck .setglobal
dbb3ab
       //pdfdict /.Qqwarning_issued //true .forceput
dbb3ab
       .setglobal
dbb3ab
       pdfformaterror
dbb3ab
     } executeonly ifelse
dbb3ab
-  } if
dbb3ab
+  } executeonly if
dbb3ab
   pop
dbb3ab
 
dbb3ab
   % restore pdfemptycount
dbb3ab
diff --git a/Resource/Init/pdf_font.ps b/Resource/Init/pdf_font.ps
dbb3ab
index 8b8fef8..86b1870 100644
dbb3ab
--- a/Resource/Init/pdf_font.ps
dbb3ab
+++ b/Resource/Init/pdf_font.ps
dbb3ab
@@ -677,7 +677,7 @@ currentdict end readonly def
dbb3ab
                 currentglobal 2 index dup gcheck setglobal
dbb3ab
                 /FontInfo 5 dict dup 5 1 roll .forceput
dbb3ab
                 setglobal
dbb3ab
-              } if
dbb3ab
+              } executeonly if
dbb3ab
               dup /GlyphNames2Unicode .knownget not {
dbb3ab
                 //true                        % No existing G2U, make one
dbb3ab
               } {
dbb3ab
@@ -701,9 +701,9 @@ currentdict end readonly def
dbb3ab
         } if
dbb3ab
         PDFDEBUG {
dbb3ab
           (.processToUnicode end) =
dbb3ab
-        } if
dbb3ab
-      } if
dbb3ab
-    } stopped
dbb3ab
+        } executeonly if
dbb3ab
+      } executeonly if
dbb3ab
+    } executeonly stopped
dbb3ab
     {
dbb3ab
       .dstackdepth 1 countdictstack 1 sub
dbb3ab
       {pop end} for
dbb3ab
@@ -1225,19 +1225,20 @@ currentdict /eexec_pdf_param_dict .undef
dbb3ab
                 //pdfdict /.Qqwarning_issued //true .forceput
dbb3ab
               } executeonly if
dbb3ab
               Q
dbb3ab
-            } repeat
dbb3ab
+            } executeonly repeat
dbb3ab
             Q
dbb3ab
-          } PDFfile fileposition 2 .execn % Keep pdfcount valid.
dbb3ab
+          } executeonly PDFfile fileposition 2 .execn % Keep pdfcount valid.
dbb3ab
           PDFfile exch setfileposition
dbb3ab
-        } ifelse
dbb3ab
-      } {
dbb3ab
+        } executeonly ifelse
dbb3ab
+      } executeonly
dbb3ab
+      {
dbb3ab
         % PDF Type 3 fonts don't use .notdef
dbb3ab
         % d1 implementation adjusts the width as needed
dbb3ab
         0 0 0 0 0 0
dbb3ab
         pdfopdict /d1 get exec
dbb3ab
       } ifelse
dbb3ab
       end end
dbb3ab
-    } bdef
dbb3ab
+    } executeonly bdef
dbb3ab
     dup currentdict Encoding .processToUnicode
dbb3ab
     currentdict end .completefont exch pop
dbb3ab
 } bind executeonly odef
dbb3ab
@@ -2022,9 +2023,9 @@ currentdict /CMap_read_dict undef
dbb3ab
           (Will continue, but content may be missing.) = flush
dbb3ab
         } ifelse
dbb3ab
       } if
dbb3ab
-    } if
dbb3ab
+    } executeonly if
dbb3ab
     /findresource cvx /undefined signalerror
dbb3ab
-  } loop
dbb3ab
+  } executeonly loop
dbb3ab
 } bind executeonly odef
dbb3ab
 
dbb3ab
 /buildCIDType0 {	% <CIDFontType0-font-resource> buildCIDType0 <font>
dbb3ab
diff --git a/Resource/Init/pdf_main.ps b/Resource/Init/pdf_main.ps
dbb3ab
index e44288e..ecde3d4 100644
dbb3ab
--- a/Resource/Init/pdf_main.ps
dbb3ab
+++ b/Resource/Init/pdf_main.ps
dbb3ab
@@ -2696,15 +2696,15 @@ currentdict /PDF2PS_matrix_key undef
dbb3ab
           .setglobal
dbb3ab
           pdfformaterror
dbb3ab
         } executeonly ifelse
dbb3ab
-      }
dbb3ab
+      } executeonly
dbb3ab
       {
dbb3ab
         currentglobal //pdfdict gcheck .setglobal
dbb3ab
         //pdfdict /.Qqwarning_issued //true .forceput
dbb3ab
         .setglobal
dbb3ab
         pdfformaterror
dbb3ab
       } executeonly ifelse
dbb3ab
-    } if
dbb3ab
-  } if
dbb3ab
+    } executeonly if
dbb3ab
+  } executeonly if
dbb3ab
   pop
dbb3ab
   count PDFexecstackcount sub { pop } repeat
dbb3ab
   (after exec) VMDEBUG
dbb3ab
diff --git a/Resource/Init/pdf_ops.ps b/Resource/Init/pdf_ops.ps
dbb3ab
index c2e7461..12d5a66 100644
dbb3ab
--- a/Resource/Init/pdf_ops.ps
dbb3ab
+++ b/Resource/Init/pdf_ops.ps
dbb3ab
@@ -186,14 +186,14 @@ currentdict /gput_always_allow .undef
dbb3ab
         .setglobal
dbb3ab
         pdfformaterror
dbb3ab
       } executeonly ifelse
dbb3ab
-    }
dbb3ab
+    } executeonly
dbb3ab
     {
dbb3ab
       currentglobal //pdfdict gcheck .setglobal
dbb3ab
       //pdfdict /.Qqwarning_issued //true .forceput
dbb3ab
       .setglobal
dbb3ab
       pdfformaterror
dbb3ab
     } executeonly ifelse
dbb3ab
-  } if
dbb3ab
+  } executeonly if
dbb3ab
 } bind executeonly odef
dbb3ab
 
dbb3ab
 % Save PDF gstate
dbb3ab
@@ -440,11 +440,12 @@ currentdict /gput_always_allow .undef
dbb3ab
   dup type /booleantype eq {
dbb3ab
     .currentSMask type /dicttype eq {
dbb3ab
       .currentSMask /Processed 2 index .forceput
dbb3ab
+    } executeonly
dbb3ab
+    {
dbb3ab
+      .setSMask
dbb3ab
+    }ifelse
dbb3ab
   } executeonly
dbb3ab
   {
dbb3ab
-      .setSMask
dbb3ab
-  }ifelse
dbb3ab
-  }{
dbb3ab
   .setSMask
dbb3ab
   }ifelse
dbb3ab
 
dbb3ab
-- 
dbb3ab
2.20.1
dbb3ab