Re: problem in unpack-trees.c
- From
Junio C Hamano <junkio@cox.net>
- Date
- Dec 4, 2006, 10:00 UTC
- Message-ID
- <7vhcwcq8u7.fsf@assigned-by-dhcp.cox.net>
- In-Reply-To
- <7vodqkq956.fsf@assigned-by-dhcp.cox.net>
Junio C Hamano <junkio@cox.net> writes:
> If the alignment requirement of the platform is smaller, we may > be overstepping the struct when we access its name[] member.
Would this help?
I do not think we need a separate identity for df_conflict_entry per invocation of unpack_trees(), so this allocates one such entry with NUL name at the first call to the function and reuses it from the variable.
diff --git a/unpack-trees.c b/unpack-trees.c index 7cfd628..47aa804 100644 --- a/unpack-trees.c +++ b/unpack-trees.c @@ -370,7 +370,7 @@ int unpack_trees(struct object_list *trees, struct unpack_trees_options *o) int i; struct object_list *posn = trees; struct tree_entry_list df_conflict_list; - struct cache_entry df_conflict_entry; + static struct cache_entry *dfc; memset(&df_conflict_list, 0, sizeof(df_conflict_list)); df_conflict_list.next = &df_conflict_list; @@ -381,8 +381,10 @@ int unpack_trees(struct object_list *trees, struct unpack_trees_options *o) state.refresh_cache = 1; o->merge_size = len; - memset(&df_conflict_entry, 0, sizeof(df_conflict_entry)); - o->df_conflict_entry = &df_conflict_entry; + + if (!dfc) + dfc = xcalloc(1, sizeof(struct cache_entry) + 1); + o->df_conflict_entry = dfc; if (len) { posns = xmalloc(len * sizeof(struct tree_entry_list *));