diff options
author | brian m. carlson <sandals@crustytoothpaste.net> | 2019-01-15 01:39:41 +0100 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2019-01-15 18:57:41 +0100 |
commit | 0a3faa45b1d35b227182166769357e0878da8f92 (patch) | |
tree | fecb058078395271e6588f24869c1fd4252b2293 | |
parent | First batch after 2.20.1 (diff) | |
download | git-0a3faa45b1d35b227182166769357e0878da8f92.tar.xz git-0a3faa45b1d35b227182166769357e0878da8f92.zip |
tree-walk: copy object ID before use
In a future commit, the pointer returned by tree_entry_extract will
point into the struct tree_desc, causing its lifetime to be bound to
that of the struct tree_desc itself. To ensure this code path keeps
working, copy the object_id into a local variable so that it lives long
enough.
Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r-- | tree-walk.c | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/tree-walk.c b/tree-walk.c index 79bafbd1a2..1e040fc20e 100644 --- a/tree-walk.c +++ b/tree-walk.c @@ -498,10 +498,10 @@ static int find_tree_entry(struct tree_desc *t, const char *name, struct object_ int namelen = strlen(name); while (t->size) { const char *entry; - const struct object_id *oid; + struct object_id oid; int entrylen, cmp; - oid = tree_entry_extract(t, &entry, mode); + oidcpy(&oid, tree_entry_extract(t, &entry, mode)); entrylen = tree_entry_len(&t->entry); update_tree_entry(t); if (entrylen > namelen) @@ -512,7 +512,7 @@ static int find_tree_entry(struct tree_desc *t, const char *name, struct object_ if (cmp < 0) break; if (entrylen == namelen) { - oidcpy(result, oid); + oidcpy(result, &oid); return 0; } if (name[entrylen] != '/') @@ -520,10 +520,10 @@ static int find_tree_entry(struct tree_desc *t, const char *name, struct object_ if (!S_ISDIR(*mode)) break; if (++entrylen == namelen) { - oidcpy(result, oid); + oidcpy(result, &oid); return 0; } - return get_tree_entry(oid, name + entrylen, result, mode); + return get_tree_entry(&oid, name + entrylen, result, mode); } return -1; } |