From e34f80278e920e53b69016c7cecb24e4621e4564 Mon Sep 17 00:00:00 2001 From: Jeff King Date: Wed, 28 Oct 2015 18:44:21 -0400 Subject: merge-file: clamp exit code to maximum 127 Git-merge-file is documented to return one of three exit codes: - zero means the merge was successful - a negative number means an error occurred - a positive number indicates the number of conflicts Unfortunately, this all gets stuffed into an 8-bit return code. Which means that if you have 256 conflicts, this wraps to zero, and the merge appears to succeed (and commits a blob full of conflict-marker cruft!). This patch clamps the return value to a maximum of 127, which we should be able to safely represent everywhere. This also leaves 128-255 for other values. Shells (and some parts of git) will typically represent signal death as 128 plus the signal number. And negative values are typically coerced to an 8-bit unsigned value (so "return -1" ends up as 255). Technically negative returns have the same problem (e.g., "-256" wraps back to 0), but this is not a problem in practice, as the only negative value we use is "-1". Signed-off-by: Jeff King Signed-off-by: Junio C Hamano --- builtin/merge-file.c | 3 +++ 1 file changed, 3 insertions(+) (limited to 'builtin/merge-file.c') diff --git a/builtin/merge-file.c b/builtin/merge-file.c index 844f84f40b..ab4330a3d0 100644 --- a/builtin/merge-file.c +++ b/builtin/merge-file.c @@ -102,5 +102,8 @@ int cmd_merge_file(int argc, const char **argv, const char *prefix) free(result.ptr); } + if (ret > 127) + ret = 127; + return ret; } -- cgit v1.2.3