diff options
-rw-r--r-- | rev-parse.c | 1 | ||||
-rw-r--r-- | sha1_name.c | 27 |
2 files changed, 28 insertions, 0 deletions
diff --git a/rev-parse.c b/rev-parse.c index adfc68c9be..169d0cc9b5 100644 --- a/rev-parse.c +++ b/rev-parse.c @@ -292,6 +292,7 @@ int main(int argc, char **argv) } if (verify) die("Needed a single revision"); + as_is = 1; show_file(arg); } show_default(); diff --git a/sha1_name.c b/sha1_name.c index cc320d3d7f..fe409fbce4 100644 --- a/sha1_name.c +++ b/sha1_name.c @@ -203,6 +203,29 @@ const char *find_unique_abbrev(const unsigned char *sha1, int len) return NULL; } +static int ambiguous_path(const char *path) +{ + int slash = 1; + + for (;;) { + switch (*path++) { + case '\0': + break; + case '/': + if (slash) + break; + slash = 1; + continue; + case '.': + continue; + default: + slash = 0; + continue; + } + return slash; + } +} + static int get_sha1_basic(const char *str, int len, unsigned char *sha1) { static const char *prefix[] = { @@ -217,6 +240,10 @@ static int get_sha1_basic(const char *str, int len, unsigned char *sha1) if (len == 40 && !get_sha1_hex(str, sha1)) return 0; + /* Accept only unambiguous ref paths. */ + if (ambiguous_path(str)) + return -1; + for (p = prefix; *p; p++) { char *pathname = git_path("%s/%.*s", *p, len, str); if (!read_ref(pathname, sha1)) |