From: Jakub Narebski Date: Mon, 01 Dec 2008 18:01:42 GMT Subject: [PATCH] gitweb: Fix handling of non-ASCII characters in inserted HTML files Message-ID: <20081201175741.11133.82393.stgit@localhost.localdomain> In-Reply-To: <200811171140.45884.jnareb@gmail.com> Use new insert_file() subroutine to insert HTML chunks from external files: $site_header, $home_text (by default indextext.html), $site_footer, and $projectroot/$project/REAME.html. All non-ASCII chars of those files will be broken by Perl IO layer without decoding to utf8, so insert_file() does to_utf8() on each printed line; alternate solution would be to open those files with "binmode $fh, ':utf8'", or even all files with "use open qw(:std :utf8)". Note that inserting README.html lost one of checks for simplicity. Noticed-by: Tatsuki Sugiura Signed-off-by: Jakub Narebski --- This is more complete solution that the one provided by Tatsuki Sugiura in original patch [PATCH] gitweb: fix encode handling for site_{header,footer} Msg-Id: <87vdumbxgc.wl@vaj-k-334-sugi.local.valinux.co.jp> http://thread.gmane.org/gmane.comp.version-control.git/101199 but it is in principle the same solution. I think this one as it is a bugfix should go in git 1.6.1 gitweb/gitweb.perl | 33 +++++++++++++++++---------------- 1 files changed, 17 insertions(+), 16 deletions(-) diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl index 933e137..82262a3 100755 --- a/gitweb/gitweb.perl +++ b/gitweb/gitweb.perl @@ -2740,6 +2740,15 @@ sub get_file_owner { return to_utf8($owner); } +# assume that file exists +sub insert_file { + my $filename = shift; + + open my $fd, '<', $filename; + print map(to_utf8, <$fd>); + close $fd; +} + ## ...................................................................... ## mimetype related functions @@ -2928,9 +2937,7 @@ EOF "\n"; if (-f $site_header) { - open (my $fd, $site_header); - print <$fd>; - close $fd; + insert_file($site_header); } print "
\n" . @@ -3017,9 +3024,7 @@ sub git_footer_html { print "
\n"; # class="page_footer" if (-f $site_footer) { - open (my $fd, $site_footer); - print <$fd>; - close $fd; + insert_file($site_footer); } print "\n" . @@ -4358,9 +4363,7 @@ sub git_project_list { git_header_html(); if (-f $home_text) { print "
\n"; - open (my $fd, $home_text); - print <$fd>; - close $fd; + insert_file($home_text); print "
\n"; } print $cgi->startform(-method => "get") . @@ -4472,13 +4475,11 @@ sub git_summary { print "\n"; if (-s "$projectroot/$project/README.html") { - if (open my $fd, "$projectroot/$project/README.html") { - print "
readme
\n" . - "
\n"; - print $_ while (<$fd>); - print "\n
\n"; # class="readme" - close $fd; - } + print "
readme
\n" . + "
\n"; + insert_file("$projectroot/$project/README.html"); + print "\n
\n"; # class="readme" + close $fd; } # we need to request one more than 16 (0..15) to check if