Commits

Junio C Hamano  committed 0bc4589

Make sure get_sha1 does not accept ambiguous sha1 prefix (again).

The earlier fix incorrectly dropped the code the original had to
ensure the found SHA1 is at least unique within the same pack.
Restore the check.

Signed-off-by: Junio C Hamano <junkio@cox.net>

  • Participants
  • Parent commits 619e5a0

Comments (0)

Files changed (1)

 			last = mid;
 		}
 		if (first < num) {
-			unsigned char now[20];
+			unsigned char now[20], next[20];
 			nth_packed_object_sha1(p, first, now);
 			if (match_sha(len, match, now)) {
-				if (!found) {
-					memcpy(found_sha1, now, 20);
-					found++;
+				if (nth_packed_object_sha1(p, first+1, next) ||
+				    !match_sha(len, match, next)) {
+					/* unique within this pack */
+					if (!found) {
+						memcpy(found_sha1, now, 20);
+						found++;
+					}
+					else if (memcmp(found_sha1, now, 20)) {
+						found = 2;
+						break;
+					}
 				}
-				else if (memcmp(found_sha1, now, 20)) {
+				else {
+					/* not even unique within this pack */
 					found = 2;
 					break;
 				}
 	if (!has_unpacked && !has_packed)
 		return -1;
 	if (1 < has_unpacked || 1 < has_packed)
-		return -1;
+		return error("short SHA1 %.*s is ambiguous.", len, canonical);
 	if (has_unpacked != has_packed) {
 		memcpy(sha1, (has_packed ? packed_sha1 : unpacked_sha1), 20);
 		return 0;