[PATCH] make nsswitch and libwbclient thread safe

Volker Lendecke Volker.Lendecke at SerNet.DE
Mon Oct 29 16:28:37 UTC 2018


On Mon, Oct 29, 2018 at 09:20:57AM -0700, Jeremy Allison wrote:
> Ping for Ralph and Volker.
> 
> I'd love to get this into master if you both are
> happy with it !

Ralph has found that the nss_wrapper needs some fixes. Attached find
my patchset with my Reviewed-By: (really just finished). We can't put
that into Samba, because the nss_wrapper piece needs to wait for the
nss_wrapper team to get to the point where they have enough patches to
justify a release. Then we need a patch to upgrade the in-tree
nss_wrapper copy, and *then* we can start thinking about putting this
into Samba. We will start working on that process asap.

Volker

-- 
SerNet GmbH, Bahnhofsallee 1b, 37081 Göttingen
phone: +49-551-370000-0, fax: +49-551-370000-9
AG Göttingen, HRB 2816, GF: Dr. Johannes Loxen
http://www.sernet.de, mailto:kontakt at sernet.de
-------------- next part --------------
From 993ed34e430ee58ec2698ab7ee3aae18a6a06fdd Mon Sep 17 00:00:00 2001
From: Ralph Wuerthner <ralph.wuerthner at de.ibm.com>
Date: Fri, 19 Oct 2018 11:27:04 +0200
Subject: [PATCH 01/11] nwrap: fix nwrap_module_getpwnam_r

On success *pwdstp must point to pwdst, on error return NULL instead.

Signed-off-by: Ralph Wuerthner <ralph.wuerthner at de.ibm.com>
Reviewed-by: Volker Lendecke <vl at samba.org>
---
 third_party/nss_wrapper/nss_wrapper.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/third_party/nss_wrapper/nss_wrapper.c b/third_party/nss_wrapper/nss_wrapper.c
index 566d02ca34b..5049883dcf9 100644
--- a/third_party/nss_wrapper/nss_wrapper.c
+++ b/third_party/nss_wrapper/nss_wrapper.c
@@ -3836,6 +3836,7 @@ static int nwrap_module_getpwnam_r(struct nwrap_backend *b,
 	(void) pwdst; /* unused */
 	(void) pwdstp; /* unused */
 
+	*pwdstp = NULL;
 	if (!b->fns->_nss_getpwnam_r) {
 		return NSS_STATUS_NOTFOUND;
 	}
@@ -3843,6 +3844,7 @@ static int nwrap_module_getpwnam_r(struct nwrap_backend *b,
 	ret = b->fns->_nss_getpwnam_r(name, pwdst, buf, buflen, &errno);
 	switch (ret) {
 	case NSS_STATUS_SUCCESS:
+		*pwdstp = pwdst;
 		return 0;
 	case NSS_STATUS_NOTFOUND:
 		if (errno != 0) {
-- 
2.11.0


From a0e70a3d7de5af4af3c17916cdf75cb3319a5d87 Mon Sep 17 00:00:00 2001
From: Ralph Wuerthner <ralph.wuerthner at de.ibm.com>
Date: Fri, 19 Oct 2018 12:15:53 +0200
Subject: [PATCH 02/11] nwrap: fix nwrap_module_getpwuid_r

On success *pwdstp must point to pwdst, on error return NULL instead.

Signed-off-by: Ralph Wuerthner <ralph.wuerthner at de.ibm.com>
Reviewed-by: Volker Lendecke <vl at samba.org>
---
 third_party/nss_wrapper/nss_wrapper.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/third_party/nss_wrapper/nss_wrapper.c b/third_party/nss_wrapper/nss_wrapper.c
index 5049883dcf9..5352058ee11 100644
--- a/third_party/nss_wrapper/nss_wrapper.c
+++ b/third_party/nss_wrapper/nss_wrapper.c
@@ -3893,6 +3893,7 @@ static int nwrap_module_getpwuid_r(struct nwrap_backend *b,
 
 	(void) pwdstp; /* unused */
 
+	*pwdstp = NULL;
 	if (!b->fns->_nss_getpwuid_r) {
 		return ENOENT;
 	}
@@ -3900,6 +3901,7 @@ static int nwrap_module_getpwuid_r(struct nwrap_backend *b,
 	ret = b->fns->_nss_getpwuid_r(uid, pwdst, buf, buflen, &errno);
 	switch (ret) {
 	case NSS_STATUS_SUCCESS:
+		*pwdstp = pwdst;
 		return 0;
 	case NSS_STATUS_NOTFOUND:
 		if (errno != 0) {
-- 
2.11.0


From cc4270c6ec27ffd02c08cd0b8cb7cc8fb652b2ab Mon Sep 17 00:00:00 2001
From: Ralph Wuerthner <ralph.wuerthner at de.ibm.com>
Date: Fri, 19 Oct 2018 12:19:17 +0200
Subject: [PATCH 03/11] nwrap: fix nwrap_module_getpwent_r

On success *pwdstp must point to pwdst, on error return NULL instead.

Signed-off-by: Ralph Wuerthner <ralph.wuerthner at de.ibm.com>
Reviewed-by: Volker Lendecke <vl at samba.org>
---
 third_party/nss_wrapper/nss_wrapper.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/third_party/nss_wrapper/nss_wrapper.c b/third_party/nss_wrapper/nss_wrapper.c
index 5352058ee11..aae92c28129 100644
--- a/third_party/nss_wrapper/nss_wrapper.c
+++ b/third_party/nss_wrapper/nss_wrapper.c
@@ -3958,6 +3958,7 @@ static int nwrap_module_getpwent_r(struct nwrap_backend *b,
 
 	(void) pwdstp; /* unused */
 
+	*pwdstp = NULL;
 	if (!b->fns->_nss_getpwent_r) {
 		return ENOENT;
 	}
@@ -3965,6 +3966,7 @@ static int nwrap_module_getpwent_r(struct nwrap_backend *b,
 	ret = b->fns->_nss_getpwent_r(pwdst, buf, buflen, &errno);
 	switch (ret) {
 	case NSS_STATUS_SUCCESS:
+		*pwdstp = pwdst;
 		return 0;
 	case NSS_STATUS_NOTFOUND:
 		if (errno != 0) {
-- 
2.11.0


From f48298cf16d79f24d12a4f580509d23ee20427d7 Mon Sep 17 00:00:00 2001
From: Ralph Wuerthner <ralph.wuerthner at de.ibm.com>
Date: Fri, 19 Oct 2018 15:19:28 +0200
Subject: [PATCH 04/11] nwrap: fix nwrap_module_getgrnam_r

On success *grdstp must point to grdst, on error return NULL instead.

Signed-off-by: Ralph Wuerthner <ralph.wuerthner at de.ibm.com>
Reviewed-by: Volker Lendecke <vl at samba.org>
---
 third_party/nss_wrapper/nss_wrapper.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/third_party/nss_wrapper/nss_wrapper.c b/third_party/nss_wrapper/nss_wrapper.c
index aae92c28129..064194727b5 100644
--- a/third_party/nss_wrapper/nss_wrapper.c
+++ b/third_party/nss_wrapper/nss_wrapper.c
@@ -4053,6 +4053,7 @@ static int nwrap_module_getgrnam_r(struct nwrap_backend *b,
 
 	(void) grdstp; /* unused */
 
+	*grdstp = NULL;
 	if (!b->fns->_nss_getgrnam_r) {
 		return ENOENT;
 	}
@@ -4060,6 +4061,7 @@ static int nwrap_module_getgrnam_r(struct nwrap_backend *b,
 	ret = b->fns->_nss_getgrnam_r(name, grdst, buf, buflen, &errno);
 	switch (ret) {
 	case NSS_STATUS_SUCCESS:
+		*grdstp = grdst;
 		return 0;
 	case NSS_STATUS_NOTFOUND:
 		if (errno != 0) {
-- 
2.11.0


From e22b6e65391d928d988355262aecf2b7865e04a3 Mon Sep 17 00:00:00 2001
From: Ralph Wuerthner <ralph.wuerthner at de.ibm.com>
Date: Fri, 19 Oct 2018 15:22:23 +0200
Subject: [PATCH 05/11] nwrap: fix nwrap_module_getgrgid_r

On success *grdstp must point to grdst, on error return NULL instead.

Signed-off-by: Ralph Wuerthner <ralph.wuerthner at de.ibm.com>
Reviewed-by: Volker Lendecke <vl at samba.org>
---
 third_party/nss_wrapper/nss_wrapper.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/third_party/nss_wrapper/nss_wrapper.c b/third_party/nss_wrapper/nss_wrapper.c
index 064194727b5..0538c7919a8 100644
--- a/third_party/nss_wrapper/nss_wrapper.c
+++ b/third_party/nss_wrapper/nss_wrapper.c
@@ -4126,6 +4126,7 @@ static int nwrap_module_getgrgid_r(struct nwrap_backend *b,
 
 	(void) grdstp; /* unused */
 
+	*grdstp = NULL;
 	if (!b->fns->_nss_getgrgid_r) {
 		return ENOENT;
 	}
@@ -4133,6 +4134,7 @@ static int nwrap_module_getgrgid_r(struct nwrap_backend *b,
 	ret = b->fns->_nss_getgrgid_r(gid, grdst, buf, buflen, &errno);
 	switch (ret) {
 	case NSS_STATUS_SUCCESS:
+		*grdstp = grdst;
 		return 0;
 	case NSS_STATUS_NOTFOUND:
 		if (errno != 0) {
-- 
2.11.0


From 7ccdb98c91caf174ddc73bb5b0de49d12fe7d5fa Mon Sep 17 00:00:00 2001
From: Ralph Wuerthner <ralph.wuerthner at de.ibm.com>
Date: Fri, 19 Oct 2018 15:24:21 +0200
Subject: [PATCH 06/11] nwrap: fix nwrap_module_getgrent_r

On success *grdstp must point to grdst, on error return NULL instead.

Signed-off-by: Ralph Wuerthner <ralph.wuerthner at de.ibm.com>
Reviewed-by: Volker Lendecke <vl at samba.org>
---
 third_party/nss_wrapper/nss_wrapper.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/third_party/nss_wrapper/nss_wrapper.c b/third_party/nss_wrapper/nss_wrapper.c
index 0538c7919a8..d7839519159 100644
--- a/third_party/nss_wrapper/nss_wrapper.c
+++ b/third_party/nss_wrapper/nss_wrapper.c
@@ -4207,6 +4207,7 @@ static int nwrap_module_getgrent_r(struct nwrap_backend *b,
 
 	(void) grdstp; /* unused */
 
+	*grdstp = NULL;
 	if (!b->fns->_nss_getgrent_r) {
 		return ENOENT;
 	}
@@ -4214,6 +4215,7 @@ static int nwrap_module_getgrent_r(struct nwrap_backend *b,
 	ret = b->fns->_nss_getgrent_r(grdst, buf, buflen, &errno);
 	switch (ret) {
 	case NSS_STATUS_SUCCESS:
+		*grdstp = grdst;
 		return 0;
 	case NSS_STATUS_NOTFOUND:
 		if (errno != 0) {
-- 
2.11.0


From c923641c92238b0443714d232306cd2c79cb5154 Mon Sep 17 00:00:00 2001
From: Ralph Wuerthner <ralph.wuerthner at de.ibm.com>
Date: Tue, 2 Oct 2018 10:58:12 +0200
Subject: [PATCH 07/11] nsswitch: use goto to have only one function return

Signed-off-by: Ralph Wuerthner <ralph.wuerthner at de.ibm.com>
Reviewed-by: Volker Lendecke <vl at samba.org>
---
 nsswitch/wb_common.c | 12 ++++++++----
 1 file changed, 8 insertions(+), 4 deletions(-)

diff --git a/nsswitch/wb_common.c b/nsswitch/wb_common.c
index 42b341b8c1c..c2f67d7a556 100644
--- a/nsswitch/wb_common.c
+++ b/nsswitch/wb_common.c
@@ -731,10 +731,12 @@ NSS_STATUS winbindd_request_response(struct winbindd_context *ctx,
 	}
 
 	status = winbindd_send_request(ctx, req_type, 0, request);
-	if (status != NSS_STATUS_SUCCESS)
-		return (status);
+	if (status != NSS_STATUS_SUCCESS) {
+		goto out;
+	}
 	status = winbindd_get_response(ctx, response);
 
+out:
 	return status;
 }
 
@@ -750,10 +752,12 @@ NSS_STATUS winbindd_priv_request_response(struct winbindd_context *ctx,
 	}
 
 	status = winbindd_send_request(ctx, req_type, 1, request);
-	if (status != NSS_STATUS_SUCCESS)
-		return (status);
+	if (status != NSS_STATUS_SUCCESS) {
+		goto out;
+	}
 	status = winbindd_get_response(ctx, response);
 
+out:
 	return status;
 }
 
-- 
2.11.0


From deed9b57ef55b3b968554d8f14159704fe15f3bd Mon Sep 17 00:00:00 2001
From: Ralph Wuerthner <ralph.wuerthner at de.ibm.com>
Date: Tue, 2 Oct 2018 13:35:16 +0200
Subject: [PATCH 08/11] nsswitch: make wb_global_ctx private add add get/put
 functions to access global context

Signed-off-by: Ralph Wuerthner <ralph.wuerthner at de.ibm.com>
Reviewed-by: Volker Lendecke <vl at samba.org>
---
 nsswitch/wb_common.c | 41 +++++++++++++++++++++++++++++++++--------
 1 file changed, 33 insertions(+), 8 deletions(-)

diff --git a/nsswitch/wb_common.c b/nsswitch/wb_common.c
index c2f67d7a556..9ba74c35a6d 100644
--- a/nsswitch/wb_common.c
+++ b/nsswitch/wb_common.c
@@ -35,11 +35,22 @@ struct winbindd_context {
 	pid_t our_pid;		/* calling process pid */
 };
 
-static struct winbindd_context wb_global_ctx = {
-	.winbindd_fd = -1,
-	.is_privileged = false,
-	.our_pid = 0
-};
+static struct winbindd_context *get_wb_global_ctx(void)
+{
+	static struct winbindd_context wb_global_ctx = {
+		.winbindd_fd = -1,
+		.is_privileged = false,
+		.our_pid = 0
+	};
+
+	return &wb_global_ctx;
+}
+
+static void put_wb_global_ctx(void)
+{
+	/* noop for now */
+	return;
+}
 
 /* Free a response structure */
 
@@ -93,7 +104,11 @@ __attribute__((destructor))
 #endif
 static void winbind_destructor(void)
 {
-	winbind_close_sock(&wb_global_ctx);
+	struct winbindd_context *ctx;
+
+	ctx = get_wb_global_ctx();
+	winbind_close_sock(ctx);
+	put_wb_global_ctx();
 }
 
 #define CONNECT_TIMEOUT 30
@@ -725,9 +740,11 @@ NSS_STATUS winbindd_request_response(struct winbindd_context *ctx,
 				     struct winbindd_response *response)
 {
 	NSS_STATUS status = NSS_STATUS_UNAVAIL;
+	bool release_global_ctx = false;
 
 	if (ctx == NULL) {
-		ctx = &wb_global_ctx;
+		ctx = get_wb_global_ctx();
+		release_global_ctx = true;
 	}
 
 	status = winbindd_send_request(ctx, req_type, 0, request);
@@ -737,6 +754,9 @@ NSS_STATUS winbindd_request_response(struct winbindd_context *ctx,
 	status = winbindd_get_response(ctx, response);
 
 out:
+	if (release_global_ctx) {
+		put_wb_global_ctx();
+	}
 	return status;
 }
 
@@ -746,9 +766,11 @@ NSS_STATUS winbindd_priv_request_response(struct winbindd_context *ctx,
 					  struct winbindd_response *response)
 {
 	NSS_STATUS status = NSS_STATUS_UNAVAIL;
+	bool release_global_ctx = false;
 
 	if (ctx == NULL) {
-		ctx = &wb_global_ctx;
+		ctx = get_wb_global_ctx();
+		release_global_ctx = true;
 	}
 
 	status = winbindd_send_request(ctx, req_type, 1, request);
@@ -758,6 +780,9 @@ NSS_STATUS winbindd_priv_request_response(struct winbindd_context *ctx,
 	status = winbindd_get_response(ctx, response);
 
 out:
+	if (release_global_ctx) {
+		put_wb_global_ctx();
+	}
 	return status;
 }
 
-- 
2.11.0


From 5a5331bf3c4d50a9abf800b9dac8ea212f3e5b74 Mon Sep 17 00:00:00 2001
From: Ralph Wuerthner <ralph.wuerthner at de.ibm.com>
Date: Tue, 2 Oct 2018 13:41:00 +0200
Subject: [PATCH 09/11] nsswitch: protect access to wb_global_ctx by a mutex

This change will make libwbclient thread safe for all API calls not using a
context. Especially there are no more conflicts with threads using nsswitch
and libwbclient in parallel.

Signed-off-by: Ralph Wuerthner <ralph.wuerthner at de.ibm.com>
Reviewed-by: Volker Lendecke <vl at samba.org>
---
 nsswitch/wb_common.c | 15 ++++++++++++++-
 1 file changed, 14 insertions(+), 1 deletion(-)

diff --git a/nsswitch/wb_common.c b/nsswitch/wb_common.c
index 9ba74c35a6d..59370aa5bbc 100644
--- a/nsswitch/wb_common.c
+++ b/nsswitch/wb_common.c
@@ -27,6 +27,10 @@
 #include "system/select.h"
 #include "winbind_client.h"
 
+#if HAVE_PTHREAD_H
+#include <pthread.h>
+#endif
+
 /* Global context */
 
 struct winbindd_context {
@@ -35,6 +39,10 @@ struct winbindd_context {
 	pid_t our_pid;		/* calling process pid */
 };
 
+#if HAVE_PTHREAD
+static pthread_mutex_t wb_global_ctx_mutex = PTHREAD_MUTEX_INITIALIZER;
+#endif
+
 static struct winbindd_context *get_wb_global_ctx(void)
 {
 	static struct winbindd_context wb_global_ctx = {
@@ -43,12 +51,17 @@ static struct winbindd_context *get_wb_global_ctx(void)
 		.our_pid = 0
 	};
 
+#if HAVE_PTHREAD
+	pthread_mutex_lock(&wb_global_ctx_mutex);
+#endif
 	return &wb_global_ctx;
 }
 
 static void put_wb_global_ctx(void)
 {
-	/* noop for now */
+#if HAVE_PTHREAD
+	pthread_mutex_unlock(&wb_global_ctx_mutex);
+#endif
 	return;
 }
 
-- 
2.11.0


From 9df57391cd0c4a1e360209b0699e03c73b306519 Mon Sep 17 00:00:00 2001
From: Ralph Wuerthner <ralph.wuerthner at de.ibm.com>
Date: Fri, 5 Oct 2018 13:53:30 +0200
Subject: [PATCH 10/11] nsswitch: add test for parallel NSS & libwbclient calls

Signed-off-by: Ralph Wuerthner <ralph.wuerthner at de.ibm.com>
Reviewed-by: Volker Lendecke <vl at samba.org>
---
 nsswitch/stress-nss-libwbclient.c | 156 ++++++++++++++++++++++++++++++++++++++
 nsswitch/wscript_build            |   7 ++
 2 files changed, 163 insertions(+)
 create mode 100644 nsswitch/stress-nss-libwbclient.c

diff --git a/nsswitch/stress-nss-libwbclient.c b/nsswitch/stress-nss-libwbclient.c
new file mode 100644
index 00000000000..cf85ff3f817
--- /dev/null
+++ b/nsswitch/stress-nss-libwbclient.c
@@ -0,0 +1,156 @@
+/*
+   Unix SMB/CIFS implementation.
+
+   Stress test for parallel NSS & libwbclient calls.
+
+   Copyright (C) Ralph Wuerthner 2018
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stdbool.h>
+#include <pthread.h>
+#include <string.h>
+#include <unistd.h>
+#include <time.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <pwd.h>
+#include <wbclient.h>
+
+#define RUNTIME 10
+
+struct thread_state {
+	const char *username;
+	time_t timeout;
+	pthread_mutex_t lock;
+	bool fail;
+	int nss_loop_count;
+	int wbc_loop_count;
+};
+
+static void *query_nss_thread(void *ptr)
+{
+	struct thread_state *state = ptr;
+	char buf[1024];
+	int rc;
+	struct passwd pwd, *result;
+
+	while (time(NULL) < state->timeout) {
+		rc = getpwnam_r(state->username,
+				&pwd,
+				buf,
+				sizeof(buf),
+				&result);
+		if (rc != 0 || result == NULL) {
+			pthread_mutex_lock(&state->lock);
+			state->fail = true;
+			pthread_mutex_unlock(&state->lock);
+			fprintf(stderr,
+				"getpwnam_r failed with rc='%s' result=%p\n",
+				strerror(rc),
+				result);
+			break;
+		}
+		state->nss_loop_count++;
+		pthread_mutex_lock(&state->lock);
+		if (state->fail) {
+			pthread_mutex_unlock(&state->lock);
+			break;
+		}
+		pthread_mutex_unlock(&state->lock);
+	}
+	return NULL;
+}
+
+static void *query_wbc_thread(void *ptr)
+{
+	struct thread_state *state = ptr;
+	struct passwd *ppwd;
+	wbcErr wbc_status;
+
+	while (time(NULL) < state->timeout) {
+		wbc_status = wbcGetpwnam(state->username, &ppwd);
+		if (!WBC_ERROR_IS_OK(wbc_status)) {
+			pthread_mutex_lock(&state->lock);
+			state->fail = true;
+			pthread_mutex_unlock(&state->lock);
+			fprintf(stderr,
+				"wbcGetpwnam failed with %s\n",
+				wbcErrorString(wbc_status));
+			break;
+		}
+		wbcFreeMemory(ppwd);
+		state->wbc_loop_count++;
+		pthread_mutex_lock(&state->lock);
+		if (state->fail) {
+			pthread_mutex_unlock(&state->lock);
+			break;
+		}
+		pthread_mutex_unlock(&state->lock);
+	}
+	return NULL;
+}
+
+int main(int argc, char *argv[])
+{
+	int rc, n;
+	struct thread_state state;
+	pthread_t threads[2];
+
+	if (argc < 2 ) {
+		fprintf(stderr,"%s: missing domain user\n", argv[0]);
+		return 1;
+	}
+
+	state.username = argv[1];
+	state.timeout = time(NULL) + RUNTIME;
+	pthread_mutex_init(&state.lock, NULL);
+	state.fail = false;
+	state.nss_loop_count = 0;
+	state.wbc_loop_count = 0;
+
+	printf("query domain user '%s'\n", state.username);
+
+	/* create query threads */
+	rc = pthread_create(&threads[0], NULL, query_nss_thread, &state);
+	if (rc != 0) {
+		fprintf(stderr,
+			"creating NSS thread failed: %s\n",
+			strerror(rc));
+		exit(1);
+	}
+	rc = pthread_create(&threads[1], NULL, query_wbc_thread, &state);
+	if (rc != 0) {
+		fprintf(stderr,
+			"creating libwbclient thread failed: %s\n",
+			strerror(rc));
+		exit(1);
+	}
+
+	/* wait for query threads to terminate */
+	for (n = 0; n < 2; n++) {
+		pthread_join(threads[n], NULL);
+	}
+
+	fprintf(state.fail ? stderr: stdout,
+		"test %s with %i NSS and %i libwbclient calls\n",
+		state.fail ? "failed" : "passed",
+		state.nss_loop_count,
+		state.wbc_loop_count);
+
+	return state.fail;
+}
diff --git a/nsswitch/wscript_build b/nsswitch/wscript_build
index ff98372fd6e..6acc4a19b9b 100644
--- a/nsswitch/wscript_build
+++ b/nsswitch/wscript_build
@@ -17,6 +17,13 @@ bld.SAMBA_BINARY('nsstest',
                  install=False
 		 )
 
+if bld.CONFIG_SET('HAVE_PTHREAD'):
+    bld.SAMBA_BINARY('stress-nss-libwbclient',
+		     source='stress-nss-libwbclient.c',
+		     deps='wbclient',
+		     install=False
+		     )
+
 # The nss_wrapper code relies strictly on the linux implementation and
 # name, so compile but do not install a copy under this name.
 bld.SAMBA_LIBRARY('nss_wrapper_winbind',
-- 
2.11.0


From 50fd2de30f13afedc991677c9a43f44873b5c9c6 Mon Sep 17 00:00:00 2001
From: Volker Lendecke <vl at samba.org>
Date: Fri, 5 Oct 2018 16:27:48 +0200
Subject: [PATCH 11/11] nsswitch: Run nsswitch thread test

Signed-off-by: Volker Lendecke <vl at samba.org>
---
 source3/script/tests/test_libwbclient_threads.sh | 17 +++++++++++++++++
 source3/selftest/tests.py                        |  7 +++++++
 2 files changed, 24 insertions(+)
 create mode 100755 source3/script/tests/test_libwbclient_threads.sh

diff --git a/source3/script/tests/test_libwbclient_threads.sh b/source3/script/tests/test_libwbclient_threads.sh
new file mode 100755
index 00000000000..1f8d041b7af
--- /dev/null
+++ b/source3/script/tests/test_libwbclient_threads.sh
@@ -0,0 +1,17 @@
+#!/bin/sh
+
+if [ $# -lt 2 ] ; then
+cat <<EOF
+Usage: test_libwbclient_threads.sh DOMAIN USERNAME
+EOF
+exit 1;
+fi
+
+DOMAIN="$1"
+USERNAME="$2"
+shift 2
+
+incdir=`dirname $0`/../../../testprogs/blackbox
+. $incdir/subunit.sh
+
+testit "libwbclient-threads" "$BINDIR/stress-nss-libwbclient" "$DOMAIN/$USERNAME"
diff --git a/source3/selftest/tests.py b/source3/selftest/tests.py
index 75190c49b2b..e990aaf10e7 100755
--- a/source3/selftest/tests.py
+++ b/source3/selftest/tests.py
@@ -385,6 +385,13 @@ if with_pthreadpool and have_ldwrap:
     plantestsuite("samba3.pthreadpool_cmocka", "none",
                   [os.path.join(bindir(), "pthreadpooltest_cmocka")])
 
+if with_pthreadpool:
+    plantestsuite("samba3.libwbclient_threads",
+                  "nt4_member",
+                  [os.path.join(samba3srcdir,
+                                "script/tests/test_libwbclient_threads.sh"),
+                   "$DOMAIN", "$DC_USERNAME"])
+
 plantestsuite("samba3.async_req", "nt4_dc",
               [os.path.join(samba3srcdir, "script/tests/test_async_req.sh")])
 
-- 
2.11.0



More information about the samba-technical mailing list