The branch, master has been updated
       via  42b2026 Second part of fix for bug 8953 - winbind can hang as 
nbt_getdc() has no timeout.
       via  d673402 Fix bug #8953 - winbind can hang as nbt_getdc() has no 
timeout.
      from  f9e4105 s3:smbd: remove unused 'connection_struct->used'

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 42b2026a83983ad17bfd1651f2256b38e9fe8dad
Author: Herb Lewis <[email protected]>
Date:   Tue May 22 16:40:17 2012 -0700

    Second part of fix for bug 8953 - winbind can hang as nbt_getdc() has no 
timeout.
    
    If we're running with SEC_ADS and we don't get a cldap response from
    the server when querying its name, don't fall back to NetBIOS requests
    as they're unlikely to succeed.
    
    Signed-off-by: Jeremy Allison <[email protected]>
    
    Autobuild-User: Jeremy Allison <[email protected]>
    Autobuild-Date: Wed May 23 03:49:36 CEST 2012 on sn-devel-104

commit d6734029924e849dcd336728dde8d24141e8ccc3
Author: Jeremy Allison <[email protected]>
Date:   Tue May 22 16:25:14 2012 -0700

    Fix bug #8953 - winbind can hang as nbt_getdc() has no timeout.
    
    Add a timeout_in_seconds parameter to nbt_getdc() to make it fail
    after that time with NT_STATUS_IO_TIMEOUT.

-----------------------------------------------------------------------

Summary of changes:
 source3/libsmb/clidgram.c      |   12 ++++++++++++
 source3/libsmb/clidgram.h      |    1 +
 source3/libsmb/dsgetdcname.c   |    2 +-
 source3/winbindd/winbindd_cm.c |    3 ++-
 4 files changed, 16 insertions(+), 2 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/libsmb/clidgram.c b/source3/libsmb/clidgram.c
index 04964bd..cfed067 100644
--- a/source3/libsmb/clidgram.c
+++ b/source3/libsmb/clidgram.c
@@ -437,6 +437,7 @@ NTSTATUS nbt_getdc_recv(struct tevent_req *req, TALLOC_CTX 
*mem_ctx,
 }
 
 NTSTATUS nbt_getdc(struct messaging_context *msg_ctx,
+                  uint32_t timeout_in_seconds,
                   const struct sockaddr_storage *dc_addr,
                   const char *domain_name,
                   const struct dom_sid *sid,
@@ -449,6 +450,8 @@ NTSTATUS nbt_getdc(struct messaging_context *msg_ctx,
        TALLOC_CTX *frame = talloc_stackframe();
        struct tevent_context *ev;
        struct tevent_req *req;
+       enum tevent_req_state err_state;
+       uint64_t error;
        NTSTATUS status = NT_STATUS_NO_MEMORY;
 
        ev = tevent_context_init(frame);
@@ -460,12 +463,21 @@ NTSTATUS nbt_getdc(struct messaging_context *msg_ctx,
        if (req == NULL) {
                goto fail;
        }
+       if (!tevent_req_set_endtime(req, ev,
+                       timeval_current_ofs(timeout_in_seconds, 0))) {
+               goto fail;
+       }
        if (!tevent_req_poll_ntstatus(req, ev, &status)) {
                goto fail;
        }
        status = nbt_getdc_recv(req, mem_ctx, pnt_version, dc_name,
                                samlogon_response);
  fail:
+       if (ev && req &&
+                       tevent_req_is_error(req, &err_state, &error) &&
+                       err_state == TEVENT_REQ_TIMED_OUT) {
+               status = NT_STATUS_IO_TIMEOUT;
+       }
        TALLOC_FREE(frame);
        return status;
 }
diff --git a/source3/libsmb/clidgram.h b/source3/libsmb/clidgram.h
index a449724..6cd6222 100644
--- a/source3/libsmb/clidgram.h
+++ b/source3/libsmb/clidgram.h
@@ -37,6 +37,7 @@ NTSTATUS nbt_getdc_recv(struct tevent_req *req, TALLOC_CTX 
*mem_ctx,
                        uint32_t *nt_version, const char **dc_name,
                        struct netlogon_samlogon_response **samlogon_response);
 NTSTATUS nbt_getdc(struct messaging_context *msg_ctx,
+                  uint32_t timeout_in_seconds,
                   const struct sockaddr_storage *dc_addr,
                   const char *domain_name,
                   const struct dom_sid *sid,
diff --git a/source3/libsmb/dsgetdcname.c b/source3/libsmb/dsgetdcname.c
index 5df833f..05be272 100644
--- a/source3/libsmb/dsgetdcname.c
+++ b/source3/libsmb/dsgetdcname.c
@@ -946,7 +946,7 @@ static NTSTATUS process_dc_netbios(TALLOC_CTX *mem_ctx,
                        return NT_STATUS_UNSUCCESSFUL;
                }
 
-               status = nbt_getdc(msg_ctx, &dclist[i].ss, domain_name,
+               status = nbt_getdc(msg_ctx, 10, &dclist[i].ss, domain_name,
                                   NULL, nt_version,
                                   mem_ctx, &nt_version, &dc_name, &r);
                if (NT_STATUS_IS_OK(status)) {
diff --git a/source3/winbindd/winbindd_cm.c b/source3/winbindd/winbindd_cm.c
index 4188b5e..f36ccea 100644
--- a/source3/winbindd/winbindd_cm.c
+++ b/source3/winbindd/winbindd_cm.c
@@ -1158,10 +1158,11 @@ static bool dcip_to_name(TALLOC_CTX *mem_ctx,
                }
 
                ads_destroy( &ads );
+               return false;
        }
 #endif
 
-       status = nbt_getdc(winbind_messaging_context(), pss, domain->name,
+       status = nbt_getdc(winbind_messaging_context(), 10, pss, domain->name,
                           &domain->sid, nt_version, mem_ctx, &nt_version,
                           &dc_name, NULL);
        if (NT_STATUS_IS_OK(status)) {


-- 
Samba Shared Repository

Reply via email to