Quote all values to be used in urls or in html output.

Bug #261616 r=timeless
This commit is contained in:
cls%seawood.org 2004-12-01 04:46:35 +00:00
Родитель f404ddb2db
Коммит ee84b4fa36
9 изменённых файлов: 115 добавлений и 72 удалений

Просмотреть файл

@ -106,7 +106,7 @@ sub PutsHeader {
$h2 = "";
}
print "<HTML><HEAD>\n<TITLE>$title</TITLE>\n";
print "<HTML><HEAD>\n<TITLE>" . &html_quote($title) . "</TITLE>\n";
print $::Setup_String if (defined($::Setup_String) && $::Setup_String);
print Param("headerhtml") . "\n</HEAD>\n";
print "<BODY BGCOLOR=\"#FFFFFF\" TEXT=\"#000000\"\n";

Просмотреть файл

@ -89,7 +89,9 @@ if ($filename eq '')
print "\nFiles in the CVSROOT dir cannot be viewed.\n";
exit;
}
my ($file_head, $file_tail) = $filename =~ m@(.*/)?(.+)@;
$file_head = '' if !defined($file_head);
my $url_filename = url_quote($filename);
my $url_file_tail = url_quote($file_tail);
@ -115,7 +117,8 @@ if (defined $root and $root ne '') {
} else {
print "\n";
&print_top;
print "Error: Root, $root, is not a directory.<BR><BR>\n";
print "Error: Root, " . &html_quote($root) .
", is not a directory.<BR><BR>\n";
print "</BODY></HTML>\n";
&print_bottom;
exit;
@ -436,7 +439,7 @@ sub max {
}
sub print_top {
my ($title_text) = "for $file_tail (";
my ($title_text) = "for " . &html_quote($file_tail) . " (";
$title_text .= "$browse_revtag:" unless $browse_revtag eq 'HEAD';
$title_text .= $revision if $revision;
$title_text .= ")";
@ -706,6 +709,7 @@ sub print_raw_data {
my %revs_seen = ();
my $prev_rev = $::revision_map[0];
my $count = 0;
print "<PRE>\n";
for my $rev (@::revision_map) {
if ($prev_rev eq $rev) {
$count++;
@ -721,6 +725,7 @@ sub print_raw_data {
for my $rev (sort keys %revs_seen) {
print "$rev|$::revision_ctime{$rev}|$::revision_author{$rev}|$::revision_log{$rev}.\n";
}
print "</PRE>\n";
}
sub link_includes {

Просмотреть файл

@ -62,7 +62,7 @@ if( @fl == 0 ){
print "<h3>No files matched this file name. It may have been added recently.</h3>";
}
elsif( @fl == 1 ){
$s = $fl[0];
$s = &url_quote($fl[0]);
print "<head>
<meta http-equiv=Refresh
content=\"0; URL=cvsblame.cgi?file=$s&rev=$rev&root=$CVS_ROOT&mark=$mark#$ln\">
@ -72,6 +72,7 @@ elsif( @fl == 1 ){
else {
print "<h3>Pick the file that best matches the one you are looking for:</h3>\n";
for $s (@fl) {
print "<dt><a href=cvsblame.cgi?file=$s&rev=$rev&mark=$mark#$ln>$s</a>";
print "<dt><a href=cvsblame.cgi?file=" . &url_quote($s) .
"&rev=$rev&mark=$mark#$ln>$s</a>";
}
}

Просмотреть файл

@ -129,8 +129,9 @@ unless ($found_rcs_file) {
my $rcs_path;
my $url_rcs_path;
($rcs_path) = $rcs_filename =~ m@$root/(.*)/.+?,v@;
$url_rcs_path = &url_quote($rcs_path);
# Parse the rcs file ($::opt_rev is passed as a global)
#
@ -213,7 +214,7 @@ foreach my $path (split('/',$rcs_path)) {
print "<A HREF='$lxr_path'>$path</a>/ ";
}
$lxr_path = Fix_LxrLink("$link_path$file_tail");
print "<A HREF='$lxr_path'>$file_tail</a> ";
print "<A HREF='$lxr_path'>" . &html_quote($file_tail) . "</a> ";
my $graph_cell = Param('cvsgraph') ? <<"--endquote--" : "";
</TR><TR>
@ -246,7 +247,7 @@ print qq(
</TD>
</TR><TR>
<TD>
<A HREF="cvsview2.cgi?command=DIRECTORY&subdir=$rcs_path&files=$url_file_tail&branch=$::opt_rev">diff</A>
<A HREF="cvsview2.cgi?command=DIRECTORY&subdir=$url_rcs_path&files=$url_file_tail&branch=$::opt_rev">diff</A>
</TD><TD NOWRAP>
Compare any two version.
</TD>
@ -455,11 +456,11 @@ sub revision_link {
my $link = Param('urlbase') . "cvsview2.cgi";
if (defined($::prev_revision{$revision})) {
$link .= "?diff_mode=context&whitespace_mode=show&file=$url_file_tail"
. "&branch=$::opt_rev&root=$root&subdir=$rcs_path"
. "&branch=$::opt_rev&root=$root&subdir=$url_rcs_path"
. "&command=DIFF_FRAMESET&rev1=$::prev_revision{$revision}"
. "&rev2=$revision";
} else {
$link .= "?files=$url_file_tail&root=$root&subdir=$rcs_path"
$link .= "?files=$url_file_tail&root=$root&subdir=$url_rcs_path"
. "\&command=DIRECTORY\&rev2=$revision&branch=$::opt_rev";
$link .= "&branch=$browse_revtag" unless $browse_revtag eq 'HEAD';
}
@ -513,7 +514,7 @@ sub sprint_author {
sub print_top {
my ($title_text) = "for $file_tail (";
my ($title_text) = "for " . &html_quote($file_tail) . " (";
$title_text .= "$browse_revtag:" unless $browse_revtag eq 'HEAD';
$title_text .= $revision if $revision;
$title_text .= ")";
@ -606,14 +607,17 @@ sub print_useful_links {
my ($path) = @_;
my ($dir, $file) = $path =~ m@(.*/)?(.+)@;
$dir =~ s@/$@@;
my $url_dir = &url_quote($dir);
my $url_file = &url_quote($file);
my $diff_base = "cvsview2.cgi";
my $blame_base = "cvsblame.cgi";
my $lxr_path = $path;
my $lxr_link = Fix_LxrLink($lxr_path);
my $diff_link = "$diff_base?command=DIRECTORY\&subdir=$dir\&files=$file\&branch=$::opt_rev";
my $blame_link = "$blame_base?root=$::CVS_ROOT\&file=$path\&rev=$::opt_rev";
my $url_path = &url_quote($path);
my $diff_link = "$diff_base?command=DIRECTORY\&subdir=$url_dir\&files=$url_file\&branch=$::opt_rev";
my $blame_link = "$blame_base?root=$::CVS_ROOT\&file=$url_path\&rev=$::opt_rev";
print "<DIV ALIGN=RIGHT>
<TABLE BORDER CELLPADDING=10 CELLSPACING=0>

Просмотреть файл

@ -397,15 +397,20 @@ sub print_ci {
my $log = &html_log($ci->[$::CI_LOG]);
my $rev = $ci->[$::CI_REV];
my $url_who = url_quote($ci->[$::CI_WHO]);
my $url_who = &url_quote($ci->[$::CI_WHO]);
my $url_dir = &url_quote($ci->[$::CI_DIR]);
my $url_file = &url_quote($ci->[$::CI_FILE]);
print "<tr>\n";
print "<TD width=2%>${sm_font_tag}$t</font>";
print "<TD width=2%><a href='$registryurl/who.cgi?email=$url_who'"
. " onClick=\"return js_who_menu('$url_who','',event);\" >"
. "$ci->[$::CI_WHO]</a>\n";
print "<TD width=45%><a href='cvsview2.cgi?subdir=$ci->[$::CI_DIR]&files=" . url_quote($ci->[$::CI_FILE]) . "\&command=DIRECTORY&branch=$::query_branch&root=$::CVS_ROOT'\n"
. " onclick=\"return js_file_menu('$::CVS_ROOT', '$ci->[$::CI_DIR]','" . url_quote($ci->[$::CI_FILE]) . "','$ci->[$::CI_REV]','$::query_branch',event)\">\n";
print "<TD width=45%><a href='cvsview2.cgi?subdir=$url_dir" .
"&files=$url_file\&command=DIRECTORY&branch=$::query_branch" .
"&root=$::CVS_ROOT'\n" .
" onclick=\"return js_file_menu('$::CVS_ROOT', '$url_dir'," .
"'$url_file','$ci->[$::CI_REV]','$::query_branch',event)\">\n";
# if( (length $ci->[$::CI_FILE]) + (length $ci->[$::CI_DIR]) > 30 ){
# $d = $ci->[$::CI_DIR];
# if( (length $ci->[$::CI_DIR]) > 30 ){
@ -429,9 +434,9 @@ sub print_ci {
if( $rev ne '' ){
my $prevrev = &PrevRev( $rev );
print "<TD width=2%>${sm_font_tag}<a href='cvsview2.cgi?diff_mode=".
"context\&whitespace_mode=show\&subdir=".
$ci->[$::CI_DIR] . "\&command=DIFF_FRAMESET\&file=" .
url_quote($ci->[$::CI_FILE]) . "\&rev1=$prevrev&rev2=$rev&root=$::CVS_ROOT'>$rev</a></font>\n";
"context\&whitespace_mode=show\&subdir=$url_dir" .
"\&command=DIFF_FRAMESET\&file=$url_file" .
"\&rev1=$prevrev&rev2=$rev&root=$::CVS_ROOT'>$rev</a></font>\n";
}
else {
print "<TD width=2%>\&nbsp;\n";
@ -502,6 +507,7 @@ sub html_log {
my ( $log ) = @_;
$log =~ s/&/&amp;/g;
$log =~ s/</&lt;/g;
$log =~ s/>/&gt;/g;
return $log;
}

Просмотреть файл

@ -58,8 +58,11 @@ sub sillyness {
my $request = new CGI;
sub http_die {
my ($str) = (@_);
print $request->header();
die (@_);
print "\n";
print "Content-type: text/html\n\n";
die "$str\n";
}
my $anchor_num = 0;
@ -134,7 +137,8 @@ my $opt_rev = &SanitizeRevision($request->param('rev'));
my $opt_subdir = $request->param('subdir');
my $opt_branch = &SanitizeRevision($request->param('branch'));
my $opt_command = $request->param('command');
my $url_file = url_quote($opt_file);
my $url_file = "";
my $url_dir = "";
if (defined($opt_branch) && $opt_branch eq 'HEAD' ) { $opt_branch = ''; }
@ -149,8 +153,9 @@ my $deletion_bg_color = 'LightGreen';
my $diff_bg_color = 'White';
# Ensure that necessary arguments are present
http_die("command not defined in URL\n") if $opt_command eq '';
http_die("command $opt_command: subdir not defined\n") if $opt_subdir eq '';
&http_die("command not defined in URL\n") if (!$opt_command);
&http_die("command $opt_command: subdir not defined\n") if (!$opt_subdir);
if ($opt_command eq 'DIFF' ||
$opt_command eq 'DIFF_FRAMESET' ||
$opt_command eq 'DIFF_LINKS') {
@ -159,23 +164,16 @@ if ($opt_command eq 'DIFF' ||
http_die("command $opt_command: rev2 not defined in URL\n") if $opt_rev2 eq '';
}
# Propagate diff options to created links
$prefix .= "diff_mode=$opt_diff_mode";
$prefix .= "&whitespace_mode=$opt_whitespace_mode";
$prefix .= "&root=$opt_root";
# Create a shorthand for the longest common initial substring of our URL.
my $magic_url = "$prefix&subdir=$opt_subdir";
# Now that we've munged QUERY_STRING into perl variables, set rcsdiff options.
my $rcsdiff = "$rcsdiffcommand -f";
$rcsdiff .= ' -w' if ($opt_whitespace_mode eq 'ignore');
$opt_subdir = &url_decode($opt_subdir);
$opt_file = &url_decode($opt_file) if ($opt_file);
$url_file = &url_quote($opt_file) if ($opt_file);
$url_dir = &url_quote($opt_subdir);
# Handle the "root" argument
#
my $root = $opt_root;
if (defined $root && $root ne '') {
$root = &url_decode($root);
$root =~ s|/$||;
&validateRepository($root);
if (-d $root) {
@ -185,8 +183,21 @@ if (defined $root && $root ne '') {
print "</BODY></HTML>\n";
exit;
}
$opt_root = $root;
}
# Propagate diff options to created links
$prefix .= "diff_mode=" . &url_quote($opt_diff_mode);
$prefix .= "&whitespace_mode=" . &url_quote($opt_whitespace_mode);
$prefix .= "&root=$opt_root";
# Create a shorthand for the longest common initial substring of our URL.
my $magic_url = "$prefix&subdir=$url_dir";
# Now that we've munged QUERY_STRING into perl variables, set rcsdiff options.
my $rcsdiff = "$rcsdiffcommand -f";
$rcsdiff .= ' -w' if ($opt_whitespace_mode eq 'ignore');
my $found = 0;
my $dir;
foreach $root (@SRCROOTS) {
@ -196,10 +207,11 @@ foreach $root (@SRCROOTS) {
last;
}
}
if (!$found) {
print "<FONT SIZE=5><B>Error:</B> $opt_subdir not found.";
exit;
}
&http_die("Directory " . &html_quote($opt_subdir) . " not found.\n") if (!$found);
&validateFiles;
&do_cmd;
exit;
sub http_lastmod {
&parse_cvs_file($dir.'/'.$opt_file.',v');
@ -216,16 +228,14 @@ sub http_lastmod {
sub do_diff_frameset {
chdir($dir);
http_lastmod;
print "<TITLE>$opt_file: $opt_rev1 vs. $opt_rev2</TITLE>\n";
print "<TITLE>$url_file: $opt_rev1 vs. $opt_rev2</TITLE>\n";
print "<FRAMESET ROWS='*,90' FRAMESPACING=0 BORDER=1>\n";
print " <FRAME NAME=diff+$url_file+$opt_rev1+$opt_rev2 ",
" SRC=\"$magic_url&command=DIFF";
print "&root=$opt_root" if defined($opt_root);
" SRC=\"$magic_url&command=DIFF&root=$opt_root";
print "&file=$url_file&rev1=$opt_rev1&rev2=$opt_rev2\">\n";
print " <FRAME SRC=\"$magic_url&command=DIFF_LINKS";
print "&root=$opt_root" if defined($opt_root);
print " <FRAME SRC=\"$magic_url&command=DIFF_LINKS&root=$opt_root";
print "&file=$url_file&rev1=$opt_rev1&rev2=$opt_rev2\">\n";
print "</FRAMESET>\n";
}
@ -270,12 +280,12 @@ sub do_diff_links {
# In this case, make the default behavior be that blame revisions match the requested
# diff version, rather than always showing the tip.
my $blame_link = "$blame_base?file=$opt_subdir/$url_file&rev=$opt_rev2";
$blame_link .= "&root=$opt_root" if defined($opt_root);
my $blame_link = "$blame_base?file=$url_dir/$url_file&rev=$opt_rev2";
$blame_link .= "&root=$opt_root";
my $diff_link = "$magic_url&command=DIRECTORY&file=$url_file&rev1=$opt_rev1&rev2=$opt_rev2";
$diff_link .= "&root=$opt_root" if defined($opt_root);
$diff_link .= "&root=$opt_root";
my $graph_row = Param('cvsgraph') ? <<"--endquote--" : "";
<TR><TD NOWRAP ALIGN=RIGHT VALIGN=TOP><A HREF="cvsgraph.cgi?file=$opt_subdir/$url_file" TARGET="_top"><B>graph:</B></A></TD>
<TR><TD NOWRAP ALIGN=RIGHT VALIGN=TOP><A HREF="cvsgraph.cgi?file=$url_dir/$url_file" TARGET="_top"><B>graph:</B></A></TD>
<TD NOWRAP>View the revision tree as a graph</TD></TR>
--endquote--
@ -321,7 +331,7 @@ sub do_diff_links {
print '&nbsp' x (4 - length($line));
print "<A TARGET='diff+$url_file+$opt_rev1+$opt_rev2'",
" HREF=\"$magic_url&command=DIFF";
print "&root=$opt_root" if defined($opt_root);
print "&root=$opt_root";
print "&file=$url_file&rev1=$opt_rev1&rev2=$opt_rev2#$anchor_num\"",
" ONCLICK='anchor = $anchor_num'>$line</A> ";
$anchor_num++;
@ -352,7 +362,7 @@ sub guess_tab_width {
my ($found_tab_width) = 0;
my ($many_tabs, $any_tabs) = (0, 0);
open(RCSFILE, "$opt_file");
open(RCSFILE, $opt_file);
while (<RCSFILE>) {
if (/tab-width: (\d)/) {
$tab_width = $1;
@ -364,7 +374,8 @@ sub guess_tab_width {
$any_tabs++;
}
}
if (!$found_tab_width && $many_tabs > $any_tabs / 2) {
if ((!$found_tab_width && $many_tabs > $any_tabs / 2) ||
!defined($tab_width) || $tab_width eq '') {
$tab_width = 4;
}
close(RCSFILE);
@ -375,7 +386,7 @@ sub do_diff {
http_lastmod;
print qq|
<html><head>
<title>$opt_file: $opt_rev1 vs. $opt_rev2</title>
<title>$url_file: $opt_rev1 vs. $opt_rev2</title>
<style type="text/css">
pre {
margin: 0;
@ -402,7 +413,7 @@ link="#0000EE" vlink="#551A8B" alink="#FF0000">
# Show specified CVS log entry.
sub do_log {
http_lastmod;
print "<TITLE>$opt_file: $opt_rev CVS log entry</TITLE>\n";
print "<TITLE>$url_file: $opt_rev CVS log entry</TITLE>\n";
print '<PRE>';
CheckHidden("$dir/$opt_file");
@ -440,7 +451,7 @@ sub do_directory {
foreach my $path (split('/',$opt_subdir)) {
$link_path .= $path;
$output .= "<A HREF='rview.cgi?dir=$link_path";
$output .= "&cvsroot=$opt_root" if defined $opt_root;
$output .= "&cvsroot=$opt_root";
$output .= "&rev=$opt_branch" if $opt_branch;
$output .= "' onmouseover='window.status=\"Browse $link_path\";"
." return true;'>$path</A>/ ";
@ -473,9 +484,9 @@ sub do_directory {
print "<TR><TD NOWRAP><B>";
print "<A HREF=\"$lxr_link\">$file</A><BR>";
print "<A HREF=\"cvslog.cgi?file=$opt_subdir/$ufile";
print "<A HREF=\"cvslog.cgi?file=$url_dir/$ufile";
print "&rev=$opt_branch" if $opt_branch;
print "&root=$opt_root" if defined($opt_root);
print "&root=$opt_root";
print "\">Change Log</A></B></TD>\n";
my $first_rev;
@ -497,7 +508,7 @@ sub do_directory {
#print '<TD ROWSPAN=2 VALIGN=TOP>';
print '<TD VALIGN=TOP>';
print "<A HREF=\"$magic_url&command=DIRECTORY";
print "&root=$opt_root" if defined($opt_root);
print "&root=$opt_root";
print "&files=" . url_quote($opt_files) . "&branch=$opt_branch&skip=", $opt_skip + $MAX_REVS, "\"><i>Prior revisions</i></A>", "</TD>\n";
last;
}
@ -506,7 +517,7 @@ sub do_directory {
my $href_close = "";
if ( $prev && $rev ) {
$href_open = "<A HREF=\"$magic_url&command=DIFF_FRAMESET";
$href_open .= "&root=$opt_root" if defined($opt_root);
$href_open .= "&root=$opt_root";
$href_open .= "&file=$ufile&rev1=$prev&rev2=$rev\">";
$href_close = "</A>";
}
@ -524,7 +535,7 @@ sub do_directory {
next if $skip-- > 0;
last if !$revs_remaining--;
print "<TD><A HREF=\"$magic_url&command=LOG";
print "root=$opt_root" if defined($opt_root);
print "root=$opt_root";
print "&file=$ufile&rev=$rev\">$::revision_author{$rev}</A>",
"</TD>\n";
}
@ -534,7 +545,7 @@ sub do_directory {
print "</TABLE><SPACER TYPE=VERTICAL SIZE=20>\n";
print '<FORM METHOD=get>';
print '<INPUT TYPE=hidden NAME=command VALUE=DIFF>';
print "<INPUT TYPE=hidden NAME=subdir VALUE=$opt_subdir>";
print "<INPUT TYPE=hidden NAME=subdir VALUE=$url_dir>";
print '<FONT SIZE=+1><B>New Query:</B></FONT>';
print '<UL><TABLE BORDER=1 CELLSPACING=0 CELLPADDING=7><TR><TD>';
@ -552,7 +563,7 @@ sub do_directory {
print "\n<TABLE CELLPADDING=0 CELLSPACING=0><TR><TD>\n",
'Filename:',
'</TD><TD>',
'<INPUT TYPE=text NAME=file VALUE="', $file, '" SIZE=40>',
'<INPUT TYPE=text NAME=file VALUE="',&url_quote($file), '" SIZE=40>',
"\n</TD></TR><TR><TD>\n",
'Old version:',
@ -651,7 +662,7 @@ sub html_diff {
} else {
print "</TABLE><FONT SIZE=5 COLOR=#ffffff><B>Internal error:</B>",
" unknown command $_",
" at $. in $opt_file $opt_rev1\n";
" at $. in " . &html_quote($opt_file) . " $opt_rev1\n";
exit;
}
}
@ -779,6 +790,19 @@ sub print_bottom {
__BOTTOM__
} # print_bottom
sub validateFiles {
my ($file, $fn);
if ($opt_file) {
$file = "$dir/$opt_file";
&ChrootFilename($opt_root, $file);
} elsif ($opt_files) {
foreach $fn (split(/:/,$opt_files)) {
$file = "$dir/" . &url_decode($fn);
&ChrootFilename($opt_root,$file);
}
}
}
sub do_cmd {
if ($opt_command eq 'DIFF_FRAMESET') { do_diff_frameset; }
@ -786,8 +810,8 @@ sub do_cmd {
elsif ($opt_command eq 'DIFF') { do_diff; }
elsif ($opt_command eq 'LOG') { do_log; }
elsif ($opt_command eq 'DIRECTORY') { do_directory; }
else { print "invalid command \"$opt_command\"."; }
else { &http_die("Invalid command.\n"); }
exit;
}
do_cmd;

Просмотреть файл

@ -48,7 +48,8 @@ if ($cmd eq 'close') {
change_passwd();
} else {
error_screen('Invalid Command',
"<b>Invalid Command '<tt>$cmd</tt>'</b>");
"<b>Invalid Command '<tt>" . &html_quote($cmd) .
"</tt>'</b>");
}
PutsTrailer();

Просмотреть файл

@ -86,7 +86,7 @@ if( $inmod eq 'all' || $inmod eq 'default' || $inmod eq '' ){
$::TreeID = $Module if (exists($::TreeInfo{$Module}{'repository'}));
LoadDirList();
for my $k (sort( grep(!/\*$/, @::LegalDirs) ) ){
print "<OPTION value='$k'>$k\n" if ($k ne $Module);
print "<OPTION value='" . &url_quote($k) . "'>$k\n" if ($k ne $Module);
}
print "</SELECT></NOBR>\n";
@ -100,22 +100,24 @@ print "
</FORM>";
if( $::FORM{module} ne '' ){
my $mod = $::FORM{module};
if( $inmod ne '' ){
my $mod = $inmod;
print "<h1>Examining Module '$mod'</h1>\n\n";
for my $i (sort( grep(!/\*$/, @::LegalDirs) ) ){
my $j = &url_quote($i);
my $k = &html_quote($i);
if( -d "$CVS_ROOT/$i"){
print "<dt><tt>Dir:&nbsp;&nbsp;&nbsp;</tt>";
print "<a href=rview.cgi?dir=$i&cvsroot=$CVS_ROOT>$i</a>";
print "<a href=rview.cgi?dir=$j&cvsroot=$CVS_ROOT>$k</a>";
}
elsif ( -r "$CVS_ROOT/$i,v" ){
print "<dt><font color=blue><tt>File:&nbsp;&nbsp;</tt></font>";
print "<a href=cvsblame.cgi?file=$i&root=$CVS_ROOT>$i</a>";
print "<a href=cvsblame.cgi?file=$j&root=$CVS_ROOT>$k</a>";
}
else {
print "<dt><font color=red><tt>Error: </tt></font>";
print "$i : Not a file or a directory.";
print "$k : Not a file or a directory.";
}
# if( $mod_map->{$i} == $IS_LOCAL ){

Просмотреть файл

@ -263,7 +263,7 @@ foreach $checkin (@list) {
my ($file, $version) = split(/\|/, $fullinfo);
$versioninfo .= "$$info{person}|$$info{dir}|$file|$version,";
}
my $comment = $$info{'log'};
my $comment = &html_quote($$info{'log'});
$comment =~ s/\n/<br>/g;
print "<TD WIDTH=100%>$comment</td>\n";
print "</tr>\n\n";