<pre style='margin:0'>
Perry E. Metzger (pmetzger) pushed a commit to branch master
in repository macports-ports.

</pre>
<p><a href="https://github.com/macports/macports-ports/commit/a5499b64c5c321c27d95bfab2bfee5b8fec526ac">https://github.com/macports/macports-ports/commit/a5499b64c5c321c27d95bfab2bfee5b8fec526ac</a></p>
<pre style="white-space: pre; background: #F8F8F8">The following commit(s) were added to refs/heads/master by this push:
<span style='display:block; white-space:pre;color:#404040;'>     new a5499b64c5c ghostscript: Apply patch for CVE-2021-3781
</span>a5499b64c5c is described below

<span style='display:block; white-space:pre;color:#808000;'>commit a5499b64c5c321c27d95bfab2bfee5b8fec526ac
</span>Author: Clemens Lang <cal@macports.org>
AuthorDate: Fri Sep 10 14:01:54 2021 +0200

<span style='display:block; white-space:pre;color:#404040;'>    ghostscript: Apply patch for CVE-2021-3781
</span>---
 print/ghostscript/Portfile                       |   6 +-
 print/ghostscript/files/patch-cve-2021-3781.diff | 232 +++++++++++++++++++++++
 2 files changed, 237 insertions(+), 1 deletion(-)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/print/ghostscript/Portfile b/print/ghostscript/Portfile
</span><span style='display:block; white-space:pre;color:#808080;'>index 0fe6cc0623f..28c9d108320 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/print/ghostscript/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/print/ghostscript/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -5,7 +5,7 @@ PortGroup           muniversal 1.0
</span> 
 name                ghostscript
 version             9.54.0
<span style='display:block; white-space:pre;background:#ffe0e0;'>-revision            0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+revision            1
</span> categories          print
 license             AGPL-3 BSD
 maintainers         nomaintainer
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -43,6 +43,10 @@ patchfiles-append   patch-configure.ac.diff
</span> # https://trac.macports.org/ticket/63105
 patchfiles-append   patch-base_scommon.h.diff
 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+# Fix for CVE-2021-3781
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# https://git.ghostscript.com/?p=ghostpdl.git;a=commitdiff;h=a9bd3dec9fde
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+patchfiles-append   patch-cve-2021-3781.diff
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> checksums           ghostpdl-9.54.0.tar.gz \
                     rmd160  a48ecd441c761a9401a5e4a34ea90afd6936d419 \
                     sha256  63e54cddcdf48ea296b6315353f86b8a622d4e46959b10d536297e006b85687b \
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/print/ghostscript/files/patch-cve-2021-3781.diff b/print/ghostscript/files/patch-cve-2021-3781.diff
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 00000000000..a61d8e6f4c6
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/print/ghostscript/files/patch-cve-2021-3781.diff
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,232 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From a9bd3dec9fde03327a4a2c69dad1036bf9632e20 Mon Sep 17 00:00:00 2001
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From: Chris Liddell <chris.liddell@artifex.com>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Date: Tue, 7 Sep 2021 20:36:12 +0100
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH] Bug 704342: Include device specifier strings in access
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ validation
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+for the "%pipe%", %handle%" and %printer% io devices.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+We previously validated only the part after the "%pipe%" Postscript device
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+specifier, but this proved insufficient.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+This rebuilds the original file name string, and validates it complete. The
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+slight complication for "%pipe%" is it can be reached implicitly using
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+"|" so we have to check both prefixes.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Addresses CVE-2021-3781
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+---
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ base/gdevpipe.c | 22 +++++++++++++++-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ base/gp_mshdl.c | 11 +++++++-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ base/gp_msprn.c | 10 ++++++-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ base/gp_os2pr.c | 13 +++++++++-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ base/gslibctx.c | 69 ++++++++++---------------------------------------
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 5 files changed, 65 insertions(+), 60 deletions(-)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/base/gdevpipe.c b/base/gdevpipe.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 96d71f5d8..5bdc485be 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- ./base/gdevpipe.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ ./base/gdevpipe.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -72,8 +72,28 @@ pipe_fopen(gx_io_device * iodev, const char *fname, const char *access,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     gs_lib_ctx_t *ctx = mem->gs_lib_ctx;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     gs_fs_list_t *fs = ctx->core->fs;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    /* The pipe device can be reached in two ways, explicltly with %pipe%
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++       or implicitly with "|", so we have to check for both
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++     */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    char f[gp_file_name_sizeof];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    const char *pipestr = "|";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    const size_t pipestrlen = strlen(pipestr);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    const size_t preflen = strlen(iodev->dname);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    const size_t nlen = strlen(fname);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    int code1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (preflen + nlen >= gp_file_name_sizeof)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        return_error(gs_error_invalidaccess);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    memcpy(f, iodev->dname, preflen);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    memcpy(f + preflen, fname, nlen + 1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    code1 = gp_validate_path(mem, f, access);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    memcpy(f, pipestr, pipestrlen);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    memcpy(f + pipestrlen, fname, nlen + 1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    if (gp_validate_path(mem, fname, access) != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (code1 != 0 && gp_validate_path(mem, f, access) != 0 )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         return gs_error_invalidfileaccess;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     /*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/base/gp_mshdl.c b/base/gp_mshdl.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 2b964ed74..8d87ceadc 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- ./base/gp_mshdl.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ ./base/gp_mshdl.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -95,8 +95,17 @@ mswin_handle_fopen(gx_io_device * iodev, const char *fname, const char *access,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     long hfile;   /* Correct for Win32, may be wrong for Win64 */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     gs_lib_ctx_t *ctx = mem->gs_lib_ctx;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     gs_fs_list_t *fs = ctx->core->fs;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    char f[gp_file_name_sizeof];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    const size_t preflen = strlen(iodev->dname);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    const size_t nlen = strlen(fname);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    if (gp_validate_path(mem, fname, access) != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (preflen + nlen >= gp_file_name_sizeof)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        return_error(gs_error_invalidaccess);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    memcpy(f, iodev->dname, preflen);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    memcpy(f + preflen, fname, nlen + 1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (gp_validate_path(mem, f, access) != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         return gs_error_invalidfileaccess;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     /* First we try the open_handle method. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/base/gp_msprn.c b/base/gp_msprn.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index ed4827968..746a974f7 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- ./base/gp_msprn.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ ./base/gp_msprn.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -168,8 +168,16 @@ mswin_printer_fopen(gx_io_device * iodev, const char *fname, const char *access,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     uintptr_t *ptid = &((tid_t *)(iodev->state))->tid;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     gs_lib_ctx_t *ctx = mem->gs_lib_ctx;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     gs_fs_list_t *fs = ctx->core->fs;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    const size_t preflen = strlen(iodev->dname);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    const size_t nlen = strlen(fname);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    if (gp_validate_path(mem, fname, access) != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (preflen + nlen >= gp_file_name_sizeof)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        return_error(gs_error_invalidaccess);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    memcpy(pname, iodev->dname, preflen);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    memcpy(pname + preflen, fname, nlen + 1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (gp_validate_path(mem, pname, access) != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         return gs_error_invalidfileaccess;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     /* First we try the open_printer method. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/base/gp_os2pr.c b/base/gp_os2pr.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index f852c71fc..ba54cde66 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- ./base/gp_os2pr.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ ./base/gp_os2pr.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -107,9 +107,20 @@ os2_printer_fopen(gx_io_device * iodev, const char *fname, const char *access,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            FILE ** pfile, char *rfname, uint rnamelen)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     os2_printer_t *pr = (os2_printer_t *)iodev->state;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    char driver_name[256];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    char driver_name[gp_file_name_sizeof];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     gs_lib_ctx_t *ctx = mem->gs_lib_ctx;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     gs_fs_list_t *fs = ctx->core->fs;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    const size_t preflen = strlen(iodev->dname);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    const int size_t = strlen(fname);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (preflen + nlen >= gp_file_name_sizeof)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        return_error(gs_error_invalidaccess);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    memcpy(driver_name, iodev->dname, preflen);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    memcpy(driver_name + preflen, fname, nlen + 1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (gp_validate_path(mem, driver_name, access) != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        return gs_error_invalidfileaccess;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     /* First we try the open_printer method. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     /* Note that the loop condition here ensures we don't
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/base/gslibctx.c b/base/gslibctx.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 6dfed6cd5..318039fad 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- ./base/gslibctx.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ ./base/gslibctx.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -655,82 +655,39 @@ rewrite_percent_specifiers(char *s)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ gs_add_outputfile_control_path(gs_memory_t *mem, const char *fname)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    char *fp, f[gp_file_name_sizeof];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    const int pipe = 124; /* ASCII code for '|' */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    const int len = strlen(fname);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    int i, code;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    char f[gp_file_name_sizeof];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    int code;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     /* Be sure the string copy will fit */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    if (len >= gp_file_name_sizeof)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (strlen(fname) >= gp_file_name_sizeof)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         return gs_error_rangecheck;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     strcpy(f, fname);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    fp = f;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     /* Try to rewrite any %d (or similar) in the string */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     rewrite_percent_specifiers(f);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    for (i = 0; i < len; i++) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        if (f[i] == pipe) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-           fp = &f[i + 1];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-           /* Because we potentially have to check file permissions at two levels
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-              for the output file (gx_device_open_output_file and the low level
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-              fopen API, if we're using a pipe, we have to add both the full string,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-              (including the '|', and just the command to which we pipe - since at
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-              the pipe_fopen(), the leading '|' has been stripped.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-           code = gs_add_control_path(mem, gs_permit_file_writing, f);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-           if (code < 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-               return code;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-           code = gs_add_control_path(mem, gs_permit_file_control, f);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-           if (code < 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-               return code;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-           break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        if (!IS_WHITESPACE(f[i]))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    code = gs_add_control_path(mem, gs_permit_file_control, fp);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    code = gs_add_control_path(mem, gs_permit_file_control, f);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (code < 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         return code;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    return gs_add_control_path(mem, gs_permit_file_writing, fp);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return gs_add_control_path(mem, gs_permit_file_writing, f);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ gs_remove_outputfile_control_path(gs_memory_t *mem, const char *fname)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    char *fp, f[gp_file_name_sizeof];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    const int pipe = 124; /* ASCII code for '|' */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    const int len = strlen(fname);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    int i, code;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    char f[gp_file_name_sizeof];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    int code;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     /* Be sure the string copy will fit */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    if (len >= gp_file_name_sizeof)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (strlen(fname) >= gp_file_name_sizeof)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         return gs_error_rangecheck;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     strcpy(f, fname);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    fp = f;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     /* Try to rewrite any %d (or similar) in the string */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    for (i = 0; i < len; i++) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        if (f[i] == pipe) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-           fp = &f[i + 1];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-           /* Because we potentially have to check file permissions at two levels
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-              for the output file (gx_device_open_output_file and the low level
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-              fopen API, if we're using a pipe, we have to add both the full string,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-              (including the '|', and just the command to which we pipe - since at
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-              the pipe_fopen(), the leading '|' has been stripped.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-           code = gs_remove_control_path(mem, gs_permit_file_writing, f);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-           if (code < 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-               return code;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-           code = gs_remove_control_path(mem, gs_permit_file_control, f);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-           if (code < 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-               return code;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-           break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        if (!IS_WHITESPACE(f[i]))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    code = gs_remove_control_path(mem, gs_permit_file_control, fp);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    rewrite_percent_specifiers(f);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    code = gs_remove_control_path(mem, gs_permit_file_control, f);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (code < 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         return code;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    return gs_remove_control_path(mem, gs_permit_file_writing, fp);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return gs_remove_control_path(mem, gs_permit_file_writing, f);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+2.17.1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span></pre><pre style='margin:0'>

</pre>