From d352738b8b757785f8cdfa3d9c1eb8450a675d92 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Tue, 20 May 2014 00:59:28 -0700 Subject: [PATCH] Fix rcs2log problems with CVS. Problem reported by Glenn Morris in . Plus, fix some security and filename quoting problems. * rcs2log (logdir): Prefer mktemp if available. (logdir, llogdir): Work even if TMPDIR begins with '-' or has spaces. (output_authors, main awk script): Parse more-recent CVS output format. --- lib-src/ChangeLog | 10 ++++++++ lib-src/rcs2log | 59 ++++++++++++++++++++++++++++++++++------------- 2 files changed, 53 insertions(+), 16 deletions(-) diff --git a/lib-src/ChangeLog b/lib-src/ChangeLog index c0df532fbb..42a44f9712 100644 --- a/lib-src/ChangeLog +++ b/lib-src/ChangeLog @@ -1,3 +1,13 @@ +2014-05-20 Paul Eggert + + Fix rcs2log problems with CVS. + Problem reported by Glenn Morris in + . + Plus, fix some security and filename quoting problems. + * rcs2log (logdir): Prefer mktemp if available. + (logdir, llogdir): Work even if TMPDIR begins with '-' or has spaces. + (output_authors, main awk script): Parse more-recent CVS output format. + 2014-05-03 Paul Eggert Handle systems without WCONTINUED consistently. (Bug#15110, 17339) diff --git a/lib-src/rcs2log b/lib-src/rcs2log index a0a75e390f..8dd9cdcf2b 100755 --- a/lib-src/rcs2log +++ b/lib-src/rcs2log @@ -205,11 +205,19 @@ month_data=' m[9]="Oct"; m[10]="Nov"; m[11]="Dec" ' -logdir=$TMPDIR/rcs2log$$ -llogout=$logdir/l +if type mktemp >/dev/null 2>&1; then + logdir=`mktemp -d` +else + logdir=$TMPDIR/rcs2log$$ + (umask 077 && mkdir "$logdir") +fi || exit +case $logdir in +-*) logdir=./$logdir;; +esac trap exit 1 2 13 15 -trap "rm -fr $logdir 2>/dev/null" 0 -(umask 077 && exec mkdir $logdir) || exit +trap "rm -fr \"$logdir\" 2>/dev/null" 0 + +llogout=$logdir/l # If no rlog-format log file is given, generate one into $rlogfile. case $rlogfile in @@ -417,10 +425,10 @@ case $loginFullnameMailaddrs in ?*) case $loginFullnameMailaddrs in *\"* | *\\*) - sed 's/["\\]/\\&/g' >$llogout <"$llogout" <$llogout || exit +esac >"$llogout" || exit output_authors='/^date: / { - if ($2 ~ /^[0-9]*[-\/][0-9][0-9][-\/][0-9][0-9]$/ && $3 ~ /^[0-9][0-9]:[0-9][0-9]:[0-9][0-9][-+0-9:]*;$/ && $4 == "author:" && $5 ~ /^[^;]*;$/) { - print substr($5, 1, length($5)-1) + cvsformat = $5 == "author:" + if ($2 ~ /^[0-9]*[-\/][0-9][0-9][-\/][0-9][0-9]$/ && (cvsformat ? $3 ~ /^[0-9][0-9]:[0-9][0-9]:[0-9][0-9]/ && $4 ~ /^[-+][0-9:]*;$/ : $3 ~ /^[0-9][0-9]:[0-9][0-9]:[0-9][0-9][-+0-9:]*;$/)) { + author = $(5 + cvsformat) + if ($(4 + cvsformat) == "author:" && author ~ /^[^;]*;$/) { + print substr(author, 1, length(author)-1) + } } }' authors=` - $AWK "$output_authors" <"$rlogfile" | sort -u | comm -23 - $llogout + $AWK "$output_authors" <"$rlogfile" | sort -u | comm -23 - "$llogout" ` case $authors in ?*) - cat >$llogout <"$llogout" <