summaryrefslogtreecommitdiff
path: root/vcs-svn
diff options
context:
space:
mode:
authorJonathan Nieder <jrnieder@gmail.com>2010-12-05 09:32:53 (GMT)
committerJunio C Hamano <gitster@pobox.com>2010-12-08 00:04:02 (GMT)
commit3c93983875af53b9f172d7f7a1022d0954cb5689 (patch)
treef7676ecf1f9ae1d680c2c79c16202065eed7e229 /vcs-svn
parent97a5e3453abf63bbf5926979fcd89efb4388e937 (diff)
downloadgit-3c93983875af53b9f172d7f7a1022d0954cb5689.zip
git-3c93983875af53b9f172d7f7a1022d0954cb5689.tar.gz
git-3c93983875af53b9f172d7f7a1022d0954cb5689.tar.bz2
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 <jrnieder@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'vcs-svn')
-rw-r--r--vcs-svn/repo_tree.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/vcs-svn/repo_tree.c b/vcs-svn/repo_tree.c
index e94d91d..e3d1fa3 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);