From: Jonathan Nieder Date: Sun, 5 Dec 2010 09:32:53 +0000 (-0600) Subject: vcs-svn: fix intermittent repo_tree corruption X-Git-Tag: v1.7.4-rc0~37^2~1 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=3c93983875af53b9f172d7f7a1022d0954cb5689;p=git.git vcs-svn: fix intermittent repo_tree corruption Pointers to directory entries do not remain valid after a call to dent_insert. Noticed in the course of importing a small Subversion repository (~1000 revs); after setting up a dirent for a certain path as a placeholder, by luck dent_insert would trigger a realloc that shifted around addresses, resulting in an import with that file replaced by a directory. Signed-off-by: Jonathan Nieder Signed-off-by: Junio C Hamano --- diff --git a/vcs-svn/repo_tree.c b/vcs-svn/repo_tree.c index e94d91d12..e3d1fa354 100644 --- a/vcs-svn/repo_tree.c +++ b/vcs-svn/repo_tree.c @@ -131,7 +131,7 @@ static void repo_write_dirent(uint32_t *path, uint32_t mode, if (dent == key) { dent->mode = REPO_MODE_DIR; dent->content_offset = 0; - dent_insert(&dir->entries, dent); + dent = dent_insert(&dir->entries, dent); } if (dent_offset(dent) < dent_pool.committed) { @@ -142,7 +142,7 @@ static void repo_write_dirent(uint32_t *path, uint32_t mode, dent->name_offset = name; dent->mode = REPO_MODE_DIR; dent->content_offset = dir_o; - dent_insert(&dir->entries, dent); + dent = dent_insert(&dir->entries, dent); } dir = repo_dir_from_dirent(dent);