From: Michael Tokarev <mjt@corpit.ru>
Date: Mon, 18 May 2009 12:49:39 +0000 (+0400)
Subject: bugfix: move mlock to after detach() so it works for child, not parent
X-Git-Tag: import-tinc-1.1~595^2~21
X-Git-Url: https://git.meshlink.io/?a=commitdiff_plain;h=6be5d4f5b67764115b37528d2fe01bd245b3cd3e;p=meshlink

bugfix: move mlock to after detach() so it works for child, not parent

mlock()/mlockall() are not persistent across fork(), and it's
done in parent process before daemon() which does fork().  So
basically, current --mlock does nothing useful.

Move mlock() to after detach() so it works for child process
instead of parent.

Also, check if the platform supports mlock right when processing
options (since else we'll have to die after startup, not at
startup, the error message will be in log only).
---

diff --git a/src/tincd.c b/src/tincd.c
index a8a0146d..929e9b91 100644
--- a/src/tincd.c
+++ b/src/tincd.c
@@ -160,8 +160,13 @@ static bool parse_options(int argc, char **argv)
 				break;
 
 			case 'L':				/* no detach */
+#ifndef HAVE_MLOCKALL
+				logger(LOG_ERR, _("mlockall() not supported on this platform!"));
+				return false;
+#else
 				do_mlock = true;
 				break;
+#endif
 
 			case 'd':				/* inc debug level */
 				if(optarg)
@@ -511,20 +516,6 @@ int main(int argc, char **argv)
 
 	openlogger("tinc", use_logfile?LOGMODE_FILE:LOGMODE_STDERR);
 
-	/* Lock all pages into memory if requested */
-
-	if(do_mlock)
-#ifdef HAVE_MLOCKALL
-		if(mlockall(MCL_CURRENT | MCL_FUTURE)) {
-			logger(LOG_ERR, _("System call `%s' failed: %s"), "mlockall",
-				   strerror(errno));
-#else
-	{
-		logger(LOG_ERR, _("mlockall() not supported on this platform!"));
-#endif
-		return -1;
-	}
-
 	g_argv = argv;
 
 	init_configuration(&config_tree);
@@ -570,6 +561,17 @@ int main2(int argc, char **argv)
 	if(!detach())
 		return 1;
 
+#ifdef HAVE_MLOCKALL
+	/* Lock all pages into memory if requested.
+	 * This has to be done after daemon()/fork() so it works for child.
+	 * No need to do that in parent as it's very short-lived. */
+	if(do_mlock && mlockall(MCL_CURRENT | MCL_FUTURE) != 0) {
+		logger(LOG_ERR, _("System call `%s' failed: %s"), "mlockall",
+		   strerror(errno));
+		return 1;
+	}
+#endif
+
 	/* Setup sockets and open device. */
 
 	if(!setup_network())