Commit 1edbfa1ffe20d9581194c0c2e3b660dd0487870f

Krishna Ram Prakash R 2016-06-28T20:19:52

Fixed bug while parsing INT64_MIN

diff --git a/src/util.c b/src/util.c
index 9e67f43..cc4b432 100644
--- a/src/util.c
+++ b/src/util.c
@@ -122,8 +122,8 @@ int git__strtol64(int64_t *result, const char *nptr, const char **endptr, int ba
 			v = c - 'A' + 10;
 		if (v >= base)
 			break;
-		nn = n*base + v;
-		if (nn < n)
+		nn = n * base + (neg ? -v : v);
+		if ((!neg && nn < n) || (neg && nn > n))
 			ovfl = 1;
 		n = nn;
 	}
@@ -142,7 +142,7 @@ Return:
 		return -1;
 	}
 
-	*result = neg ? -n : n;
+	*result = n;
 	return 0;
 }
 
diff --git a/tests/core/strtol.c b/tests/core/strtol.c
index 8765e04..0d3b6a5 100644
--- a/tests/core/strtol.c
+++ b/tests/core/strtol.c
@@ -33,5 +33,13 @@ void test_core_strtol__int64(void)
 	cl_assert(i == 2147483657LL);
 	cl_git_pass(git__strtol64(&i, "  -2147483657 ", NULL, 10));
 	cl_assert(i == -2147483657LL);
+	cl_git_pass(git__strtol64(&i, " 9223372036854775807  ", NULL, 10));
+	cl_assert(i == INT64_MAX);
+	cl_git_pass(git__strtol64(&i, "   -9223372036854775808  ", NULL, 10));
+	cl_assert(i == INT64_MIN);
+	cl_git_pass(git__strtol64(&i, "   0x7fffffffffffffff  ", NULL, 16));
+	cl_assert(i == INT64_MAX);
+	cl_git_pass(git__strtol64(&i, "   -0x8000000000000000   ", NULL, 16));
+	cl_assert(i == INT64_MIN);
 }