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

[PATCH (amend)] gitweb: Check if requested object exists

From
Jakub Narebski <jnareb@gmail.com>
Date
May 12, 2007, 19:16 UTC
Message-ID
<200705122116.34486.jnareb@gmail.com>
In-Reply-To
<7vzm4a7sv3.fsf@assigned-by-dhcp.cox.net>

Try to avoid "Use of uninitialized value ..." errors caused by bad revision, incorrect filename, wrong object id, bad file etc. (wrong value of 'h', 'hb', 'f', etc. parameters). This avoids polluting web server errors log.

Correct git_get_hash_by_path and parse_commit_text (and, in turn, parse_commit) to return undef if object does not exist. Check in git_tag if requested tag exists.

Signed-off-by: Jakub Narebski <jnareb@gmail.com>
---
This patch is replacement of earlier "bandaid" patch
  [PATCH] gitweb: Avoid "Use of uninitialized value" errors (written to logs)
  Message-Id: <200705120135.30150.jnareb@gmail.com>

This one tries to cure causes, not put bandaid over symptoms. It also passes my gitweb test.

One thing that is left is to fix "Use of initialized value..." warnings for empty repositories (initialized, but without any commits). But I don't think that this corner case is terribly important.

 gitweb/gitweb.perl |   16 +++++++++++++++-
 1 files changed, 15 insertions(+), 1 deletions(-)
diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl
index 21864c6..74556f7 100755
--- a/gitweb/gitweb.perl
+++ b/gitweb/gitweb.perl
@@ -1060,6 +1060,11 @@ sub git_get_hash_by_path {
 	my $line = <$fd>;
 	close $fd or return undef;
 
+	if (!defined $line) {
+		# there is no tree or hash given by $path at $base
+		return undef;
+	}
+
 	#'100644 blob 0fa3f3a66fb6a137f6ec2c19351ed4d807070ffa	panic.c'
 	$line =~ m/^([0-9]+) (.+) ([0-9a-fA-F]{40})\t/;
 	if (defined $type && $type ne $2) {
@@ -1376,8 +1381,12 @@ sub parse_commit_text {
 
 	pop @commit_lines; # Remove '\0'
 
+	if (! @commit_lines) {
+		return;
+	}
+
 	my $header = shift @commit_lines;
-	if (!($header =~ m/^[0-9a-fA-F]{40}/)) {
+	if ($header !~ m/^[0-9a-fA-F]{40}/) {
 		return;
 	}
 	($co{'id'}, my @parents) = split ' ', $header;
@@ -3409,6 +3418,11 @@ sub git_tag {
 	git_header_html();
 	git_print_page_nav('','', $head,undef,$head);
 	my %tag = parse_tag($hash);
+
+	if (! %tag) {
+		die_error(undef, "Unknown tag object");
+	}
+
 	git_print_header_div('commit', esc_html($tag{'name'}), $hash);
 	print "<div class=\"title_text\">\n" .
 	      "<table cellspacing=\"0\">\n" .
-- 
1.5.1.4
Previous: Junio C HamanoNext: Jakub Narebski
Message 3 of 7 in “gitweb: Avoid "Use of uninitialized value" errors (written to logs)”
  1. gitweb: Avoid "Use of uninitialized value" errors (written to logs)Jakub Narebski, May 11, 2007
  2. Junio C HamanoMay 12, 2007
  3. gitweb: Check if requested object existsJakub Narebski, May 12, 2007
  4. gitweb: Fix "Use of unitialized value" warnings in empty repositoryJakub Narebski, May 13, 2007
  5. Junio C HamanoMay 13, 2007
  6. gitweb: Test if $from_id and $to_id are defined before comparisonJakub Narebski, May 12, 2007
  7. Junio C HamanoMay 12, 2007

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.