Skip to content

Commit

Permalink
gitweb: Harden "grep" search against filenames with ':'
Browse files Browse the repository at this point in the history
Run "git grep" in "grep" search with '-z' option, to be able to parse
response also for files with filename containing ':' character.  The
':' character is otherwise (without '-z') used to separate filename
from line number and from matched line.

Note that this does not protect files with filename containing
embedded newline.  This would be hard but doable for text files, and
harder or even currently impossible with binary files: git does not
quote filename in

  "Binary file <foo> matches"

message, but new `--break` and/or `--header` options to git-grep could
help here.

Signed-off-by: Jakub Narebski <jnareb@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Jakub Narebski authored and Junio C Hamano committed Jan 5, 2012
1 parent ff7f218 commit 8e09fd1
Showing 1 changed file with 3 additions and 2 deletions.
5 changes: 3 additions & 2 deletions gitweb/gitweb.perl
Original file line number Diff line number Diff line change
Expand Up @@ -5699,7 +5699,7 @@ sub git_search_files {
my %co = @_;

local $/ = "\n";
open my $fd, "-|", git_cmd(), 'grep', '-n',
open my $fd, "-|", git_cmd(), 'grep', '-n', '-z',
$search_use_regexp ? ('-E', '-i') : '-F',
$searchtext, $co{'tree'}
or die_error(500, "Open git-grep failed");
Expand All @@ -5721,7 +5721,8 @@ sub git_search_files {
$file = $1;
$binary = 1;
} else {
(undef, $file, $lno, $ltext) = split(/:/, $line, 4);
($file, $lno, $ltext) = split(/\0/, $line, 3);
$file =~ s/^$co{'tree'}://;
}
if ($file ne $lastfile) {
$lastfile and print "</td></tr>\n";
Expand Down

0 comments on commit 8e09fd1

Please sign in to comment.