[packages/mailcap] run-mailcap updated from upstream (Debian mime-support) 3.48 to 3.60 - security fixes plus perl 5.25

gotar gotar at pld-linux.org
Mon Apr 2 10:06:23 CEST 2018


commit 77cff387d9b0edd292d87cc21d8e43fbb69b78eb
Author: Tomasz Pala <gotar at pld-linux.org>
Date:   Mon Apr 2 10:04:00 2018 +0200

    run-mailcap updated from upstream (Debian mime-support) 3.48 to 3.60
    - security fixes plus perl 5.25+ compliance

 mailcap.spec             |  10 ++-
 run-mailcap              | 229 +++++++++++++++++++++++++----------------------
 run-mailcap-mktemp.patch |  16 ++++
 3 files changed, 146 insertions(+), 109 deletions(-)
---
diff --git a/mailcap.spec b/mailcap.spec
index be4c359..1e822a9 100644
--- a/mailcap.spec
+++ b/mailcap.spec
@@ -16,16 +16,18 @@ Summary(pt_BR.UTF-8):	Define aplicações auxiliares multimídia para vários pr
 Summary(tr.UTF-8):	Çeşitli programlar için çokluortam yardımcı uygulamaları tanımlar
 Name:		mailcap
 Version:	%{ver}
-Release:	2
+Release:	3
 License:	Public Domain
 Group:		Base
 Source0:	https://fedorahosted.org/released/mailcap/%{name}-%{fcver}.tar.xz
 # Source0-md5:	d8d66b3a458f0da327a7c4edfff911a1
 Source1:	%{name}
 Source2:	%{name}.4
+# https://anonscm.debian.org/git/collab-maint/mime-support.git/log/run-mailcap
 Source3:	run-%{name}
 Source4:	run-%{name}.man
 Patch0:		mime.types.patch
+Patch1:		run-mailcap-mktemp.patch
 URL:		http://git.fedorahosted.org/git/?p=mailcap.git
 BuildRequires:	rpm >= 4.4.9-56
 BuildRequires:	tar >= 1:1.22
@@ -109,7 +111,8 @@ paketini kullanamalarına olanak sağlar (zgv kurulmuş olmalı).
 %prep
 %setup -q -n %{name}-%{fcver}
 %patch0 -p1
-cp -a %{SOURCE1} mailcap
+cp -a %{SOURCE1} %{SOURCE3} .
+%patch1
 
 %if "%{pld_release}" == "ac"
 %{__sed} -i -e 's,/usr/bin/xterm,/usr/X11R6/bin/xterm,g' mailcap
@@ -123,10 +126,11 @@ cp -a %{SOURCE1} mailcap
 %install
 rm -rf $RPM_BUILD_ROOT
 install -d $RPM_BUILD_ROOT{%{_sysconfdir},%{_mandir}/man{1,4},%{_bindir}}
+
 cp -p mailcap mime.types $RPM_BUILD_ROOT%{_sysconfdir}
 cp -p %{SOURCE2} $RPM_BUILD_ROOT%{_mandir}/man4
 cp -p %{SOURCE4} $RPM_BUILD_ROOT%{_mandir}/man1/run-%{name}.1
-install -p %{SOURCE3} $RPM_BUILD_ROOT%{_bindir}
+cp -p run-mailcap $RPM_BUILD_ROOT%{_bindir}
 
 %clean
 rm -rf $RPM_BUILD_ROOT
diff --git a/run-mailcap b/run-mailcap
index 851cd13..8ef4665 100644
--- a/run-mailcap
+++ b/run-mailcap
@@ -9,10 +9,13 @@
 #
 ###############################################################################
 
+use Encode qw(decode);
+use I18N::Langinfo qw(langinfo CODESET);
+use File::Spec;
 
-$debug=0;
+$debug=($ENV{RUN_MAILCAP_DEBUG} || 0);
 $norun=0;
-$pager=0;
+$nopager=0;
 $etcmimetyp="/etc/mime.types";
 $shrmimetyp="/usr/share/etc/mime.types";
 $locmimetyp="/usr/local/etc/mime.types";
@@ -24,14 +27,6 @@ $quotedprct=chr(254);
 $retcode=0;
 
 
-%patterntypes =
-(
- '(^|/)crontab[^/]+$'                           => 'text/x-crontab',            #'
- '/man\d*/'                                     => 'application/x-troff-man',   #'
- '\.\d[^\.]*$'                                  => 'application/x-troff-man',   #'
-);
-
-
 
 sub Usage {
     my($error) = @_;
@@ -41,16 +36,16 @@ sub Usage {
     print STDERR "Options:\n";
     print STDERR "  action        specify what action to do on these files (default=view)\n";
     print STDERR "  debug         be verbose about what's going on\n";
-    print STDERR "  pager         ignore any \"copiousoutput\" directives and use a \"pager\"\n";
+    print STDERR "  nopager       ignore any \"copiousoutput\" directives and never use a \"pager\"\n";
     print STDERR "  norun         just print but don't execute the command (useful with --debug)\n";
     print STDERR "\n";
     print STDERR "Mime-Type:\n";
     print STDERR "  any standard mime type designation in the form <class>/<subtype> -- if\n";
     print STDERR "  not specified, it will be determined from the filename extension\n\n";
     print STDERR "Encoding:\n";
-    print STDERR "  how the file (and type) has been encoded (only \"gzip\", \"bzip\", \"bzip2\"\n";
-    print STDERR "  and \"compress\" are supported) -- if not specified, it will be determined\n";
-    print STDERR "  from the filename extension\n\n";
+    print STDERR "  how the file (and type) has been encoded (only \"gzip\", \"bzip2,\"\n";
+    print STDERR "  \"xz\" and \"compress\" are supported) -- if not specified, it will be\n";
+    print STDERR "   determined from the filename extension\n\n";
 
     exit ($error ? 1 : 0);
 }
@@ -62,8 +57,8 @@ sub EncodingForFile {
     my $encoding;
 
     if ($file =~ m/\.gz$/)  { $encoding = "gzip";       }
-    if ($file =~ m/\.bz$/)  { $encoding = "bzip";       }
     if ($file =~ m/\.bz2$/) { $encoding = "bzip2";      }
+    if ($file =~ m/\.xz$/)  { $encoding = "xz";         }
     if ($file =~ m/\.Z$/)   { $encoding = "compress";   }
 
     print STDERR " - file \"$file\" has encoding \"$encoding\"\n" if $debug && $encoding;
@@ -76,10 +71,14 @@ sub EncodingForFile {
 sub ReadMimetypes {
     my($file) = @_;
 
-    return unless -r $file;
-
     print STDERR " - Reading mime.types file \"$file\"...\n" if $debug;
-    open(MIMETYPES,"<$file") || die "Error: could not read \"$file\" -- $!\n";
+    unless (open(MIMETYPES,'<',$file)) {
+      # Quietly ignore an unreadable file, perhaps non-existent, perhaps
+      # permission denied.
+      print STDERR "   could not read \"$file\" -- $!\n" if $debug;
+      return;
+    }
+
     while (<MIMETYPES>) {
         chomp;
         s/\#.*$//;
@@ -101,10 +100,14 @@ sub ReadMailcap {
     my($file) = @_;
     my $line = "";
 
-    return unless -r $file;
-
     print STDERR " - Reading mailcap file \"$file\"...\n" if $debug;
-    open(MAILCAP,"<$file") || die "Error: could not read \"$file\" -- $!\n";
+    unless (open(MAILCAP,'<',$file)) {
+      # Quietly ignore an unreadable file, perhaps non-existent, perhaps
+      # permission denied.
+      print STDERR "   could not read \"$file\" -- $!\n" if $debug;
+      return;
+    }
+
     while (<MAILCAP>) {
         chomp;
         s/^\s+// if $line;
@@ -138,10 +141,9 @@ sub TempFile {
 #   $tmpfile = POSIX::tmpnam($name);
 #   unlink($tmpfile);
 
-    $cmd  = "mktemp -t ";	# -t is depreciated, but --tmpdir would not be handled by older mktemp
-    $cmd .= "$head" if $head;
-    $cmd .= ".$tail" if $tail;
-    $cmd .= "XXXXXX";
+    $cmd  = "tempfile --mode=600";
+    $cmd .= " --prefix $head" if $head;
+    $cmd .= " --suffix $tail" if $tail;
 
     $tmpfile = `$cmd`;
     chomp($tmpfile);
@@ -196,18 +198,18 @@ sub DecodeFile {
         } else {
             $res = system "gzip -dc \Q$efile\E >\Q$tmpfile\E";
         }
-    } elsif ($encoding eq "bzip") {
-        if ($efile eq '-') {
-            $res = system "bzip -d >\Q$tmpfile\E";
-        } else {
-            $res = system "bzip -dc <\Q$efile\E >\Q$tmpfile\E";
-        }
     } elsif ($encoding eq "bzip2") {
         if ($efile eq '-') {
             $res = system "bzip2 -d >\Q$tmpfile\E";
         } else {
             $res = system "bzip2 -dc <\Q$efile\E >\Q$tmpfile\E";
         }
+    } elsif ($encoding eq "xz") {
+        if ($efile eq '-') {
+            $res = system "xz -d >\Q$tmpfile\E";
+        } else {
+            $res = system "xz -dc <\Q$efile\E >\Q$tmpfile\E";
+        }
     } elsif ($encoding eq "compress") {
         if ($efile eq '-') {
             $res = system "uncompress >\Q$tmpfile\E";
@@ -244,6 +246,12 @@ sub EncodeFile {
         } else {
             $res = system "gzip -c \Q$dfile\E >\Q$efile\E";
         }
+    } elsif ($encoding eq "xz") {
+        if ($efile eq '-') {
+            $res = system "xz < \Q$dfile\E";
+        } else {
+            $res = system "xz < \Q$dfile\E >\Q$efile\E";
+        }
     } elsif ($encoding eq "compress") {
         if ($efile eq '-') {
             $res = system "compress <\Q$dfile\E";
@@ -267,52 +275,36 @@ sub EncodeFile {
 
 
 sub ExtensionMimetype {
-    my($ext) = @_;
+    my($file) = @_;
+    my($ext)  = ($file =~ m!\.([^/\.]+)$!);
     my($typ);
-
-    unless ($donemimetypes) {
-        ReadMimetypes($usrmimetyp);
-        ReadMimetypes($locmimetyp);
-        ReadMimetypes($shrmimetyp);
-        ReadMimetypes($etcmimetyp);
-        $donemimetypes = 1;
+    if ($ext) {
+        unless ($donemimetypes) {
+            ReadMimetypes($usrmimetyp);
+            ReadMimetypes($locmimetyp);
+            ReadMimetypes($shrmimetyp);
+            ReadMimetypes($etcmimetyp);
+            $donemimetypes = 1;
+        }
+        $typ = $mimetypes{lc($ext)};
+        print STDERR " - extension \"$ext\" maps to mime-type \"$typ\"\n" if $debug;
     }
-
-    $typ = $mimetypes{lc($ext)};
-
-    print STDERR " - extension \"$ext\" maps to mime-type \"$typ\"\n" if $debug;
     return $typ;
 }
 
 
 
-sub PatternMimetype {
+sub MagicMimetype {
     my($file) = @_;
-    my($key,$val);
+    my($typ);
 
-    while (($key,$val) = each %patterntypes) {
-        if ($file =~ m!$key!i) {
-            print STDERR " - file \"$file\" maps to mime-type \"$val\"\n" if $debug;
-            return $val;
-        }
+    if (`which file`) {
+        open(READER, "-|", "file", "-b", "--mime-type", "-e", "tokens", "-L", "-z", $file);
+        $typ = <READER>;
+        chomp $typ;
+        print STDERR " - file command returned mime-type \"$typ\"\n" if $debug;
     }
-
-    print STDERR " - file \"$file\" does not conform to any known pattern\n" if $debug;
-    return;
-}
-
-
-
-sub FileMimetype {
-    my($file) = @_;
-    my($ext)  = ($file =~ m!\.([^/\.]+)$!);
-
-    my $type;
-
-    $type = ExtensionMimetype($ext) if $ext;
-    $type = PatternMimetype($file) unless $type;
-
-    return $type;
+    return $typ;
 }
 
 
@@ -345,10 +337,11 @@ foreach (@ARGV) {
         if ($code) {
             my $efile = $file;
             $efile =~ s/\.[^\.]+$//;
-            $type = FileMimetype($efile);
+            $type = ExtensionMimetype($efile);
         } else {
-            $type = FileMimetype($file);
+            $type = ExtensionMimetype($file);
         }
+        $type = MagicMimetype($file) unless $type;
         if ($type) {
             push @files,"${type}:${code}:${file}";
         } else {
@@ -358,16 +351,19 @@ foreach (@ARGV) {
     }
 }
 
+# Pass --debug to sub-calls to this program.
+$ENV{RUN_MAILCAP_DEBUG} = 1 if $debug;
+
 unless ($action) {
-       if ($0 =~ m!(^|/)view$!)     { $action="view";   }
-    elsif ($0 =~ m!(^|/)see$!)      { $action="view";   }
-    elsif ($0 =~ m!(^|/)cat$!)      { $action="cat";    }
-    elsif ($0 =~ m!(^|/)edit$!)     { $action="edit";   }
-    elsif ($0 =~ m!(^|/)change$!)   { $action="edit";   }
-    elsif ($0 =~ m!(^|/)compose$!)  { $action="compose";}
-    elsif ($0 =~ m!(^|/)print$!)    { $action="print";  }
-    elsif ($0 =~ m!(^|/)create$!)   { $action="compose";}
-    else                            { $action="view";   }
+       if ($0 =~ m!(^|/)(mime-)?view$!)     { $action="view";   }
+    elsif ($0 =~ m!(^|/)(mime-)?see$!)      { $action="view";   }
+    elsif ($0 =~ m!(^|/)(mime-)?cat$!)      { $action="cat";    }
+    elsif ($0 =~ m!(^|/)(mime-)?edit$!)     { $action="edit";   }
+    elsif ($0 =~ m!(^|/)(mime-)?change$!)   { $action="edit";   }
+    elsif ($0 =~ m!(^|/)(mime-)?compose$!)  { $action="compose";}
+    elsif ($0 =~ m!(^|/)(mime-)?print$!)    { $action="print";  }
+    elsif ($0 =~ m!(^|/)(mime-)?create$!)   { $action="compose";}
+    else                                    { $action="view";   }
 }
 
 
@@ -429,6 +425,7 @@ foreach (@files) {
 
     my $done=0;
     my $fail=0;
+    my $needsterminal;
     foreach $match (@matches) {
         my $comm;
         print STDERR " - checking mailcap entry \"$match\"\n" if $debug;
@@ -447,15 +444,21 @@ foreach (@files) {
 	}
 
         my($tmpfile,$tmplink);
-        if ($action ne 'print' && $match =~ m/;\s*needsterminal\s*($|;)/ && ! -t STDOUT) {
-            if ($ENV{DISPLAY}) {
-                $comm = "$xtermprgrm -T '$file ($type)' -e $0 --action=$action '${type}:%s'";
+        if ($action ne 'print' && $match =~ m/;\s*needsterminal\s*($|;)/) {
+            $needsterminal = 1;
+            if (-t STDOUT) {
+                print STDERR " - needsterminal is satisfied by stdout\n" if $debug;
             } else {
-                print STDERR " - no terminal available for rule (needsterminal)\n" if $debug;
-                $fail++;
-                next;
+                if ($ENV{DISPLAY}) {
+                    $comm = "$xtermprgrm -T '$file ($type)' -e $0 --action=$action '${type}:%s'";
+                } else {
+                    print STDERR " - no terminal available for rule (needsterminal)\n" if $debug;
+                    $fail++;
+                    next;
+                }
             }
-        } elsif ($action eq 'view' && $pager && $match =~ m/;\s*copiousoutput\s*($|;)/ && $type ne 'text/plain') {
+
+        } elsif ($action eq 'view' && !$nopager && $match =~ m/;\s*copiousoutput\s*($|;)/ && $type ne 'text/plain') {
             $comm .= " | $0 --action=$action text/plain:-";
         }
 
@@ -472,27 +475,22 @@ foreach (@files) {
         }
 
         if ($file ne "-") {
-            if ($comm =~ m/[^%]%s/) {
-                if ($file =~ m![^ a-z0-9,.:/@%^+=_-]!i) {
-                    $match =~ m/nametemplate=(.*?)\s*($|;)/;
-                    my $prefix = $1;
-                    my $linked = 0;
-                    while (!$linked) {
-                        $tmplink = TempFile($prefix);
-                        unlink($tmplink);
-                        if ($file =~ m!^/!) {
-                            $linked = symlink($file,$tmplink);
-                        } else {
-                            my $pwd = `/bin/pwd`;
-                            chomp($pwd);
-                            $linked = symlink("$pwd/$file",$tmplink);
-                        }
-                    }
-                    print STDERR " - filename contains shell meta-characters; aliased to '$tmplink'\n" if $debug;
-                    $comm =~ s/([^%])%s/$1$tmplink/g;
-                } else {
-                    $comm =~ s/([^%])%s/$1"$file"/g;
+            # Resolve file name to an absolute path
+            $file = File::Spec->rel2abs($file);
+            if (decode(langinfo(CODESET()), $file) =~ m![^[:alnum:],.:/@%^+=_-]!i) {
+                $match =~ m/nametemplate=(.*?)\s*($|;)/;
+                my $prefix = $1;
+                my $linked = 0;
+                while (!$linked) {
+                    $tmplink = TempFile($prefix);
+                    unlink($tmplink);
+                    $linked = symlink($file,$tmplink);
                 }
+                $file = $tmplink;
+                print STDERR " - filename contains shell meta-characters; aliased to '$tmplink'\n" if $debug;
+            }
+            if ($comm =~ m/[^%]%s/) {
+                $comm =~ s/([^%])%s/$1$file/g;
             } else {
                 if ($comm =~ m/\|/) {
                     $comm =~ s/\|/<\Q$file\E \|/;
@@ -507,6 +505,25 @@ foreach (@files) {
             if ($comm =~ m/[^%]%s/) {
                 $tmpfile = SaveStdin($match);
                 $comm =~ s/([^%])%s/$1$tmpfile/g;
+
+                # If needsterminal then redirect stdin to the tty which is
+                # on stdout, rather than leaving it as the input data stream
+                # which has now been read through to EOF.
+                #
+                # Some programs such as "more" and "less" already use
+                # /dev/tty rather than stdin.  But "vim" on non-tty stdin
+                # gives a warning message and then leaves the tty in raw
+                # mode on exit.  Or "nvi" refuses to run at all unless both
+                # stdin and stdout are the tty.
+                #
+                # RFC 1524 is silent on exactly what a program with
+                # "needsterminal" should expect, but it seems sensible to
+                # arrange that both stdin and stdout are the terminal for
+                # "needsterminal" with "%s".
+                #
+                if ($needsterminal) {
+                    $comm .= ' <&1';
+                }
             } else {
                 # no name means same as "-"... read from stdin
             }
@@ -514,7 +531,7 @@ foreach (@files) {
 
         $comm =~ s!([^%])%t!$1$type!g;
         $comm =~ s!([^%])%F!$1!g;
-        $comm =~ s!%{(.*?)}!$_="'$ENV{$1}'";s/\`//g;s/\'\'//g;$_!ge;
+        $comm =~ s!%\{(.*?)}!$_="'$ENV{$1}'";s/\`//g;s/\'\'//g;$_!ge;
         $comm =~ s!\\(.)!$1!g;
         $comm =~ s!\'\'!\'!g;
         $comm =~ s!$quotedsemi!;!go;
diff --git a/run-mailcap-mktemp.patch b/run-mailcap-mktemp.patch
new file mode 100644
index 0000000..4205313
--- /dev/null
+++ b/run-mailcap-mktemp.patch
@@ -0,0 +1,16 @@
+--- run-mailcap	2018-04-02 09:44:40.000000000 +0200
++++ run-mailcap	2018-04-02 09:51:19.000000000 +0200
+@@ -141,9 +141,10 @@
+ #   $tmpfile = POSIX::tmpnam($name);
+ #   unlink($tmpfile);
+ 
+-    $cmd  = "tempfile --mode=600";
+-    $cmd .= " --prefix $head" if $head;
+-    $cmd .= " --suffix $tail" if $tail;
++    $cmd  = "mktemp -t ";	# -t is depreciated, but --tmpdir would not be handled by older mktemp
++    $cmd .= "$head" if $head;
++    $cmd .= ".$tail" if $tail;
++    $cmd .= "XXXXXX";
+ 
+     $tmpfile = `$cmd`;
+     chomp($tmpfile);
================================================================

---- gitweb:

http://git.pld-linux.org/gitweb.cgi/packages/mailcap.git/commitdiff/77cff387d9b0edd292d87cc21d8e43fbb69b78eb



More information about the pld-cvs-commit mailing list