aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam Weiss <adam@signal11.com>2015-05-18 19:37:43 -0400
committerAdam Weiss <adam@signal11.com>2015-05-22 14:15:22 -0400
commitffdda4e8a7987de85221d3ca3137593a77d8f5f5 (patch)
treeae466ea44b5d80bf2825af8cb9b6cc6173a20194
parent2cc1372190c01bc6aae70f94fcc3b81ae4f7aba3 (diff)
downloadbitcoin-ffdda4e8a7987de85221d3ca3137593a77d8f5f5.tar.xz
Catch errors on datadir lock and pidfile delete
Prevents bad permissions (or other fs related problems) from resulting in hard crashes with cryptic messages on startup and shutdown.
-rw-r--r--src/init.cpp18
1 files changed, 14 insertions, 4 deletions
diff --git a/src/init.cpp b/src/init.cpp
index 47cbda32f5..87e989f168 100644
--- a/src/init.cpp
+++ b/src/init.cpp
@@ -187,7 +187,11 @@ void Shutdown()
pwalletMain->Flush(true);
#endif
#ifndef WIN32
- boost::filesystem::remove(GetPidFile());
+ try {
+ boost::filesystem::remove(GetPidFile());
+ } catch (const boost::filesystem::filesystem_error& e) {
+ LogPrintf("%s: Unable to remove pidfile: %s\n", __func__, e.what());
+ }
#endif
UnregisterAllValidationInterfaces();
#ifdef ENABLE_WALLET
@@ -862,9 +866,15 @@ bool AppInit2(boost::thread_group& threadGroup)
boost::filesystem::path pathLockFile = GetDataDir() / ".lock";
FILE* file = fopen(pathLockFile.string().c_str(), "a"); // empty lock file; created if it doesn't exist.
if (file) fclose(file);
- static boost::interprocess::file_lock lock(pathLockFile.string().c_str());
- if (!lock.try_lock())
- return InitError(strprintf(_("Cannot obtain a lock on data directory %s. Bitcoin Core is probably already running."), strDataDir));
+
+ try {
+ static boost::interprocess::file_lock lock(pathLockFile.string().c_str());
+ if (!lock.try_lock())
+ return InitError(strprintf(_("Cannot obtain a lock on data directory %s. Bitcoin Core is probably already running."), strDataDir));
+ } catch(const boost::interprocess::interprocess_exception& e) {
+ return InitError(strprintf(_("Cannot obtain a lock on data directory %s. Bitcoin Core is probably already running.") + " %s.", strDataDir, e.what()));
+ }
+
#ifndef WIN32
CreatePidFile(GetPidFile(), getpid());
#endif