diff options
| author | Guilhem Moulin <guilhem@fripost.org> | 2021-02-24 21:50:11 +0100 | 
|---|---|---|
| committer | Guilhem Moulin <guilhem@fripost.org> | 2021-02-24 21:56:10 +0100 | 
| commit | 491998131f18d136ca37f15898d07062ad7a1fae (patch) | |
| tree | e0f035583e5d17101cbe0ad5ea7859595418c273 | |
| parent | ea5a51ecaa72c8277b4f878cf3635025d757fa37 (diff) | |
lacme: improve install_cert()'s handling of temporary files.
| -rwxr-xr-x | lacme | 17 | 
1 files changed, 8 insertions, 9 deletions
| @@ -660,12 +660,10 @@ sub spawn($@) {  #  sub install_cert(%) {      my %args = @_; -    my $filename = $args{path} // die; +    my $path = $args{path} // die; -    my ($dirname, $basename) = -        $filename =~ /\A(.*)\/([^\/]+)\z/ ? ($1, $2) : ('.', $filename); -    my $fh = File::Temp::->new(UNLINK => 0, DIR => $dirname, -                               TEMPLATE => "$basename.XXXXXX") // die; +    my $fh = File::Temp::->new(TEMPLATE => "$path.XXXXXXXXXX", UNLINK => 0) // die; +    my $path_tmp = $fh->filename();      eval {          if ($args{nochain}) { @@ -707,13 +705,14 @@ sub install_cert(%) {          $fh->close() or die "close: $!";      }; -    my $path = $fh->filename();      if ($@) { -        print STDERR "Unlinking $path\n" if $OPTS{debug}; -        unlink $path or warn "unlink($path): $!"; +        print STDERR "Unlinking $path_tmp\n" if $OPTS{debug}; +        unlink $path_tmp or warn "unlink($path_tmp): $!";          die $@; +    } else { +        # atomically replace $path if it exists +        rename($path_tmp, $path) or die "rename($path_tmp, $path): $!";      } -    rename($path, $filename) or die "rename($path, $filename): $!";  } | 
