[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