aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar ridiculousfish <corydoras@ridiculousfish.com>2015-02-09 15:37:51 -0800
committerGravatar ridiculousfish <corydoras@ridiculousfish.com>2015-02-09 15:37:51 -0800
commitb3aa1878670c3584716cdf6d79c894277a2c7c00 (patch)
treef9ff25c700d2e32abb97724e260387b36adf522e
parent0986b6d9917b719165eb8a18a305cba2e920c007 (diff)
Use a symlink instead of a hard link for fishd.socket compatibility path
On OS X, work around filesystem corruption triggered by having hard links in /tmp, by using a symlink instead.
-rw-r--r--fishd.cpp11
1 files changed, 10 insertions, 1 deletions
diff --git a/fishd.cpp b/fishd.cpp
index 503cefa6..7df887f4 100644
--- a/fishd.cpp
+++ b/fishd.cpp
@@ -626,12 +626,21 @@ repeat:
// Attempt to hardlink the old socket name so that old versions of fish keep working on upgrade
// Not critical if it fails
+ // On OS X, we use symlinks instead of hardlinks to work around a filesystem corruption bug http://openradar.appspot.com/19687545
+ // On Linux, we use hardlinks instead of symlinks for compatibility with the Yama security model - see #1859
+ int (*linkfunc)(const char *, const char *);
+#if __APPLE__
+ linkfunc = symlink;
+#else
+ linkfunc = link;
+#endif
+
if (unlink(old_sock_name.c_str()) != 0 && errno != ENOENT)
{
debug(0, L"Could not create legacy socket path");
wperror(L"unlink");
}
- else if (link(sock_name.c_str(), old_sock_name.c_str()) != 0)
+ else if (linkfunc(sock_name.c_str(), old_sock_name.c_str()) != 0)
{
debug(0, L"Could not create legacy socket path");
wperror(L"link");