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>

brian m. carlson committed Jan 15, 2019 at 00:39 UTC 0a3faa45b1d35b227182166769357e0878da8f92
1 file changed +5 -5
tree-walk.c
+5 -5
@@ -498,10 +498,10 @@ static int find_tree_entry(struct tree_desc *t, const char *name, struct object_
498 int namelen = strlen(name);
499 while (t->size) {
500 const char *entry;
501 - const struct object_id *oid;
501 + struct object_id oid;
502 int entrylen, cmp;
503
504 - oid = tree_entry_extract(t, &entry, mode);
504 + oidcpy(&oid, tree_entry_extract(t, &entry, mode));
505 entrylen = tree_entry_len(&t->entry);
506 update_tree_entry(t);
507 if (entrylen > namelen)
@@ -512,7 +512,7 @@ static int find_tree_entry(struct tree_desc *t, const char *name, struct object_
512 if (cmp < 0)
513 break;
514 if (entrylen == namelen) {
515 - oidcpy(result, oid);
515 + oidcpy(result, &oid);
516 return 0;
517 }
518 if (name[entrylen] != '/')
@@ -520,10 +520,10 @@ static int find_tree_entry(struct tree_desc *t, const char *name, struct object_
520 if (!S_ISDIR(*mode))
521 break;
522 if (++entrylen == namelen) {
523 - oidcpy(result, oid);
523 + oidcpy(result, &oid);
524 return 0;
525 }
526 - return get_tree_entry(oid, name + entrylen, result, mode);
526 + return get_tree_entry(&oid, name + entrylen, result, mode);
527 }
528 return -1;
529 }