1
0
Fork 0
mirror of https://github.com/git/git.git synced 2024-05-19 14:06:37 +02:00

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:
Alex Vandiver 2017-10-03 23:27:46 -07:00 committed by Junio C Hamano
parent dcdb71f159
commit 2a387b17c5
2 changed files with 4 additions and 8 deletions

View File

@ -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;

View File

@ -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 "";