git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH] gitweb: fix esc_param

From
Jakub Narebski <jnareb@gmail.com>
Date
Oct 14, 2009, 08:23 UTC
Message-ID
<200910141023.15475.jnareb@gmail.com>
In-Reply-To
<1255463496-21617-1-git-send-email-giuseppe.bilotta@gmail.com>
On Tue, 13 Oct 2009, Giuseppe Bilotta wrote:
> The custom CGI escaping done in esc_param failed to escape UTF-8
> properly. Fix by using CGI::escape on each sequence of matched
> characters instead of sprintf()ing a custom escaping for each byte.

Hmmm... I wonder if this bug isn't caused by failing to mark some input as utf8 using to_utf8() subroutine... or by using binmode $fd, ':utf8' on $fd from opening git-rev-list, after ensuring that it outputs utf8 by --encoding=utf8 (or is it only git-log that accepts that option?).

> 
> Additionally, the space -> + escape was being escaped due to greedy
> matching on the first substitution. Fix by adding space to the
> list of characters not handled on the first substitution.
Thanks.
> 
> Finally, remove an unnecessary escaping of the + sign.
Signoff?
Show 11 quoted lines
> ---
>  gitweb/gitweb.perl |    3 +--
>  1 files changed, 1 insertions(+), 2 deletions(-)
> 
> The issues with this routine were exposed by Stephen's
> "author as search link" patch. This should fix them.
> 
> Since the idea of esc_param is to replicate CGI::escape except for the /
> character (if I read the comment correclty), a possible alternative
> would be to just use CGI::escape on the whole string and then undo the
> escaping for the / character.

Well, that and widely used but non-standard (well, not using percent encoding) escaping of space with '+'; CGI::escape(" ") is %20, not '+'. Se we would have to turn '%2F' into '/', and '%20' into '+'.

Show 19 quoted lines
> 
> diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl
> index 6237865..6593e5c 100755
> --- a/gitweb/gitweb.perl
> +++ b/gitweb/gitweb.perl
> @@ -1115,8 +1115,7 @@ sub to_utf8 {
>  # correct, but quoted slashes look too horrible in bookmarks
>  sub esc_param {
>  	my $str = shift;
> -	$str =~ s/([^A-Za-z0-9\-_.~()\/:@])/sprintf("%%%02X", ord($1))/eg;
> -	$str =~ s/\+/%2B/g;
> +	$str =~ s/([^A-Za-z0-9\-_.~()\/:@ ]+)/CGI::escape($1)/eg;
>  	$str =~ s/ /\+/g;
>  	return $str;
>  }
> -- 
> 1.6.3.rc1.192.gdbfcb
> 
> 
-- 
Jakub Narebski
Poland
Previous: Jakub NarebskiNext: Junio C Hamano
Message 6 of 7 in “gitweb: fix esc_param”
  1. gitweb: fix esc_paramGiuseppe Bilotta, Oct 13, 2009
  2. Stephen BoydOct 14, 2009
  3. Giuseppe BilottaOct 14, 2009
  4. Stephen BoydOct 14, 2009
  5. Jakub NarebskiOct 14, 2009
  6. Jakub NarebskiOct 14, 2009
  7. Junio C HamanoOct 14, 2009

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.