Message ID | e194809e547eb5bc8e8d1ad09d874ebfde0efe4f.1615995049.git.gitgitgadget@gmail.com (mailing list archive) |
---|---|
State | Accepted |
Commit | 3dfd30598bdb34078329aa9bd9b03c5ab5cdbcce |
Headers | show |
Series | Fix memory corruption with FSMonitor-enabled unpack_trees() | expand |
"Johannes Schindelin via GitGitGadget" <gitgitgadget@gmail.com> writes: > --- a/unpack-trees.c > +++ b/unpack-trees.c > @@ -1544,8 +1544,8 @@ int unpack_trees(unsigned len, struct tree_desc *t, struct unpack_trees_options > o->merge_size = len; > mark_all_ce_unused(o->src_index); > > - if (o->src_index->fsmonitor_last_update) > - o->result.fsmonitor_last_update = o->src_index->fsmonitor_last_update; > + o->result.fsmonitor_last_update = > + xstrdup_or_null(o->src_index->fsmonitor_last_update); And this won't happen twice, so there is no need to free what is in the o->result side before assignment. And 2/2 frees it so we do not leak at the end either. Will queue; thanks. > > /* > * Sparse checkout loop #1: set NEW_SKIP_WORKTREE on existing entries
diff --git a/unpack-trees.c b/unpack-trees.c index 2399b6818be6..63e3d961b378 100644 --- a/unpack-trees.c +++ b/unpack-trees.c @@ -1544,8 +1544,8 @@ int unpack_trees(unsigned len, struct tree_desc *t, struct unpack_trees_options o->merge_size = len; mark_all_ce_unused(o->src_index); - if (o->src_index->fsmonitor_last_update) - o->result.fsmonitor_last_update = o->src_index->fsmonitor_last_update; + o->result.fsmonitor_last_update = + xstrdup_or_null(o->src_index->fsmonitor_last_update); /* * Sparse checkout loop #1: set NEW_SKIP_WORKTREE on existing entries