fsmonitor: read entirety of watchman output
In Perl, setting $/ sets the string that is used as the "record separator," which sets the boundary that the `<>` construct reads to. Setting `local $/ = 0666;` evaluates the octal, getting 438, and stringifies it. Thus, the later read from `<CHLD_OUT>` stops as soon as it encounters the string "438" in the watchman output, yielding invalid JSON; repositories containing filenames with SHA1 hashes are able to trip this easily. Set `$/` to undefined, thus slurping all output from watchman. Also close STDIN which is provided to watchman, to better guarantee that we cannot deadlock with watchman while both attempting to read. Signed-off-by: Alex Vandiver <alexmv@dropbox.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
dcdb71f159
commit
2a387b17c5
@ -50,9 +50,6 @@ launch_watchman();
|
||||
|
||||
sub launch_watchman {
|
||||
|
||||
# Set input record separator
|
||||
local $/ = 0666;
|
||||
|
||||
my $pid = open2(\*CHLD_OUT, \*CHLD_IN, 'watchman -j')
|
||||
or die "open2() failed: $!\n" .
|
||||
"Falling back to scanning...\n";
|
||||
@ -83,7 +80,8 @@ sub launch_watchman {
|
||||
close $fh;
|
||||
|
||||
print CHLD_IN $query;
|
||||
my $response = <CHLD_OUT>;
|
||||
close CHLD_IN;
|
||||
my $response = do {local $/; <CHLD_OUT>};
|
||||
|
||||
open ($fh, ">", ".git/watchman-response.json");
|
||||
print $fh $response;
|
||||
|
@ -49,9 +49,6 @@ launch_watchman();
|
||||
|
||||
sub launch_watchman {
|
||||
|
||||
# Set input record separator
|
||||
local $/ = 0666;
|
||||
|
||||
my $pid = open2(\*CHLD_OUT, \*CHLD_IN, 'watchman -j')
|
||||
or die "open2() failed: $!\n" .
|
||||
"Falling back to scanning...\n";
|
||||
@ -78,7 +75,8 @@ sub launch_watchman {
|
||||
END
|
||||
|
||||
print CHLD_IN $query;
|
||||
my $response = <CHLD_OUT>;
|
||||
close CHLD_IN;
|
||||
my $response = do {local $/; <CHLD_OUT>};
|
||||
|
||||
die "Watchman: command returned no output.\n" .
|
||||
"Falling back to scanning...\n" if $response eq "";
|
||||
|
Loading…
Reference in New Issue
Block a user