projects
/
git.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Use consistent shell prompts and example style.
[git.git]
/
sha1_name.c
diff --git
a/sha1_name.c
b/sha1_name.c
index
75c688e
..
be1755a
100644
(file)
--- 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;
}
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[] = {
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;
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))
for (p = prefix; *p; p++) {
char *pathname = git_path("%s/%.*s", *p, len, str);
if (!read_ref(pathname, sha1))
@@
-322,7
+349,9
@@
static int peel_onion(const char *name, int len, unsigned char *sha1)
if (!o)
return -1;
if (!type_string) {
if (!o)
return -1;
if (!type_string) {
- o = deref_tag(o);
+ o = deref_tag(o, name, sp - name - 2);
+ if (!o || (!o->parsed && !parse_object(o->sha1)))
+ return -1;
memcpy(sha1, o->sha1, 20);
}
else {
memcpy(sha1, o->sha1, 20);
}
else {
@@
-332,7
+361,7
@@
static int peel_onion(const char *name, int len, unsigned char *sha1)
*/
while (1) {
*/
while (1) {
- if (!o)
+ if (!o
|| (!o->parsed && !parse_object(o->sha1))
)
return -1;
if (o->type == type_string) {
memcpy(sha1, o->sha1, 20);
return -1;
if (o->type == type_string) {
memcpy(sha1, o->sha1, 20);