Blob Blame History Raw
From 0b74b65ecc0f36d40b8d04a7fa1fa8b5f9d2b3ff Mon Sep 17 00:00:00 2001
From: Chris Liddell <chris.liddell@artifex.com>
Date: Thu, 13 Oct 2022 14:55:28 +0100
Subject: [PATCH] Deal with different VM modes during CIDFont loading

To help differentiate between a substituted CIDFont and an embedded one, a
change was made to store the file path in the CIDFont dictionary. That change
failed to account for the possibility that the file object and the CIDFont
dictionary may not be in compatible VM modes.

This adds code to ensure that the string holding the path is in a suitable VM
mode to be stored into the dictionary.

Reported by Richard Lescak <rlescak@redhat.com>
---
 Resource/Init/gs_cidfn.ps | 23 +++++++++++++++++++----
 1 file changed, 19 insertions(+), 4 deletions(-)

diff --git a/Resource/Init/gs_cidfn.ps b/Resource/Init/gs_cidfn.ps
index 870a2e11c..fa050ed7a 100644
--- a/Resource/Init/gs_cidfn.ps
+++ b/Resource/Init/gs_cidfn.ps
@@ -1,4 +1,4 @@
-% Copyright (C) 2001-2019 Artifex Software, Inc.
+% Copyright (C) 2001-2022 Artifex Software, Inc.
 % All Rights Reserved.
 %
 % This software is provided AS-IS with no warranty, either express or
@@ -36,6 +36,17 @@
 
 30 dict begin
 
+/.gcompatstringcopy % <string> <global> .gcompatstringcopy <string>
+{
+   dup 2 index gcheck eq
+   { pop }
+   {
+       currentglobal 3 1 roll setglobal
+       dup length string copy
+       exch setglobal
+   } ifelse
+} bind def
+
 % The key in .cidfonttypes is the CIDFontType value;
 % the value is a procedure that takes a font name and the CIDFont dictionary
 % and replaces the latter with a real font.
@@ -58,7 +69,7 @@ dup 0 {
     end
   } if
   1 index exch .buildfont9
-  .currentresourcefile dup type /filetype eq { //.filename {1 index exch /ResourcePath exch put} if }{ pop} ifelse
+  .currentresourcefile dup type /filetype eq { //.filename {1 index gcheck //.gcompatstringcopy exec 1 index exch /ResourcePath exch put} if }{ pop} ifelse
   exch pop
 } put % Don't bind it here, because gs_fapi.ps redefines .buildfont9
 
@@ -138,10 +149,11 @@ dup 0 {
 
 % ------ CIDFontType 1 (FontType 10) ------ %
 
+
 dup 1 {
   10 //.checkfonttype exec pop
   1 index exch .buildfont10
-  .currentresourcefile dup type /filetype eq { //.filename {1 index exch /ResourcePath exch put} if }{ pop} ifelse
+  .currentresourcefile dup type /filetype eq { //.filename {1 index gcheck //.gcompatstringcopy exec 1 index exch /ResourcePath exch put} if }{ pop} ifelse
   exch pop
 } put % Don't bind it here because gs_fapi.ps redefines .buildfont10
 
@@ -150,12 +162,15 @@ dup 1 {
 dup 2 {
   11 //.checkfonttype exec pop
   1 index exch .buildfont11
-  .currentresourcefile dup type /filetype eq { //.filename {1 index exch /ResourcePath exch put} if }{ pop} ifelse
+  .currentresourcefile dup type /filetype eq { //.filename {1 index gcheck //.gcompatstringcopy exec 1 index exch /ResourcePath exch put} if }{ pop} ifelse
   exch pop
 } put % Don't bind it here because gs_fapi.ps redefines .buildfont11
 
+currentdict /.gcompatstringcopy .undef
+
 pop		% .cidfonttypes
 
+
 % ---------------- Reading CIDFontType 0 files ---------------- %
 
 /StartData {		% <(Binary)|(Hex)> <datalength> StartData -
-- 
2.37.3