01c841
From: Ken Sharp <ken.sharp@artifex.com>
01c841
Date: Thu, 23 Aug 2018 13:12:48 +0000 (+0100)
01c841
Subject: Fix Bug 699660 "shading_param incomplete type checking"
01c841
01c841
Fix Bug 699660 "shading_param incomplete type checking"
01c841
01c841
Its possible to pass a t_struct parameter to .shfill which is not a
01c841
shading function built by .buildshading. This could then lead to memory
01c841
corruption or a segmentation fault by treating the object passed in
01c841
as if it were a shading.
01c841
01c841
Its non-trivial to check the t_struct, because this function can take
01c841
7 different kinds of structures as a parameter. Checking these is
01c841
possible, of course, but would add a performance penalty.
01c841
01c841
However, we can note that we never call .shfill without first calling
01c841
.buildshading, and we never call .buildshading without immediately
01c841
calling .shfill. So we can treat these as an atomic operation. The
01c841
.buildshading function takes all its parameters as PostScript objects
01c841
and validates them, so that should be safe.
01c841
01c841
This allows us to 'hide' the .shfill operator preventing the possibility
01c841
of passing an invalid parameter.
01c841
01c841
https://git.ghostscript.com/?p=ghostpdl.git;a=commit;h=0b6cd1918e1ec4ffd087400a754a845180a4522b
01c841
01c841
From: Ken Sharp <ken.sharp@artifex.com>
01c841
Date: Fri, 24 Aug 2018 11:44:26 +0000 (+0100)
01c841
Subject: Hide the .shfill operator
01c841
01c841
Hide the .shfill operator
01c841
01c841
Commit 0b6cd1918e1ec4ffd087400a754a845180a4522b was supposed to make
01c841
the .shfill operator unobtainable, but I accidentally left a comment
01c841
in the line doing so.
01c841
01c841
Fix it here, without this the operator can still be exploited.
01c841
01c841
https://git.ghostscript.com/?p=ghostpdl.git;a=commit;h=e01e77a36cbb2e0277bc3a63852244bec41be0f6
01c841
---
01c841
1164f7
diff -up ghostscript-9.07/Resource/Init/gs_init.ps.cve-2018-15909 ghostscript-9.07/Resource/Init/gs_init.ps
1164f7
--- ghostscript-9.07/Resource/Init/gs_init.ps.cve-2018-15909	2018-12-10 11:23:36.732179705 +0100
1164f7
+++ ghostscript-9.07/Resource/Init/gs_init.ps	2018-12-10 11:23:36.738179607 +0100
01c841
@@ -2136,8 +2136,8 @@ SAFER { .setsafe } if
01c841
 /.getiodevice /.getdevparms /.putdevparams /.bbox_transform /.matchmedia /.matchpagesize /.defaultpapersize
01c841
 /.oserrno /.setoserrno /.oserrorstring /.getCPSImode
01c841
 /.getscanconverter /.setscanconverter /.type1encrypt /.type1decrypt/.languagelevel /.setlanguagelevel /.eqproc /.fillpage /.buildpattern1 /.saslprep
01c841
-/.buildshading1 /.buildshadin2 /.buildshading3 /.buildshading4 /.buildshading5 /.buildshading6 /.buildshading7 /.buildshadingpattern
01c841
-/.argindex /.bytestring /.namestring /.stringbreak /.stringmatch /.globalvmarray /.globalvmdict /.globalvmpackedarray /.globalvmstring
01c841
+/.buildshading1 /.buildshading2 /.buildshading3 /.buildshading4 /.buildshading5 /.buildshading6 /.buildshading7 /.buildshadingpattern
01c841
+/.shfill /.argindex /.bytestring /.namestring /.stringbreak /.stringmatch /.globalvmarray /.globalvmdict /.globalvmpackedarray /.globalvmstring
01c841
 /.localvmarray /.localvmdict /.localvmpackedarray /.localvmstring /.systemvmarray /.systemvmdict /.systemvmpackedarray /.systemvmstring /.systemvmfile /.systemvmlibfile
01c841
 /.systemvmSFD /.settrapparams /.currentsystemparams /.currentuserparams /.getsystemparam /.getuserparam /.setsystemparams /.setuserparams
01c841
 /.checkpassword /.locale_to_utf8 /.currentglobal /.gcheck /.imagepath
1164f7
diff -up ghostscript-9.07/Resource/Init/gs_ll3.ps.cve-2018-15909 ghostscript-9.07/Resource/Init/gs_ll3.ps
1164f7
--- ghostscript-9.07/Resource/Init/gs_ll3.ps.cve-2018-15909	2013-02-14 08:58:16.000000000 +0100
1164f7
+++ ghostscript-9.07/Resource/Init/gs_ll3.ps	2018-12-10 11:23:36.739179591 +0100
01c841
@@ -406,6 +406,11 @@ systemdict /.reuseparamdict mark
01c841
     /shfill .systemvar /undefined signalerror
01c841
   } ifelse
01c841
 } bind def
01c841
+
01c841
+/.buildshading_and_shfill {
01c841
+  .buildshading .shfill
01c841
+} bind def
01c841
+
01c841
 systemdict /.reuseparamdict undef
01c841
 
01c841
 /.buildpattern2 {	% <template> <matrix> .buildpattern2
01c841
@@ -430,7 +435,7 @@ systemdict /.reuseparamdict undef
01c841
         % Currently, .shfill requires that the color space
01c841
         % in the pattern be the current color space.
01c841
         % Disable overprintmode for shfill
01c841
-  { dup gsave 0 .setoverprintmode .buildshading .shfill } stopped
01c841
+  { dup gsave 0 .setoverprintmode .buildshading_and_shfill } stopped
01c841
   grestore {
01c841
     /$error .systemvar /errorinfo 2 copy known {
01c841
       pop pop
1164f7
diff -up ghostscript-9.07/Resource/Init/pdf_draw.ps.cve-2018-15909 ghostscript-9.07/Resource/Init/pdf_draw.ps
1164f7
--- ghostscript-9.07/Resource/Init/pdf_draw.ps.cve-2018-15909	2013-02-14 08:58:16.000000000 +0100
1164f7
+++ ghostscript-9.07/Resource/Init/pdf_draw.ps	2018-12-10 11:32:31.155445637 +0100
1164f7
@@ -1131,9 +1131,8 @@ drawopdict begin
01c841
             exch
01c841
             pop
01c841
           } {
01c841
-           .buildshading
01c841
+           .buildshading_and_shfill
01c841
           } ifelse
1164f7
-          .shfill 
01c841
         } stopped { 
1164f7
           pop 
1164f7
           (   **** Warning: Dropping incorrect smooth shading object.\n)