[PATCH] Run 'samba' daemon in foreground

Andreas Schneider asn at samba.org
Mon Nov 27 18:43:01 UTC 2017


Hi,

attached is a patch to address an issue with systemd and Samba daemons running 
in notify mode. In this mode we should not double fork. So we should start the 
daemons with --foreground. Also systemd will take care of the process group we 
should not handle that in Samba.

For this I've added --foreground to the 'samba' daemon.


Review is much appreciated. If OK please push.


Thanks,


	Andreas


-- 
Andreas Schneider                   GPG-ID: CC014E3D
Samba Team                             asn at samba.org
www.samba.org
-------------- next part --------------
>From f57fb622dc5c6d4c2abbab3a388053bb446105a7 Mon Sep 17 00:00:00 2001
From: Andreas Schneider <asn at samba.org>
Date: Wed, 15 Nov 2017 10:00:52 +0100
Subject: [PATCH 1/3] s4:samba: Do not segfault if we run into issues

Signed-off-by: Andreas Schneider <asn at samba.org>
---
 source4/smbd/server.c | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/source4/smbd/server.c b/source4/smbd/server.c
index eef0f7bf3d2..f107350e1af 100644
--- a/source4/smbd/server.c
+++ b/source4/smbd/server.c
@@ -105,8 +105,16 @@ static void cleanup_tmp_files(struct loadparm_context *lp_ctx)
 {
 	char *path;
 	TALLOC_CTX *mem_ctx = talloc_new(NULL);
+	if (mem_ctx == NULL) {
+		exit_daemon("Failed to create memory context",
+			    ENOMEM);
+	}
 
 	path = smbd_tmp_path(mem_ctx, lp_ctx, NULL);
+	if (path == NULL) {
+		exit_daemon("Failed to cleanup temporary files",
+			    EINVAL);
+	}
 
 	recursive_delete(path);
 	talloc_free(mem_ctx);
-- 
2.15.0


>From a7f005419bb8c95618af76433bd990ecd200df02 Mon Sep 17 00:00:00 2001
From: Andreas Schneider <asn at samba.org>
Date: Fri, 10 Nov 2017 09:18:18 +0100
Subject: [PATCH 2/3] s4:samba: Allow samba daemon to run in foreground

BUG: https://bugzilla.samba.org/show_bug.cgi?id=13129

Signed-off-by: Andreas Schneider <asn at samba.org>
---
 source4/smbd/server.c | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/source4/smbd/server.c b/source4/smbd/server.c
index f107350e1af..006f76bc859 100644
--- a/source4/smbd/server.c
+++ b/source4/smbd/server.c
@@ -367,6 +367,7 @@ static int binary_smbd_main(const char *binary_name,
 				const char *argv[])
 {
 	bool opt_daemon = false;
+	bool opt_fork = true;
 	bool opt_interactive = false;
 	bool opt_no_process_group = false;
 	int opt;
@@ -382,6 +383,7 @@ static int binary_smbd_main(const char *binary_name,
 	struct stat st;
 	enum {
 		OPT_DAEMON = 1000,
+		OPT_FOREGROUND,
 		OPT_INTERACTIVE,
 		OPT_PROCESS_MODEL,
 		OPT_SHOW_BUILD,
@@ -391,6 +393,8 @@ static int binary_smbd_main(const char *binary_name,
 		POPT_AUTOHELP
 		{"daemon", 'D', POPT_ARG_NONE, NULL, OPT_DAEMON,
 		 "Become a daemon (default)", NULL },
+		{"foreground", 'F', POPT_ARG_NONE, NULL, OPT_FOREGROUND,
+		 "Run the daemon in foreground", NULL },
 		{"interactive",	'i', POPT_ARG_NONE, NULL, OPT_INTERACTIVE,
 		 "Run interactive (not a daemon)", NULL},
 		{"model", 'M', POPT_ARG_STRING,	NULL, OPT_PROCESS_MODEL,
@@ -417,6 +421,9 @@ static int binary_smbd_main(const char *binary_name,
 		case OPT_DAEMON:
 			opt_daemon = true;
 			break;
+		case OPT_FOREGROUND:
+			opt_fork = false;
+			break;
 		case OPT_INTERACTIVE:
 			opt_interactive = true;
 			break;
@@ -443,7 +450,7 @@ static int binary_smbd_main(const char *binary_name,
 			"not allowed together with -D|--daemon\n\n");
 		poptPrintUsage(pc, stderr, 0);
 		return 1;
-	} else if (!opt_interactive) {
+	} else if (!opt_interactive && !opt_fork) {
 		/* default is --daemon */
 		opt_daemon = true;
 	}
@@ -480,7 +487,7 @@ static int binary_smbd_main(const char *binary_name,
 
 	if (opt_daemon) {
 		DBG_NOTICE("Becoming a daemon.\n");
-		become_daemon(true, false, false);
+		become_daemon(opt_fork, opt_no_process_group, false);
 	}
 
 	/* Create the memory context to hang everything off. */
-- 
2.15.0


>From 4b3964f012758894af2a38b3d8578050df91d670 Mon Sep 17 00:00:00 2001
From: Andreas Schneider <asn at samba.org>
Date: Fri, 10 Nov 2017 09:32:27 +0100
Subject: [PATCH 3/3] systemd: Start processes in forground and without a
 process group

We should not double fork in notify mode or systemd think something
during startup will be wrong and send SIGTERM to the process. So
sometimes the daemon will not start up correctly.

systemd will also handle the process group.

BUG: https://bugzilla.samba.org/show_bug.cgi?id=13129

Signed-off-by: Andreas Schneider <asn at samba.org>
---
 packaging/systemd/nmb.service     | 2 +-
 packaging/systemd/samba.service   | 2 +-
 packaging/systemd/smb.service     | 2 +-
 packaging/systemd/winbind.service | 2 +-
 4 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/packaging/systemd/nmb.service b/packaging/systemd/nmb.service
index 992c0cd9d2b..71c93d6088b 100644
--- a/packaging/systemd/nmb.service
+++ b/packaging/systemd/nmb.service
@@ -7,7 +7,7 @@ Type=notify
 NotifyAccess=all
 PIDFile=/run/nmbd.pid
 EnvironmentFile=-/etc/sysconfig/samba
-ExecStart=/usr/sbin/nmbd $NMBDOPTIONS
+ExecStart=/usr/sbin/nmbd --foreground --no-process-group $NMBDOPTIONS
 ExecReload=/usr/bin/kill -HUP $MAINPID
 LimitCORE=infinity
 
diff --git a/packaging/systemd/samba.service b/packaging/systemd/samba.service
index 824f89c2030..1b64c3b779d 100644
--- a/packaging/systemd/samba.service
+++ b/packaging/systemd/samba.service
@@ -8,7 +8,7 @@ NotifyAccess=all
 PIDFile=/run/samba.pid
 LimitNOFILE=16384
 EnvironmentFile=-/etc/sysconfig/samba
-ExecStart=/usr/sbin/samba $SAMBAOPTIONS
+ExecStart=/usr/sbin/samba --foreground --no-process-group $SAMBAOPTIONS
 ExecReload=/usr/bin/kill -HUP $MAINPID
 
 [Install]
diff --git a/packaging/systemd/smb.service b/packaging/systemd/smb.service
index 6053a5caaa5..adf6684c7d9 100644
--- a/packaging/systemd/smb.service
+++ b/packaging/systemd/smb.service
@@ -8,7 +8,7 @@ NotifyAccess=all
 PIDFile=/run/smbd.pid
 LimitNOFILE=16384
 EnvironmentFile=-/etc/sysconfig/samba
-ExecStart=/usr/sbin/smbd $SMBDOPTIONS
+ExecStart=/usr/sbin/smbd --foreground --no-process-group $SMBDOPTIONS
 ExecReload=/usr/bin/kill -HUP $MAINPID
 LimitCORE=infinity
 
diff --git a/packaging/systemd/winbind.service b/packaging/systemd/winbind.service
index c511488166e..46b3797251d 100644
--- a/packaging/systemd/winbind.service
+++ b/packaging/systemd/winbind.service
@@ -7,7 +7,7 @@ Type=notify
 NotifyAccess=all
 PIDFile=/run/winbindd.pid
 EnvironmentFile=-/etc/sysconfig/samba
-ExecStart=/usr/sbin/winbindd "$WINBINDOPTIONS"
+ExecStart=/usr/sbin/winbindd --foreground --no-process-group "$WINBINDOPTIONS"
 ExecReload=/usr/bin/kill -HUP $MAINPID
 LimitCORE=infinity
 
-- 
2.15.0



More information about the samba-technical mailing list