[PATCH] diff-files: move misplaced cleanup label

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Commit 0139c58ab9 (revisions API users: add "goto cleanup" for
release_revisions(), 2022-04-13) converted an early return in
cmd_diff_files() into a goto. But it put the cleanup label too early: if
read_cache_preload() returns an error, we'll set result to "-1", but
then jump to calling run_diff_files(), overwriting our result.

We should jump past the call to run_diff_files(). Likewise, we should go
past diff_result_code(), which is expecting to see a code from an actual
diff, not a negative error code.

In practice, I suspect this bug cannot actually be triggered, because
read_cache_preload() does not seem to ever return an error. Its return
value (eventually) comes from do_read_index(), which gives the number of
cache entries found, and calls die() on error. Still, it makes sense to
fix the inadvertent change from 0139c58ab9 first, and we can look into
the overall error handling of read_cache() separately (which is present
in many other callsites).

Signed-off-by: Jeff King <peff@xxxxxxxx>
---
This is on top of ab/plug-leak-in-revisions, though it's long since
graduated to master.

The read_cache() thing is weird. The error checking was introduced back
in 6304c29d51 (diff-files: do not play --no-index games, 2008-05-23).
And even back then, I don't see it ever returning -1. Yet then, as well
as now, running "git grep 'read_cache.*< 0'" turns up many hits. So I'm
not sure if I'm missing a case, or if it's cargo-culting gone wild.

Still, I don't plan to dig further into it anytime soon. Removing the
error handling from those sites is relatively low reward, with high risk
for introducing a bug.

 builtin/diff-files.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/builtin/diff-files.c b/builtin/diff-files.c
index 2bfaf9ba7a..92cf6e1e92 100644
--- a/builtin/diff-files.c
+++ b/builtin/diff-files.c
@@ -80,9 +80,9 @@ int cmd_diff_files(int argc, const char **argv, const char *prefix)
 		result = -1;
 		goto cleanup;
 	}
-cleanup:
 	result = run_diff_files(&rev, options);
 	result = diff_result_code(&rev.diffopt, result);
+cleanup:
 	release_revisions(&rev);
 	return result;
 }
-- 
2.37.0.497.g676cb53800




[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]

  Powered by Linux