summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLibravatar Junio C Hamano <gitster@pobox.com>2021-03-19 15:25:37 -0700
committerLibravatar Junio C Hamano <gitster@pobox.com>2021-03-19 15:25:37 -0700
commit1dd4e7452295618b20703deffc4241bf7dd4be4f (patch)
treea8390c1f3eafd563988d9c2fafe8ad680d7ecc4b
parentMerge branch 'jk/bisect-peel-tag-fix' (diff)
parentfsmonitor: do not forget to release the token in `discard_index()` (diff)
downloadtgif-1dd4e7452295618b20703deffc4241bf7dd4be4f.tar.xz
Merge branch 'js/fsmonitor-unpack-fix'
The data structure used by fsmonitor interface was not properly duplicated during an in-core merge, leading to use-after-free etc. * js/fsmonitor-unpack-fix: fsmonitor: do not forget to release the token in `discard_index()` fsmonitor: fix memory corruption in some corner cases
-rw-r--r--read-cache.c1
-rw-r--r--unpack-trees.c4
2 files changed, 3 insertions, 2 deletions
diff --git a/read-cache.c b/read-cache.c
index 1e9a50c6c7..b36838e74b 100644
--- a/read-cache.c
+++ b/read-cache.c
@@ -2373,6 +2373,7 @@ int discard_index(struct index_state *istate)
cache_tree_free(&(istate->cache_tree));
istate->initialized = 0;
istate->fsmonitor_has_run_once = 0;
+ FREE_AND_NULL(istate->fsmonitor_last_update);
FREE_AND_NULL(istate->cache);
istate->cache_alloc = 0;
discard_split_index(istate);
diff --git a/unpack-trees.c b/unpack-trees.c
index eb8fcda31b..9298fe1d9b 100644
--- a/unpack-trees.c
+++ b/unpack-trees.c
@@ -1612,8 +1612,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