From b3aa1878670c3584716cdf6d79c894277a2c7c00 Mon Sep 17 00:00:00 2001 From: ridiculousfish Date: Mon, 9 Feb 2015 15:37:51 -0800 Subject: [PATCH] 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. --- fishd.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/fishd.cpp b/fishd.cpp index 503cefa69..7df887f4c 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");