winbind Backtrace if NSS_STATUS_UNAVAIL
Jeremy Allison
jra at samba.org
Mon Sep 19 18:45:38 GMT 2005
On Mon, Sep 19, 2005 at 04:26:31PM +0200, Ingo Steuwer wrote:
> Hi
>
> I've had a problem on a Memberserver where Samba 3.0.20 gives an Backtrace in
> log.smbd[0] after there were problems in the communication with the Samba-PDC
> in this network.
>
> The Backtrace itself is a result of recursive calls of
> winbindd_request_response in wb_common.c. If the result is
> "NT_STATUS_UNAVAIL" it loops to wait for a connection (up to 10 times) and
> calls winbindd_send_request, which calls through write_sock and
> winbind_open_pipe_sock again winbindd_request_response. This ends up in
> arbitrary deep recursions.
Ok - can you try this patch please ? I'll check into 3.0 and HEAD
so please let me know if this fixes your problems.
Thanks,
Jeremy.
-------------- next part --------------
Index: nsswitch/winbindd_nss.h
===================================================================
--- nsswitch/winbindd_nss.h (revision 10320)
+++ nsswitch/winbindd_nss.h (working copy)
@@ -172,6 +172,8 @@
/* This is a flag that can only be sent from parent to child */
#define WBFLAG_IS_PRIVILEGED 0x0400
+/* Flag to say this is a winbindd internal send - don't recurse. */
+#define WBFLAG_RECURSE 0x0800
/* Winbind request structure */
Index: nsswitch/winbind_client.h
===================================================================
--- nsswitch/winbind_client.h (revision 10320)
+++ nsswitch/winbind_client.h (working copy)
@@ -8,8 +8,7 @@
NSS_STATUS winbindd_request_response(int req_type,
struct winbindd_request *request,
struct winbindd_response *response);
-int winbind_open_pipe_sock(void);
-int write_sock(void *buffer, int count);
+int write_sock(void *buffer, int count, int recursing);
int read_reply(struct winbindd_response *response);
void close_sock(void);
void free_response(struct winbindd_response *response);
Index: nsswitch/wb_common.c
===================================================================
--- nsswitch/wb_common.c (revision 10320)
+++ nsswitch/wb_common.c (working copy)
@@ -284,7 +284,7 @@
/* Connect to winbindd socket */
-int winbind_open_pipe_sock(void)
+static int winbind_open_pipe_sock(int recursing)
{
#ifdef HAVE_UNIXSOCKET
static pid_t our_pid;
@@ -302,12 +302,17 @@
return winbindd_fd;
}
+ if (recursing) {
+ return -1;
+ }
+
if ((winbindd_fd = winbind_named_pipe_sock(WINBINDD_SOCKET_DIR)) == -1) {
return -1;
}
/* version-check the socket */
+ request.flags = WBFLAG_RECURSE;
if ((winbindd_request_response(WINBINDD_INTERFACE_VERSION, &request, &response) != NSS_STATUS_SUCCESS) || (response.data.interface_version != WINBIND_INTERFACE_VERSION)) {
close_sock();
return -1;
@@ -315,6 +320,7 @@
/* try and get priv pipe */
+ request.flags = WBFLAG_RECURSE;
if (winbindd_request_response(WINBINDD_PRIV_PIPE_DIR, &request, &response) == NSS_STATUS_SUCCESS) {
int fd;
if ((fd = winbind_named_pipe_sock(response.extra_data)) != -1) {
@@ -333,7 +339,7 @@
/* Write data to winbindd socket */
-int write_sock(void *buffer, int count)
+int write_sock(void *buffer, int count, int recursing)
{
int result, nwritten;
@@ -341,7 +347,7 @@
restart:
- if (winbind_open_pipe_sock() == -1) {
+ if (winbind_open_pipe_sock(recursing) == -1) {
return -1;
}
@@ -534,7 +540,7 @@
init_request(request, req_type);
- if (write_sock(request, sizeof(*request)) == -1) {
+ if (write_sock(request, sizeof(*request), request->flags & WBFLAG_RECURSE) == -1) {
return NSS_STATUS_UNAVAIL;
}
Index: nsswitch/pam_winbind.c
===================================================================
--- nsswitch/pam_winbind.c (revision 10320)
+++ nsswitch/pam_winbind.c (working copy)
@@ -106,7 +106,7 @@
/* Fill in request and send down pipe */
init_request(request, req_type);
- if (write_sock(request, sizeof(*request)) == -1) {
+ if (write_sock(request, sizeof(*request), 0) == -1) {
_pam_log(LOG_ERR, "write to socket failed!");
close_sock();
return PAM_SERVICE_ERR;
More information about the samba-technical
mailing list