projects
/
git.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Some more memory leak avoidance
[git.git]
/
sha1_name.c
diff --git
a/sha1_name.c
b/sha1_name.c
index
4376cb3
..
cd85d1f
100644
(file)
--- a/
sha1_name.c
+++ b/
sha1_name.c
@@
-249,7
+249,7
@@
static int get_sha1_basic(const char *str, int len, unsigned char *sha1)
static const char *warning = "warning: refname '%.*s' is ambiguous.\n";
const char **p, *pathname;
char *real_path = NULL;
static const char *warning = "warning: refname '%.*s' is ambiguous.\n";
const char **p, *pathname;
char *real_path = NULL;
- int refs_found = 0, a
t_mark
;
+ int refs_found = 0, a
m
;
unsigned long at_time = (unsigned long)-1;
unsigned char *this_result;
unsigned char sha1_from_ref[20];
unsigned long at_time = (unsigned long)-1;
unsigned char *this_result;
unsigned char sha1_from_ref[20];
@@
-257,16
+257,15
@@
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;
- /* At a given period of time? "@
2 hours ago
" */
- for (a
t_mark = 1; at_mark < len; at_mark
++) {
- if (str[a
t_mark] == '@
') {
- int date_len = len - a
t_mark - 1
;
+ /* At a given period of time? "@
{2 hours ago}
" */
+ for (a
m = 1; am < len - 1; am
++) {
+ if (str[a
m] == '@' && str[am+1] == '{' && str[len-1] == '}
') {
+ int date_len = len - a
m - 3
;
char *date_spec = xmalloc(date_len + 1);
char *date_spec = xmalloc(date_len + 1);
- strncpy(date_spec, str + at_mark + 1, date_len);
- date_spec[date_len] = 0;
+ safe_strncpy(date_spec, str + am + 2, date_len + 1);
at_time = approxidate(date_spec);
free(date_spec);
at_time = approxidate(date_spec);
free(date_spec);
- len = a
t_mark
;
+ len = a
m
;
break;
}
}
break;
}
}
@@
-358,7
+357,7
@@
static int peel_onion(const char *name, int len, unsigned char *sha1)
{
unsigned char outer[20];
const char *sp;
{
unsigned char outer[20];
const char *sp;
-
const char *type_string = NULL
;
+
unsigned int expected_type = 0
;
struct object *o;
/*
struct object *o;
/*
@@
-382,13
+381,13
@@
static int peel_onion(const char *name, int len, unsigned char *sha1)
sp++; /* beginning of type name, or closing brace for empty */
if (!strncmp(commit_type, sp, 6) && sp[6] == '}')
sp++; /* beginning of type name, or closing brace for empty */
if (!strncmp(commit_type, sp, 6) && sp[6] == '}')
-
type_string = commit_type
;
+
expected_type = TYPE_COMMIT
;
else if (!strncmp(tree_type, sp, 4) && sp[4] == '}')
else if (!strncmp(tree_type, sp, 4) && sp[4] == '}')
-
type_string = tree_type
;
+
expected_type = TYPE_TREE
;
else if (!strncmp(blob_type, sp, 4) && sp[4] == '}')
else if (!strncmp(blob_type, sp, 4) && sp[4] == '}')
-
type_string = blob_type
;
+
expected_type = TYPE_BLOB
;
else if (sp[0] == '}')
else if (sp[0] == '}')
-
type_string = NULL
;
+
expected_type = TYPE_NONE
;
else
return -1;
else
return -1;
@@
-398,7
+397,7
@@
static int peel_onion(const char *name, int len, unsigned char *sha1)
o = parse_object(outer);
if (!o)
return -1;
o = parse_object(outer);
if (!o)
return -1;
- if (!
type_string
) {
+ if (!
expected_type
) {
o = deref_tag(o, name, sp - name - 2);
if (!o || (!o->parsed && !parse_object(o->sha1)))
return -1;
o = deref_tag(o, name, sp - name - 2);
if (!o || (!o->parsed && !parse_object(o->sha1)))
return -1;
@@
-413,18
+412,18
@@
static int peel_onion(const char *name, int len, unsigned char *sha1)
while (1) {
if (!o || (!o->parsed && !parse_object(o->sha1)))
return -1;
while (1) {
if (!o || (!o->parsed && !parse_object(o->sha1)))
return -1;
- if (o->type ==
type_string
) {
+ if (o->type ==
expected_type
) {
memcpy(sha1, o->sha1, 20);
return 0;
}
memcpy(sha1, o->sha1, 20);
return 0;
}
- if (o->type ==
tag_type
)
+ if (o->type ==
TYPE_TAG
)
o = ((struct tag*) o)->tagged;
o = ((struct tag*) o)->tagged;
- else if (o->type ==
commit_type
)
+ else if (o->type ==
TYPE_COMMIT
)
o = &(((struct commit *) o)->tree->object);
else
return error("%.*s: expected %s type, but the object dereferences to %s type",
o = &(((struct commit *) o)->tree->object);
else
return error("%.*s: expected %s type, but the object dereferences to %s type",
- len, name, type
_string
,
-
o->type
);
+ len, name, type
name(expected_type)
,
+
typename(o->type)
);
if (!o->parsed)
parse_object(o->sha1);
}
if (!o->parsed)
parse_object(o->sha1);
}
@@
-482,7
+481,7
@@
static int get_sha1_1(const char *name, int len, unsigned char *sha1)
*/
int get_sha1(const char *name, unsigned char *sha1)
{
*/
int get_sha1(const char *name, unsigned char *sha1)
{
- int ret;
+ int ret
, bracket_depth
;
unsigned unused;
int namelen = strlen(name);
const char *cp;
unsigned unused;
int namelen = strlen(name);
const char *cp;
@@
-528,8
+527,15
@@
int get_sha1(const char *name, unsigned char *sha1)
}
return -1;
}
}
return -1;
}
- cp = strchr(name, ':');
- if (cp) {
+ for (cp = name, bracket_depth = 0; *cp; cp++) {
+ if (*cp == '{')
+ bracket_depth++;
+ else if (bracket_depth && *cp == '}')
+ bracket_depth--;
+ else if (!bracket_depth && *cp == ':')
+ break;
+ }
+ if (*cp == ':') {
unsigned char tree_sha1[20];
if (!get_sha1_1(name, cp-name, tree_sha1))
return get_tree_entry(tree_sha1, cp+1, sha1,
unsigned char tree_sha1[20];
if (!get_sha1_1(name, cp-name, tree_sha1))
return get_tree_entry(tree_sha1, cp+1, sha1,