From d4c8f572b54a1dbe3779a6e5a9ba4a71bf2f29a4 Mon Sep 17 00:00:00 2001 From: Sven Strickroth Date: Sun, 22 Jul 2012 23:31:21 +0200 Subject: [PATCH] Fixed issue #1294: TortoiseGit might crash on concurrent access on CGitHeadFileList Signed-off-by: Sven Strickroth --- src/Changelog.txt | 1 + src/Git/GitIndex.cpp | 6 ++++++ src/Git/gitindex.h | 7 +++++++ 3 files changed, 14 insertions(+) diff --git a/src/Changelog.txt b/src/Changelog.txt index 110a858d8..cb57f4ed5 100644 --- a/src/Changelog.txt +++ b/src/Changelog.txt @@ -23,6 +23,7 @@ Released: unreleased * Fixed issue #1290: When pushing, 'remote' should default to the tracked archive, or empty * Optimized remembering of checked/unchecked files on the commit dialog * Fixed issue #767: Default column widths in log commit file list are off + * Fixed issue #1294: TortoiseGit might crash on concurrent access on CGitHeadFileList = Release 1.7.11.3 = Released: 2012-07-07 diff --git a/src/Git/GitIndex.cpp b/src/Git/GitIndex.cpp index 4f9ca4dac..a8b4e4a43 100644 --- a/src/Git/GitIndex.cpp +++ b/src/Git/GitIndex.cpp @@ -369,6 +369,7 @@ int CGitHeadFileList::GetPackRef(const CString &gitdir) __int64 mtime; if (g_Git.GetFileModifyTime(PackRef, &mtime)) { + CAutoWriteLock lock(&this->m_SharedMutex); //packed refs is not existed this->m_PackRefFile.Empty(); this->m_PackRefMap.clear(); @@ -380,12 +381,14 @@ int CGitHeadFileList::GetPackRef(const CString &gitdir) } else { + CAutoWriteLock lock(&this->m_SharedMutex); this->m_PackRefFile = PackRef; this->m_LastModifyTimePackRef = mtime; } int ret = 0; { + CAutoWriteLock lock(&this->m_SharedMutex); this->m_PackRefMap.clear(); CAutoFile hfile = CreateFile(PackRef, @@ -480,6 +483,7 @@ int CGitHeadFileList::GetPackRef(const CString &gitdir) int CGitHeadFileList::ReadHeadHash(CString gitdir) { int ret = 0; + CAutoWriteLock lock(&this->m_SharedMutex); m_Gitdir = g_AdminDirMap.GetAdminDir(gitdir); m_HeadFile = m_Gitdir + _T("HEAD"); @@ -613,6 +617,7 @@ int CGitHeadFileList::ReadHeadHash(CString gitdir) bool CGitHeadFileList::CheckHeadUpdate() { + CAutoReadLock lock(&m_SharedMutex); if (this->m_HeadFile.IsEmpty()) return true; @@ -756,6 +761,7 @@ int ReadTreeRecursive(git_repository &repo, git_tree * tree, CStringA base, int int CGitHeadFileList::ReadTree() { + CAutoWriteLock lock(&m_SharedMutex); CStringA gitdir = CUnicodeUtils::GetMulti(m_Gitdir, CP_UTF8); git_repository *repository = NULL; git_commit *commit = NULL; diff --git a/src/Git/gitindex.h b/src/Git/gitindex.h index 3bd818027..d06a67c0f 100644 --- a/src/Git/gitindex.h +++ b/src/Git/gitindex.h @@ -156,6 +156,7 @@ class CGitHeadFileList:public std::vector private: int GetPackRef(const CString &gitdir); + SharedMutex m_SharedMutex; public: __time64_t m_LastModifyTimeHead; @@ -177,6 +178,12 @@ public: m_LastModifyTimeHead=0; m_LastModifyTimeRef=0; m_LastModifyTimePackRef = 0; + m_SharedMutex.Init(); + } + + ~CGitHeadFileList() + { + m_SharedMutex.Release(); } int ReadTree(); -- 2.11.4.GIT