summaryrefslogtreecommitdiff
path: root/cache.h
diff options
context:
space:
mode:
authorDavid Turner <dturner@twopensource.com>2015-10-21 17:54:11 (GMT)
committerJunio C Hamano <gitster@pobox.com>2015-10-21 19:47:38 (GMT)
commit41284eb0f944fe2d73708bb4105a8e3ccd0297df (patch)
treed9fb4779370efc2eec5079f72c210bdec900ef87 /cache.h
parent441c4a40173fe1ee8a5c0094e587dfc47e2a6460 (diff)
downloadgit-41284eb0f944fe2d73708bb4105a8e3ccd0297df.zip
git-41284eb0f944fe2d73708bb4105a8e3ccd0297df.tar.gz
git-41284eb0f944fe2d73708bb4105a8e3ccd0297df.tar.bz2
name-hash: don't reuse cache_entry in dir_entry
Stop reusing cache_entry in dir_entry; doing so causes a use-after-free bug. During merges, we free entries that we no longer need in the destination index. But those entries might have also been stored in the dir_entry cache, and when a later call to add_to_index found them, they would be used after being freed. To prevent this, change dir_entry to store a copy of the name instead of a pointer to a cache_entry. This entails some refactoring of code that expects the cache_entry. Keith McGuigan <kmcguigan@twitter.com> diagnosed this bug and wrote the initial patch, but this version does not use any of Keith's code. Helped-by: Keith McGuigan <kmcguigan@twitter.com> Helped-by: Junio C Hamano <gitster@pobox.com> Signed-off-by: David Turner <dturner@twopensource.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'cache.h')
-rw-r--r--cache.h3
1 files changed, 2 insertions, 1 deletions
diff --git a/cache.h b/cache.h
index 22b7b81..1afe537 100644
--- a/cache.h
+++ b/cache.h
@@ -501,7 +501,8 @@ extern int write_locked_index(struct index_state *, struct lock_file *lock, unsi
extern int discard_index(struct index_state *);
extern int unmerged_index(const struct index_state *);
extern int verify_path(const char *path);
-extern struct cache_entry *index_dir_exists(struct index_state *istate, const char *name, int namelen);
+extern int index_dir_exists(struct index_state *istate, const char *name, int namelen);
+extern void adjust_dirname_case(struct index_state *istate, char *name);
extern struct cache_entry *index_file_exists(struct index_state *istate, const char *name, int namelen, int igncase);
extern int index_name_pos(const struct index_state *, const char *name, int namelen);
#define ADD_CACHE_OK_TO_ADD 1 /* Ok to add */