From http://ltp.cvs.sourceforge.net/viewvc/ltp/utils/analysis/lcov/bin/geninfo?revision=1.72&view=markup

Fixes "reached unexpected end of file" errors processing gcno files.


--- a/bin/geninfo	2010/01/29 11:07:25	1.71
+++ b/bin/geninfo	2010/02/21 14:56:46	1.72
@@ -2857,6 +2857,9 @@
 	# Skip version and stamp
 	graph_skip(*HANDLE, 8, "version and stamp") or goto incomplete;
 	while (!eof(HANDLE)) {
+		my $next_pos;
+		my $curr_pos;
+
 		# Read record tag
 		$tag = read_gcno_value(*HANDLE, $big_endian, "record tag");
 		goto incomplete if (!defined($tag));
@@ -2866,6 +2869,11 @@
 		goto incomplete if (!defined($length));
 		# Convert length to bytes
 		$length *= 4;
+		# Calculate start of next record
+		$next_pos = tell(HANDLE);
+		goto tell_error if ($next_pos == -1);
+		$next_pos += $length;
+		# Process record
 		if ($tag == $tag_function) {
 			($filename, $function) = read_gcno_function_record(
 				*HANDLE, $bb, $fileorder, $base, $big_endian);
@@ -2882,6 +2890,14 @@
 			graph_skip(*HANDLE, $length, "unhandled record")
 				or goto incomplete;
 		}
+		# Ensure that we are at the start of the next record
+		$curr_pos = tell(HANDLE);
+		goto tell_error if ($curr_pos == -1);
+		next if ($curr_pos == $next_pos);
+		goto record_error if ($curr_pos > $next_pos);
+		graph_skip(*HANDLE, $next_pos - $curr_pos,
+			   "unhandled record content")
+			or goto incomplete;
 	}
 	close(HANDLE);
 	($instr, $graph) = graph_from_bb($bb, $fileorder, $gcno_filename);
@@ -2898,6 +2914,12 @@
 magic_error:
 	graph_error($gcno_filename, "found unrecognized gcno file magic");
 	return undef;
+tell_error:
+	graph_error($gcno_filename, "could not determine file position");
+	return undef;
+record_error:
+	graph_error($gcno_filename, "found unrecognized record format");
+	return undef;
 }
 
 sub debug($)
