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).
This commit is contained in:
parent
cdf7f13c31
commit
6be5d4f5b6
1 changed files with 16 additions and 14 deletions
30
src/tincd.c
30
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())
|
||||
|
|
Loading…
Reference in a new issue