readIntoSocket: fix with store URIs containing an &

The third argument to `open()` in `-|` mode is passed to a shell if it's
a string. In my case the store URI contains
`?secret-key=${signingKey.directory}/secret&compression=zstd`

For the `nix store cat` case this means that

* until `&` the process will be started in the background. This fails
  immediately because no path to cat is specified.
* `compression=zstd` is a variable assignment
* the `$path` argument to `store cat` is attempted to be executed as
  another command

Passing just the list solves the problem.
This commit is contained in:
Maximilian Bosch 2024-08-18 10:40:42 +02:00 committed by Pierre Bourdon
parent e987f74954
commit 3ee51dbe58

View file

@ -412,8 +412,7 @@ sub readIntoSocket{
my $sock; my $sock;
eval { eval {
my $x= join(" ", @{$args{cmd}}); open($sock, "-|", @{$args{cmd}}) or die q(failed to open socket from command:\n $x);
open($sock, "-|", $x) or die q(failed to open socket from command:\n $x);
}; };
return $sock; return $sock;