On 6/24/06, Johannes Schindelin <Johannes.Schindelin@xxxxxx> wrote: > It seems that git-cvsimport makes a temporary file of size 0, which cannot > get mmap()ed, because it has size 0. This switch to tmpnam() avoids creating the tmpfile in the first place and streamlines the code. This handling of tmpfiles is slightly safer, but there is an inherent race condition. --- NOTE: (a) I cannot reproduce the problem and (b) this is only lightly tested, if trivial. However, this switch to tmpnam() avoids creating the tmpfile in the first place and streamlines the code. This usage of tempfiles is open to a race condition if someone could guess the name returned by tmpnam, but even this is safer than what we did before, which was creating a file, closing the fh and then clobbering it from git-read-tree. And if someone can guess the name that tmpnam() returns their magic is strong enough that they'll go for more interesting targets. Signed-off-by: Martin Langhoff <martin@xxxxxxxxxxxxxxx> --- git-cvsimport.perl | 20 +++++--------------- 1 files changed, 5 insertions(+), 15 deletions(-) diff --git a/git-cvsimport.perl b/git-cvsimport.perl index f3daa6c..d961b7b 100644 --- a/git-cvsimport.perl +++ b/git-cvsimport.perl @@ -17,7 +17,7 @@ use strict; use warnings; use Getopt::Std; use File::Spec; -use File::Temp qw(tempfile); +use File::Temp qw(tempfile tmpnam); use File::Path qw(mkpath); use File::Basename qw(basename dirname); use Time::Local; @@ -467,12 +467,8 @@ my $orig_git_index; $orig_git_index = $ENV{GIT_INDEX_FILE} if exists $ENV{GIT_INDEX_FILE}; my %index; # holds filenames of one index per branch -{ # init with an index for origin - my ($fh, $fn) = tempfile('gitXXXXXX', SUFFIX => '.idx', - DIR => File::Spec->tmpdir()); - close ($fh); - $index{$opt_o} = $fn; -} +$index{$opt_o} = tmpnam(); + $ENV{GIT_INDEX_FILE} = $index{$opt_o}; unless(-d $git_dir) { system("git-init-db"); @@ -502,10 +498,7 @@ unless(-d $git_dir) { # populate index unless ($index{$last_branch}) { - my ($fh, $fn) = tempfile('gitXXXXXX', SUFFIX => '.idx', - DIR => File::Spec->tmpdir()); - close ($fh); - $index{$last_branch} = $fn; + $index{$last_branch} = tmpnam(); } $ENV{GIT_INDEX_FILE} = $index{$last_branch}; system('git-read-tree', $last_branch); @@ -818,10 +811,7 @@ while(<CVS>) { if(($ancestor || $branch) ne $last_branch) { print "Switching from $last_branch to $branch\n" if $opt_v; unless ($index{$branch}) { - my ($fh, $fn) = tempfile('gitXXXXXX', SUFFIX => '.idx', - DIR => File::Spec->tmpdir()); - close ($fh); - $index{$branch} = $fn; + $index{$branch} = tmpnam(); $ENV{GIT_INDEX_FILE} = $index{$branch}; system("git-read-tree", $branch); die "read-tree failed: $?\n" if $?; -- 1.4.0.gcda2 - : send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html