The branch, master has been updated
       via  114fbc3 s3: Fix a valgrind error
       via  5a6368f s3:winbind: Convert WINBINDD_WINS_BYIP to the async API
      from  2ce68d9 Make samba4.drs.fsmo.python knownfail

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


- Log -----------------------------------------------------------------
commit 114fbc385cbf00f2736a6d7a49447ab816dd5a7f
Author: Volker Lendecke <v...@samba.org>
Date:   Sun Jun 5 13:56:39 2011 +0200

    s3: Fix a valgrind error
    
    For me this fixes
    
    ==1950== Invalid read of size 4
    ==1950==    at 0x81EBED5: GUID_equal (uuid.c:239)
    ==1950==    by 0x81E51AB: ndr_syntax_id_equal (ndr_misc.c:35)
    ==1950==    by 0x82EB0D1: get_iface_from_syntax (rpc_common.c:160)
    ==1950==    by 0x82EB25E: get_pipe_name_from_syntax (rpc_common.c:179)
    ==1950==    by 0x8509E4F: close_policy_by_pipe (rpc_handles.c:322)
    ==1950==    by 0x8507941: close_internal_rpc_pipe_hnd (rpc_ncacn_np.c:109)
    ==1950==    by 0x468270: _talloc_free_internal (talloc.c:826)
    ==1950==    by 0x467EE0: _talloc_free_internal (talloc.c:1268)
    ==1950==    by 0x467EE0: _talloc_free_internal (talloc.c:1268)
    ==1950==    by 0x467EE0: _talloc_free_internal (talloc.c:1268)
    ==1950==    by 0x467EE0: _talloc_free_internal (talloc.c:1268)
    ==1950==    by 0x80E6487: sam_trusted_domains (winbindd_samr.c:406)
    ==1950==  Address 0x687ea4 is 20 bytes inside a block of size 40 free'd
    ==1950==    at 0x58CDC: free (in 
/usr/local/lib/valgrind/vgpreload_memcheck-x86-freebsd.so)
    ==1950==    by 0x8507812: free_pipe_rpc_context_internal (rpc_ncacn_np.c:74)
    ==1950==    by 0x8507936: close_internal_rpc_pipe_hnd (rpc_ncacn_np.c:106)
    ==1950==    by 0x468270: _talloc_free_internal (talloc.c:826)
    ==1950==    by 0x467EE0: _talloc_free_internal (talloc.c:1268)
    ==1950==    by 0x467EE0: _talloc_free_internal (talloc.c:1268)
    ==1950==    by 0x467EE0: _talloc_free_internal (talloc.c:1268)
    ==1950==    by 0x467EE0: _talloc_free_internal (talloc.c:1268)
    ==1950==    by 0x80E6487: sam_trusted_domains (winbindd_samr.c:406)
    ==1950==    by 0x80C2F85: trusted_domains (winbindd_cache.c:2820)
    ==1950==    by 0x80D5188: winbindd_dual_list_trusted_domains 
(winbindd_misc.c:162)
    ==1950==    by 0x80E987F: wb_child_request_trigger (winbindd_dual.c:437)
    ==1950==
    
    Andreas, Guenther, please check!
    
    Autobuild-User: Volker Lendecke <vlen...@samba.org>
    Autobuild-Date: Sun Jun  5 13:19:39 CEST 2011 on sn-devel-104

commit 5a6368f1e2a4348fdcdc062b2546eb45bf943aed
Author: Volker Lendecke <v...@samba.org>
Date:   Sun Jun 5 11:30:43 2011 +0200

    s3:winbind: Convert WINBINDD_WINS_BYIP to the async API

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

Summary of changes:
 source3/Makefile.in                   |    1 +
 source3/rpc_server/rpc_ncacn_np.c     |    4 +-
 source3/winbindd/winbindd.c           |    3 +-
 source3/winbindd/winbindd_proto.h     |    7 ++-
 source3/winbindd/winbindd_wins.c      |   71 -----------------
 source3/winbindd/winbindd_wins_byip.c |  135 +++++++++++++++++++++++++++++++++
 source3/wscript_build                 |    1 +
 7 files changed, 147 insertions(+), 75 deletions(-)
 create mode 100644 source3/winbindd/winbindd_wins_byip.c


Changeset truncated at 500 lines:

diff --git a/source3/Makefile.in b/source3/Makefile.in
index f95fbeb..f7458d3 100644
--- a/source3/Makefile.in
+++ b/source3/Makefile.in
@@ -1349,6 +1349,7 @@ WINBINDD_OBJ1 = \
                winbindd/winbindd_misc.o  \
                winbindd/winbindd_cm.o    \
                winbindd/winbindd_wins.o  \
+               winbindd/winbindd_wins_byip.o  \
                winbindd/winbindd_msrpc.o \
                winbindd/winbindd_rpc.o   \
                winbindd/winbindd_reconnect.o \
diff --git a/source3/rpc_server/rpc_ncacn_np.c 
b/source3/rpc_server/rpc_ncacn_np.c
index 4446578..e578c77 100644
--- a/source3/rpc_server/rpc_ncacn_np.c
+++ b/source3/rpc_server/rpc_ncacn_np.c
@@ -103,11 +103,11 @@ int close_internal_rpc_pipe_hnd(struct pipes_struct *p)
 
        TALLOC_FREE(p->auth.auth_ctx);
 
-       free_pipe_rpc_context_internal( p->contexts );
-
        /* Free the handles database. */
        close_policy_by_pipe(p);
 
+       free_pipe_rpc_context_internal( p->contexts );
+
        DLIST_REMOVE(InternalPipes, p);
 
        ZERO_STRUCTP(p);
diff --git a/source3/winbindd/winbindd.c b/source3/winbindd/winbindd.c
index 677f766..8c6d91e 100644
--- a/source3/winbindd/winbindd.c
+++ b/source3/winbindd/winbindd.c
@@ -453,7 +453,6 @@ static struct winbindd_dispatch_table {
        /* WINS functions */
 
        { WINBINDD_WINS_BYNAME, winbindd_wins_byname, "WINS_BYNAME" },
-       { WINBINDD_WINS_BYIP, winbindd_wins_byip, "WINS_BYIP" },
 
        /* End of list */
 
@@ -545,6 +544,8 @@ static struct winbindd_async_dispatch_table 
async_nonpriv_table[] = {
        { WINBINDD_PAM_CHNG_PSWD_AUTH_CRAP, "PAM_CHNG_PSWD_AUTH_CRAP",
          winbindd_pam_chng_pswd_auth_crap_send,
          winbindd_pam_chng_pswd_auth_crap_recv },
+       { WINBINDD_WINS_BYIP, "PING",
+         winbindd_wins_byip_send, winbindd_wins_byip_recv },
 
        { 0, NULL, NULL, NULL }
 };
diff --git a/source3/winbindd/winbindd_proto.h 
b/source3/winbindd/winbindd_proto.h
index ab61223..e0a582e 100644
--- a/source3/winbindd/winbindd_proto.h
+++ b/source3/winbindd/winbindd_proto.h
@@ -436,7 +436,6 @@ bool parse_sidlist(TALLOC_CTX *mem_ctx, const char *sidstr,
 
 /* The following definitions come from winbindd/winbindd_wins.c  */
 
-void winbindd_wins_byip(struct winbindd_cli_state *state);
 void winbindd_wins_byname(struct winbindd_cli_state *state);
 
 struct tevent_req *wb_ping_send(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
@@ -861,6 +860,12 @@ struct tevent_req *winbindd_sids_to_xids_send(TALLOC_CTX 
*mem_ctx,
                                              struct winbindd_request *request);
 NTSTATUS winbindd_sids_to_xids_recv(struct tevent_req *req,
                                    struct winbindd_response *response);
+struct tevent_req *winbindd_wins_byip_send(TALLOC_CTX *mem_ctx,
+                                          struct tevent_context *ev,
+                                          struct winbindd_cli_state *cli,
+                                          struct winbindd_request *request);
+NTSTATUS winbindd_wins_byip_recv(struct tevent_req *req,
+                                struct winbindd_response *presp);
 
 
 /* The following definitions come from winbindd/winbindd_samr.c  */
diff --git a/source3/winbindd/winbindd_wins.c b/source3/winbindd/winbindd_wins.c
index 5ac6109..a468b0f 100644
--- a/source3/winbindd/winbindd_wins.c
+++ b/source3/winbindd/winbindd_wins.c
@@ -27,26 +27,6 @@
 #undef DBGC_CLASS
 #define DBGC_CLASS DBGC_WINBIND
 
-static struct node_status *lookup_byaddr_backend(TALLOC_CTX *mem_ctx,
-                                                const char *addr, int *count)
-{
-       struct sockaddr_storage ss;
-       struct nmb_name nname;
-       struct node_status *result;
-       NTSTATUS status;
-
-       make_nmb_name(&nname, "*", 0);
-       if (!interpret_string_addr(&ss, addr, AI_NUMERICHOST)) {
-               return NULL;
-       }
-       status = node_status_query(mem_ctx, &nname, &ss,
-                                  &result, count, NULL);
-       if (!NT_STATUS_IS_OK(status)) {
-               return NULL;
-       }
-       return result;
-}
-
 static struct sockaddr_storage *lookup_byname_backend(TALLOC_CTX *mem_ctx,
                                                      const char *name,
                                                      int *count)
@@ -95,57 +75,6 @@ static struct sockaddr_storage 
*lookup_byname_backend(TALLOC_CTX *mem_ctx,
        return return_ss;
 }
 
-/* Get hostname from IP  */
-
-void winbindd_wins_byip(struct winbindd_cli_state *state)
-{
-       fstring response;
-       int i, count, maxlen, size;
-       struct node_status *status;
-
-       /* Ensure null termination */
-       
state->request->data.winsreq[sizeof(state->request->data.winsreq)-1]='\0';
-
-       DEBUG(3, ("[%5lu]: wins_byip %s\n", (unsigned long)state->pid,
-               state->request->data.winsreq));
-
-       *response = '\0';
-       maxlen = sizeof(response) - 1;
-
-       if ((status = lookup_byaddr_backend(
-                    state->mem_ctx, state->request->data.winsreq, &count))) {
-           size = strlen(state->request->data.winsreq);
-           if (size > maxlen) {
-               TALLOC_FREE(status);
-               request_error(state);
-               return;
-           }
-           fstrcat(response,state->request->data.winsreq);
-           fstrcat(response,"\t");
-           for (i = 0; i < count; i++) {
-               /* ignore group names */
-               if (status[i].flags & 0x80) continue;
-               if (status[i].type == 0x20) {
-                       size = sizeof(status[i].name) + strlen(response);
-                       if (size > maxlen) {
-                           TALLOC_FREE(status);
-                           request_error(state);
-                           return;
-                       }
-                       fstrcat(response, status[i].name);
-                       fstrcat(response, " ");
-               }
-           }
-           /* make last character a newline */
-           response[strlen(response)-1] = '\n';
-           TALLOC_FREE(status);
-       }
-       strlcpy(state->response->data.winsresp,
-                       response,
-                       sizeof(state->response->data.winsresp));
-       request_ok(state);
-}
-
 /* Get IP from hostname */
 
 void winbindd_wins_byname(struct winbindd_cli_state *state)
diff --git a/source3/winbindd/winbindd_wins_byip.c 
b/source3/winbindd/winbindd_wins_byip.c
new file mode 100644
index 0000000..4ae1b82
--- /dev/null
+++ b/source3/winbindd/winbindd_wins_byip.c
@@ -0,0 +1,135 @@
+/*
+   Unix SMB/CIFS implementation.
+   async implementation of WINBINDD_WINS_BYIP
+   Copyright (C) Volker Lendecke 2011
+
+   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 "includes.h"
+#include "winbindd.h"
+#include "librpc/gen_ndr/ndr_wbint_c.h"
+#include "libsmb/nmblib.h"
+
+struct winbindd_wins_byip_state {
+       struct nmb_name star;
+       struct sockaddr_storage addr;
+       fstring response;
+};
+
+static void winbindd_wins_byip_done(struct tevent_req *subreq);
+
+struct tevent_req *winbindd_wins_byip_send(TALLOC_CTX *mem_ctx,
+                                          struct tevent_context *ev,
+                                          struct winbindd_cli_state *cli,
+                                          struct winbindd_request *request)
+{
+       struct tevent_req *req, *subreq;
+       struct winbindd_wins_byip_state *state;
+
+       req = tevent_req_create(mem_ctx, &state,
+                               struct winbindd_wins_byip_state);
+       if (req == NULL) {
+               return NULL;
+       }
+
+       /* Ensure null termination */
+       request->data.winsreq[sizeof(request->data.winsreq)-1]='\0';
+
+       fstr_sprintf(state->response, "%s\t", request->data.winsreq);
+
+       DEBUG(3, ("[%5lu]: wins_byip %s\n", (unsigned long)cli->pid,
+                 request->data.winsreq));
+
+       make_nmb_name(&state->star, "*", 0);
+
+       if (!interpret_string_addr(&state->addr, request->data.winsreq,
+                                  AI_NUMERICHOST)) {
+               tevent_req_nterror(req, NT_STATUS_INVALID_PARAMETER);
+               return tevent_req_post(req, ev);
+       }
+
+       subreq = node_status_query_send(state, ev, &state->star,
+                                       &state->addr);
+       if (tevent_req_nomem(subreq, req)) {
+               return tevent_req_post(req, ev);
+       }
+       tevent_req_set_callback(subreq, winbindd_wins_byip_done, req);
+       return req;
+}
+
+static void winbindd_wins_byip_done(struct tevent_req *subreq)
+{
+       struct tevent_req *req = tevent_req_callback_data(
+               subreq, struct tevent_req);
+       struct winbindd_wins_byip_state *state = tevent_req_data(
+               req, struct winbindd_wins_byip_state);
+       struct node_status *names;
+       int i, num_names;
+       NTSTATUS status;
+
+       status = node_status_query_recv(subreq, talloc_tos(), &names,
+                                       &num_names, NULL);
+       TALLOC_FREE(subreq);
+       if (tevent_req_nterror(req, status)) {
+               return;
+       }
+
+       for (i=0; i<num_names; i++) {
+               size_t size;
+               /*
+                * ignore group names
+                */
+               if (names[i].flags & 0x80) {
+                       continue;
+               }
+               /*
+                * Only report 0x20
+                */
+               if (names[i].type != 0x20) {
+                       continue;
+               }
+
+               DEBUG(10, ("got name %s\n", names[i].name));
+
+               size = strlen(names[i].name + strlen(state->response));
+               if (size > sizeof(state->response) - 1) {
+                       DEBUG(10, ("To much data\n"));
+                       tevent_req_nterror(req, STATUS_BUFFER_OVERFLOW);
+                       return;
+               }
+               fstrcat(state->response, names[i].name);
+               fstrcat(state->response, " ");
+       }
+       state->response[strlen(state->response)-1] = '\n';
+
+       DEBUG(10, ("response: %s", state->response));
+
+       TALLOC_FREE(names);
+       tevent_req_done(req);
+}
+
+NTSTATUS winbindd_wins_byip_recv(struct tevent_req *req,
+                                struct winbindd_response *presp)
+{
+       struct winbindd_wins_byip_state *state = tevent_req_data(
+               req, struct winbindd_wins_byip_state);
+       NTSTATUS status;
+
+       if (tevent_req_is_nterror(req, &status)) {
+               return status;
+       }
+       fstrcpy(presp->data.winsresp, state->response);
+       return NT_STATUS_OK;
+}
diff --git a/source3/wscript_build b/source3/wscript_build
index 834c7f5..4fd7a7b 100755
--- a/source3/wscript_build
+++ b/source3/wscript_build
@@ -255,6 +255,7 @@ WINBINDD_SRC1 = '''winbindd/winbindd.c
                    winbindd/winbindd_misc.c
                    winbindd/winbindd_cm.c
                    winbindd/winbindd_wins.c
+                   winbindd/winbindd_wins_byip.c
                    winbindd/winbindd_msrpc.c
                    winbindd/winbindd_rpc.c
                    winbindd/winbindd_reconnect.c


-- 
Samba Shared Repository

Reply via email to