rebase: one safety net, one bugfix and one optimization.
[gitweb.git] / sha1_name.c
index be1755a70b2c53fc102db41a62e6099fa0adac1b..faac158b16ca978914696ed5d2801770a122cce2 100644 (file)
@@ -236,6 +236,7 @@ static int get_sha1_basic(const char *str, int len, unsigned char *sha1)
                NULL
        };
        const char **p;
+       int found = 0;
 
        if (len == 40 && !get_sha1_hex(str, sha1))
                return 0;
@@ -246,10 +247,20 @@ static int get_sha1_basic(const char *str, int len, unsigned char *sha1)
 
        for (p = prefix; *p; p++) {
                char *pathname = git_path("%s/%.*s", *p, len, str);
-               if (!read_ref(pathname, sha1))
-                       return 0;
+               if (!read_ref(pathname, sha1)) {
+                       /* Must be unique; i.e. when heads/foo and
+                        * tags/foo are both present, reject "foo".
+                        * Note that read_ref() eventually calls
+                        * get_sha1_hex() which can smudge initial
+                        * part of the buffer even if what is read
+                        * is found to be invalid halfway.
+                        */
+                       if (1 < found++)
+                               return -1;
+               }
        }
-
+       if (found == 1)
+               return 0;
        return -1;
 }