summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2010-03-20 23:56:14 +0000
committerKarl Berry <karl@freefriends.org>2010-03-20 23:56:14 +0000
commit476a20baf518a8fedcc0372c0ee699e7d60d27c4 (patch)
treeb818abb046c621b7b093a54d5d06b5f2990737d8
parentf59835f704c4d280d39aee74fcbf34440474ee61 (diff)
epstopdf 2.15
git-svn-id: svn://tug.org/texlive/trunk@17516 c570f23f-e606-0410-a88d-b1316a301751
-rwxr-xr-xBuild/source/texk/texlive/linked_scripts/epstopdf/epstopdf.pl187
-rw-r--r--Master/texmf-dist/doc/latex/epstopdf/README2
-rwxr-xr-xMaster/texmf-dist/scripts/epstopdf/epstopdf.pl41
-rw-r--r--Master/texmf/doc/man/man1/epstopdf.126
-rw-r--r--Master/texmf/doc/man/man1/epstopdf.man1.pdfbin6599 -> 6711 bytes
-rwxr-xr-xMaster/tlpkg/libexec/ctan2tds2
6 files changed, 140 insertions, 118 deletions
diff --git a/Build/source/texk/texlive/linked_scripts/epstopdf/epstopdf.pl b/Build/source/texk/texlive/linked_scripts/epstopdf/epstopdf.pl
index a312a9b7f90..d7662c96a88 100755
--- a/Build/source/texk/texlive/linked_scripts/epstopdf/epstopdf.pl
+++ b/Build/source/texk/texlive/linked_scripts/epstopdf/epstopdf.pl
@@ -2,7 +2,7 @@ eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}' && eval 'exec perl -S $0 $
if 0;
use strict;
-# $Id: epstopdf.pl 16244 2009-11-30 01:36:08Z karl $
+# $Id: epstopdf.pl 17496 2010-03-18 17:57:31Z karl $
# (Copyright lines below.)
#
# Redistribution and use in source and binary forms, with or without
@@ -39,14 +39,27 @@ use strict;
# c) the result is piped to Ghostscript and a PDF version written.
#
# It needs a Level 2 PS interpreter.
-# If the bounding box is not right, of course, there will be problems.
+# If the input bounding box is not right, of course there will be problems.
#
-# One thing not allowed for is the case of
+# One thing not allowed for: the case of
# "%%BoundingBox: (atend)" when input is not seekable (e.g., from a pipe),
-# which is more complicated.
#
# emacs-page
# History
+# 2010/03/19 v2.15 (Karl Berry)
+# * let --outfile override --filter again.
+# * recognize MSWin64 as well as MSWin32, just in case.
+# 2010/03/08 v2.14 (Manuel P\'egouri\'e-Gonnard)
+# * In restricted mode, forbid --gscmd (all platforms) and call GS with full
+# path relative to self location (Windows).
+# 2010/02/26 v2.13 (Karl Berry)
+# * New release.
+# 2010/02/23 (Manuel P\'egouri\'e-Gonnard)
+# * Use kpsewhich for filename validation in restricted mode, both input and
+# output. Requires kpathsea 5.1.0 (TL2010), rejects the name with earlier
+# versions of kpsewhich.
+# * Call external programs with full path on win32 in order to avoid obvious
+# attacks with rogue versions of these programs in the current directory.
# 2009/11/27 v2.12 (Karl Berry)
# * Make --filter work again
# 2009/11/25 (Manuel P\'egouri\'e-Gonnard)
@@ -133,9 +146,9 @@ use strict;
### program identification
my $program = "epstopdf";
-my $ident = '($Id: epstopdf.pl 16244 2009-11-30 01:36:08Z karl $) 2.12';
+my $ident = '($Id: epstopdf.pl 17496 2010-03-18 17:57:31Z karl $) 2.15';
my $copyright = <<END_COPYRIGHT ;
-Copyright 2009 Karl Berry et al.
+Copyright 2009-2010 Karl Berry et al.
Copyright 2002-2009 Gerben Wierda et al.
Copyright 1998-2001 Sebastian Rahtz et al.
License RBSD: Revised BSD <http://www.xfree86.org/3.3.6/COPYRIGHT2.html#5>
@@ -144,26 +157,28 @@ There is NO WARRANTY, to the extent permitted by law.
END_COPYRIGHT
my $title = "$program $ident\n";
+my $on_windows = $^O =~ /^MSWin/;
+my $on_windows_or_cygwin = $on_windows || $^O eq "cygwin";
+
### ghostscript command name
-my $GS = "gs";
-$GS = "gswin32c" if $^O eq 'MSWin32';
+my $GS = $on_windows ? "gswin32c" : "gs";
### restricted mode
my $restricted = 0;
$restricted = 1 if $0 =~ /repstopdf/;
### options
-$::opt_outfile="";
-$::opt_compress=1;
-$::opt_debug=0;
-$::opt_embed=1;
-$::opt_exact=0;
-$::opt_filter=0;
-$::opt_gs=1;
-$::opt_hires=0;
-$::opt_gscmd="";
-$::opt_res=0;
-$::opt_autorotate="None";
+$::opt_autorotate = "None";
+$::opt_compress = 1;
+$::opt_debug = 0;
+$::opt_embed = 1;
+$::opt_exact = 0;
+$::opt_filter = 0;
+$::opt_gs = 1;
+$::opt_gscmd = "";
+$::opt_hires = 0;
+$::opt_outfile = "";
+$::opt_res = 0;
### usage
my @bool = ("false", "true");
@@ -193,7 +208,7 @@ Options:
For EPS files, PageByPage is equivalent to All
--restricted use restricted mode (default: $bool[$restricted])
-Examples for producing 'test.pdf':
+Examples producing test.pdf:
* $program test.eps
* produce postscript | $program --filter >test.pdf
* produce postscript | $program -f -d -o=test.pdf
@@ -211,40 +226,57 @@ END_OF_USAGE
### process options
use Getopt::Long;
GetOptions (
- "help",
- "version",
- "outfile=s", # \ref{openout_any}
+ "autorotate=s", # \ref{val_autorotate}
"compress!",
"debug!",
"embed!",
"exact!",
"filter!",
"gs!",
- "hires!",
"gscmd=s", # \ref{val_gscmd}
- "res=i", # validated by Getopt ('i' specifier)
- "autorotate=s", # \ref{val_autorotate}
+ "help",
+ "hires!",
+ "outfile=s", # \ref{openout_any}
+ "res=i", # validated by getopt ('i' specifier)
"restricted",
+ "version",
) or die $usage;
### help functions
-sub debug {
- print STDERR "* @_\n" if $::opt_debug;
-}
-sub warning {
- print STDERR "==> Warning: @_\n";
-}
-sub error {
- die "$title!!! Error: @_\n";
-}
-sub errorUsage {
- die "$usage\n!!! Error: @_\n";
-}
+sub debug { print STDERR "* @_\n" if $::opt_debug; }
+sub warning { print STDERR "==> Warning: @_\n"; }
+sub error { die "$title!!! Error: @_\n"; }
+sub errorUsage { die "Error: @_ (try --help for more information)\n"; }
### restricted option
$restricted = 1 if $::opt_restricted;
debug "Restricted mode activated" if $restricted;
+### safer external commands for Windows in restricted mode
+my $kpsewhich = 'kpsewhich';
+if ($restricted && $on_windows) {
+ use File::Basename;
+ my $mydirname = dirname $0;
+ # $mydirname is the location of the Perl script
+ $kpsewhich = "$mydirname/../../../bin/win32/$kpsewhich";
+ $GS = "$mydirname/../../../tlpkg/tlgs/bin/$GS";
+}
+debug "kpsewhich command: $kpsewhich";
+
+### check if a name is "safe" according to kpse's open(in|out)_any
+# return true if name is ok, false otherwise
+sub safe_name
+{
+ my ($mode, $name) = @_;
+ my $option = "";
+ $option = '-safe-in-name' if $mode eq 'in';
+ $option = '-safe-out-name' if $mode eq 'out';
+ error "Unknown check mode in safe_name(): $mode" unless $option;
+ my @args = ($kpsewhich, '-progname', 'repstopdf', $option, $name);
+ my $bad = system {$args[0]} @args;
+ return ! $bad;
+}
+
### help, version options.
if ($::opt_help) {
print $usage;
@@ -257,29 +289,28 @@ if ($::opt_version) {
exit (0);
}
-### get input filename
+### get input filename (\ref{openin_any} for validation)
my $InputFilename = "";
if ($::opt_filter) {
@ARGV == 0 or
- die errorUsage "Input file cannot be used with filter option";
+ errorUsage "Input file cannot be used with filter option";
debug "Filtering: will read standard input";
} else {
- @ARGV > 0 or die errorUsage "Input filename missing";
- @ARGV < 2 or die errorUsage "Unknown option or too many input files";
+ @ARGV > 0 or errorUsage "Input filename missing";
+ @ARGV < 2 or errorUsage "Unknown option or too many input files";
$InputFilename = $ARGV[0];
#-r $InputFilename or error "\"$InputFilename\" not readable";
debug "Input filename:", $InputFilename;
}
+### emacs-page
### option gscmd
if ($::opt_gscmd) {
- debug "Switching from $GS to $::opt_gscmd";
- $GS = $::opt_gscmd;
- # validate GS \label{val_gscmd}
- if ($restricted) {
- $GS =~ /^(gs|mgs|gswin32c|gs386|gsos2)\z/
- or $GS =~ /^gs[\-_]?(\d|\d[\.-_]?\d\d)c?\z/
- or die error "Value of gscmd '$GS' not allowed in restricted mode.";
+ if ($restricted) { # \label{val_gscmd}
+ error "Option forbidden in restricted mode: --gscmd";
+ } else {
+ debug "Switching from $GS to $::opt_gscmd";
+ $GS = $::opt_gscmd;
}
}
@@ -289,24 +320,24 @@ push @GS, qw(-q -dNOPAUSE -dSAFER -sDEVICE=pdfwrite);
### option outfile
my $OutputFilename = $::opt_outfile;
-if ($OutputFilename eq "") {
+if (! $OutputFilename) {
if ($::opt_gs) {
- $OutputFilename = $InputFilename;
- if (!$::opt_filter) {
- my $ds = ($^O eq "MSWin32" || $^O eq "cygwin") ? '\\/' : '/';
+ if ($::opt_filter) {
+ debug "Filtering: will write standard output";
+ $OutputFilename = "-";
+ } else {
+ # Ghostscript, no filter: replace input extension with .pdf.
+ $OutputFilename = $InputFilename;
+ my $ds = $on_windows_or_cygwin ? '\\/' : '/';
$OutputFilename =~ s/\.[^\.$ds]*$//;
$OutputFilename .= ".pdf";
}
} else {
+ debug "No Ghostscript: will write standard output";
$OutputFilename = "-"; # no ghostscript, write to standard output
}
}
-if ($::opt_filter) {
- debug "Filtering: will write standard output";
- $OutputFilename = "-";
-} else {
- debug "Output filename:", $OutputFilename;
-}
+debug "Output filename:", $OutputFilename;
push @GS, "-sOutputFile=$OutputFilename";
### options compress, embed, res, autorotate
@@ -321,7 +352,7 @@ $rotmsg = $::opt_autorotate ? $::opt_autorotate : "[use gs default]";
error "Invalid value for autorotate: '$::opt_autorotate' "
. "(use 'All', 'None' or 'PageByPage')."
if ($::opt_autorotate and
- not $::opt_autorotate =~ /^(None|All|PageByPage)\z/);
+ not $::opt_autorotate =~ /^(None|All|PageByPage)$/);
### option BoundingBox types
my $BBName = "%%BoundingBox:";
@@ -331,31 +362,15 @@ $BBName = "%%HiResBoundingBox:" if $::opt_hires;
$BBName = "%%ExactBoundingBox:" if $::opt_exact;
debug "BoundingBox comment:", $BBName;
+### validate input file name in restricted mode \label{openin_any}
+if ($restricted and not $::opt_filter
+ and not safe_name('in', $InputFilename)) {
+ error "Input filename '$InputFilename' not allowed in restricted mode.";
+}
+
### validate output file name in restricted mode \label{openout_any}
-use File::Spec::Functions qw(splitpath file_name_is_absolute);
-if ($restricted) {
- # use the equivalent of openout_any = p
- # (see opennameok() web2c/lib/texmfmp.c)
- # Well, for now, be even more paranoid: don't allow absolute path at all
- my $ok = 1;
- # disallow opening dot-files on Unix
- unless ($^O eq "MSWin32") {
- my ($drive, $path, $basename) = splitpath($OutputFilename);
- $ok = 0 if $basename =~ /^\./;
- }
- # disallow absolute path
- $ok = 0 if file_name_is_absolute($OutputFilename);
- # disallow colon on Windows. It could be used either after a drive
- # (like "a:dir\file") or for an alternate data stream (like
- # "file:ads").
- if ($^O eq "MSWin32" || $^O eq "cygwin") {
- $ok = 0 if $OutputFilename =~ /:/;
- }
- # disallow going to parent directory
- my $ds = ($^O eq "MSWin32" || $^O eq "cygwin") ? qr([\\/]) : qr(/);
- $ok = 0 if $OutputFilename =~ /^\.\.$ds|$ds\.\.$ds/;
- # we passed all tests
- die error "Output filename '$OutputFilename' not allowed in restricted mode." unless $ok;
+if ($restricted and not safe_name('out', $OutputFilename)) {
+ error "Output filename '$OutputFilename' not allowed in restricted mode.";
}
### option gs
@@ -382,7 +397,7 @@ my $tmp_filename; # temporary file for windows
my $OUT; # filehandle for output (GS pipe or temporary file)
use File::Temp 'tempfile';
if ($::opt_gs) {
- unless ($^O eq 'MSWin32' || $^O eq 'cygwin') { # list piped open works
+ if (! $on_windows_or_cygwin) { # list piped open works
push @GS, qw(- -c quit);
debug "Ghostscript pipe:", join(' ', @GS);
open($OUT, '|-', @GS) or error "Cannot open Ghostscript for piped input";
@@ -584,3 +599,5 @@ if ($? & 127) {
warning "BoundingBox not found" unless $BBCorrected;
debug "Done.";
+
+# vim: ts=8 sw=2 expandtab:
diff --git a/Master/texmf-dist/doc/latex/epstopdf/README b/Master/texmf-dist/doc/latex/epstopdf/README
index 0338f4fada1..76e56b5c792 100644
--- a/Master/texmf-dist/doc/latex/epstopdf/README
+++ b/Master/texmf-dist/doc/latex/epstopdf/README
@@ -10,7 +10,7 @@ Home page: http://tug.org/epstopdf/
Mailing list for bugs and discussion: http://lists.tug.org/tex-k
When reporting bugs, please include an input file and command line
-options so the problem can be reproduced.
+options, so the problem can be reproduced.
-------------------------------------------------------------------------
The test-binary and test-bin2 files were supplied by Akira Kakuto and
diff --git a/Master/texmf-dist/scripts/epstopdf/epstopdf.pl b/Master/texmf-dist/scripts/epstopdf/epstopdf.pl
index 25746bc7960..d7662c96a88 100755
--- a/Master/texmf-dist/scripts/epstopdf/epstopdf.pl
+++ b/Master/texmf-dist/scripts/epstopdf/epstopdf.pl
@@ -2,7 +2,7 @@ eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}' && eval 'exec perl -S $0 $
if 0;
use strict;
-# $Id: epstopdf.pl 17388 2010-03-09 00:25:42Z karl $
+# $Id: epstopdf.pl 17496 2010-03-18 17:57:31Z karl $
# (Copyright lines below.)
#
# Redistribution and use in source and binary forms, with or without
@@ -46,9 +46,12 @@ use strict;
#
# emacs-page
# History
+# 2010/03/19 v2.15 (Karl Berry)
+# * let --outfile override --filter again.
+# * recognize MSWin64 as well as MSWin32, just in case.
# 2010/03/08 v2.14 (Manuel P\'egouri\'e-Gonnard)
# * In restricted mode, forbid --gscmd (all platforms) and call GS with full
-# path relative to self location (windows).
+# path relative to self location (Windows).
# 2010/02/26 v2.13 (Karl Berry)
# * New release.
# 2010/02/23 (Manuel P\'egouri\'e-Gonnard)
@@ -143,7 +146,7 @@ use strict;
### program identification
my $program = "epstopdf";
-my $ident = '($Id: epstopdf.pl 17388 2010-03-09 00:25:42Z karl $) 2.14';
+my $ident = '($Id: epstopdf.pl 17496 2010-03-18 17:57:31Z karl $) 2.15';
my $copyright = <<END_COPYRIGHT ;
Copyright 2009-2010 Karl Berry et al.
Copyright 2002-2009 Gerben Wierda et al.
@@ -154,9 +157,11 @@ There is NO WARRANTY, to the extent permitted by law.
END_COPYRIGHT
my $title = "$program $ident\n";
+my $on_windows = $^O =~ /^MSWin/;
+my $on_windows_or_cygwin = $on_windows || $^O eq "cygwin";
+
### ghostscript command name
-my $GS = "gs";
-$GS = "gswin32c" if $^O eq 'MSWin32';
+my $GS = $on_windows ? "gswin32c" : "gs";
### restricted mode
my $restricted = 0;
@@ -247,9 +252,9 @@ sub errorUsage { die "Error: @_ (try --help for more information)\n"; }
$restricted = 1 if $::opt_restricted;
debug "Restricted mode activated" if $restricted;
-### safer external commands for windows in restricted mode
+### safer external commands for Windows in restricted mode
my $kpsewhich = 'kpsewhich';
-if ($restricted and ($^O eq 'MSWin32')) {
+if ($restricted && $on_windows) {
use File::Basename;
my $mydirname = dirname $0;
# $mydirname is the location of the Perl script
@@ -315,24 +320,24 @@ push @GS, qw(-q -dNOPAUSE -dSAFER -sDEVICE=pdfwrite);
### option outfile
my $OutputFilename = $::opt_outfile;
-if ($OutputFilename eq "") {
+if (! $OutputFilename) {
if ($::opt_gs) {
- $OutputFilename = $InputFilename;
- if (!$::opt_filter) {
- my $ds = ($^O eq "MSWin32" || $^O eq "cygwin") ? '\\/' : '/';
+ if ($::opt_filter) {
+ debug "Filtering: will write standard output";
+ $OutputFilename = "-";
+ } else {
+ # Ghostscript, no filter: replace input extension with .pdf.
+ $OutputFilename = $InputFilename;
+ my $ds = $on_windows_or_cygwin ? '\\/' : '/';
$OutputFilename =~ s/\.[^\.$ds]*$//;
$OutputFilename .= ".pdf";
}
} else {
+ debug "No Ghostscript: will write standard output";
$OutputFilename = "-"; # no ghostscript, write to standard output
}
}
-if ($::opt_filter) {
- debug "Filtering: will write standard output";
- $OutputFilename = "-";
-} else {
- debug "Output filename:", $OutputFilename;
-}
+debug "Output filename:", $OutputFilename;
push @GS, "-sOutputFile=$OutputFilename";
### options compress, embed, res, autorotate
@@ -392,7 +397,7 @@ my $tmp_filename; # temporary file for windows
my $OUT; # filehandle for output (GS pipe or temporary file)
use File::Temp 'tempfile';
if ($::opt_gs) {
- unless ($^O eq 'MSWin32' || $^O eq 'cygwin') { # list piped open works
+ if (! $on_windows_or_cygwin) { # list piped open works
push @GS, qw(- -c quit);
debug "Ghostscript pipe:", join(' ', @GS);
open($OUT, '|-', @GS) or error "Cannot open Ghostscript for piped input";
diff --git a/Master/texmf/doc/man/man1/epstopdf.1 b/Master/texmf/doc/man/man1/epstopdf.1
index c8228ff53b6..2bc8cd82a5e 100644
--- a/Master/texmf/doc/man/man1/epstopdf.1
+++ b/Master/texmf/doc/man/man1/epstopdf.1
@@ -1,6 +1,5 @@
-.TH EPSTOPDF 1 "9 March 2010"
-.\" $Id: epstopdf.1 17388 2010-03-09 00:25:42Z karl $
-.\" man page originally by Jim Van Zandt
+.TH EPSTOPDF 1 "18 March 2010"
+.\" $Id: epstopdf.1 17496 2010-03-18 17:57:31Z karl $
.SH NAME
epstopdf, repstopdf \- convert an EPS file to PDF
.SH SYNOPSIS
@@ -16,9 +15,10 @@ result is piped to Ghostscript and a PDF version written.
If the bounding box is not right, of course, there are problems.
.SH OPTIONS
.IP "\fB--outfile\fP=\fIfile\fP"
-write result to \fIfile\fP; the default is to construct the output file
-name by replacing any extension in the input file with \fI.pdf\fP. If
-\fB--nogs\fP or \fB--filter\fP is specified, write to standard output.
+write result to \fIfile\fP. If this option is not given, and
+\fB--nogs\fP or \fB--filter\fP is specified, write to standard output;
+otherwise, the default is to construct the output file name by replacing
+any extension in the input file with \fI.pdf\fP.
.IP "\fB--\fP[\fBno\fP]\fBcompress\fP"
use compression (default: on).
.IP "\fB--\fP[\fBno\fP]\fBdebug\fP"
@@ -28,9 +28,10 @@ embed fonts (default: on).
.IP "\fB--\fP[\fBno\fP]\fBexact\fP"
scan ExactBoundingBox (default: off).
.IP "\fB--\fP[\fBno\fP]\fBfilter\fP"
-read standard input (default: off).
+read standard input and (unless \fB--outfile\fP is given) write standard
+output(default: off).
.IP "\fB--\fP[\fBno\fP]\fBgs\fP"
-run ghostscript (default: on).
+run Ghostscript (default: on).
.IP "\fB--\fP[\fBno\fP]\fBhires\fP"
scan HiresBoundingBox (default: off).
.IP "\fB--gscmd\fP=\fIval\fP"
@@ -55,15 +56,14 @@ Examples which produce "test.pdf":
epstopdf test.eps
produce postscript | epstopdf --filter >test.pdf
produce postscript | epstopdf -f -d -o=test.pdf
-
.fi
Example: look for HiresBoundingBox and produce corrected PostScript:
.nf
epstopdf -d --nogs --hires test.ps >testcorr.ps
.fi
.SH BUGS
-The case of "%%BoundingBox: (atend)"
-when input is not seekable (e.g., from a pipe) is not supported.
+The case of "%%BoundingBox: (atend)" when input is not seekable (e.g.,
+from a pipe) is not supported.
.PP
Report bugs in the program or this man page to tex-k@tug.org. When
reporting bugs, please include an input file and the command line
@@ -76,8 +76,8 @@ The epstopdf LaTeX package, part of the oberdiek bundle, which automates
running this script on the fly under TeX: http://ctan.org/pkg/epstopdf-pkg.
.SH AUTHOR
The script was originally written by Sebastian Rahtz, for Elsevier
-Science, with subsequent contributions from Gerben Wierda and many
-others. Currently maintained by Karl Berry.
+Science, with subsequent contributions from Thomas Esser, Gerben Wierda
+and many others. Currently maintained by Karl Berry.
.PP
Man page originally written by Jim Van Zandt.
.PP
diff --git a/Master/texmf/doc/man/man1/epstopdf.man1.pdf b/Master/texmf/doc/man/man1/epstopdf.man1.pdf
index 44fb64dd287..4f4a7ea5199 100644
--- a/Master/texmf/doc/man/man1/epstopdf.man1.pdf
+++ b/Master/texmf/doc/man/man1/epstopdf.man1.pdf
Binary files differ
diff --git a/Master/tlpkg/libexec/ctan2tds b/Master/tlpkg/libexec/ctan2tds
index bc1769499fa..bf10264e03a 100755
--- a/Master/tlpkg/libexec/ctan2tds
+++ b/Master/tlpkg/libexec/ctan2tds
@@ -1603,7 +1603,7 @@ $standardxmt='\.xmt';
# packages which have man pages to install.
%specialmans = (
- 'epstopdf' => 'epstopdf.1',
+ 'epstopdf' => 'epstopdf.1|epstopdf.man1.pdf',
'findhyph' => 'findhyph.1',
'latexdiff' => '\.1$',
'latexmk' => 'latexmk.1',