s4:libnet: let libnet_rpc_userinfo_send() take tevent_context/dcerpc_binding_handle
authorStefan Metzmacher <metze@samba.org>
Tue, 14 Jan 2014 11:11:17 +0000 (12:11 +0100)
committerGünther Deschner <gd@samba.org>
Thu, 16 Jan 2014 15:22:51 +0000 (16:22 +0100)
This avoids usage/dereferencing 'struct dcerpc_pipe'.

Signed-off-by: Stefan Metzmacher <metze@samba.org>
Reviewed-by: Guenther Deschner <gd@samba.org>
source4/libnet/libnet_user.c
source4/libnet/userinfo.c
source4/torture/libnet/userinfo.c

index 1a736524542666f0ee5041c27ccbe7950473c898..38378a21d480adc81633899cac6b023a778dd959 100644 (file)
@@ -423,7 +423,9 @@ struct composite_context *libnet_ModifyUser_send(struct libnet_context *ctx,
        s->user_info.in.domain_handle = ctx->samr.handle;
        s->user_info.in.level         = level;
 
-       userinfo_req = libnet_rpc_userinfo_send(ctx->samr.pipe, s, &s->user_info, monitor);
+       userinfo_req = libnet_rpc_userinfo_send(s, s->ctx->event_ctx,
+                                               ctx->samr.samr_handle,
+                                               &s->user_info, monitor);
        if (composite_nomem(userinfo_req, c)) return c;
 
        composite_continue(c, userinfo_req, continue_rpc_userinfo, c);
@@ -455,7 +457,9 @@ static void continue_domain_open_modify(struct composite_context *ctx)
        s->user_info.in.username       = s->r.in.user_name;
        s->user_info.in.level          = level;
 
-       userinfo_req = libnet_rpc_userinfo_send(s->ctx->samr.pipe, s, &s->user_info, s->monitor_fn);
+       userinfo_req = libnet_rpc_userinfo_send(s, s->ctx->event_ctx,
+                                               s->ctx->samr.samr_handle,
+                                               &s->user_info, s->monitor_fn);
        if (composite_nomem(userinfo_req, c)) return;
        
        composite_continue(c, userinfo_req, continue_rpc_userinfo, c);
@@ -686,8 +690,8 @@ struct composite_context* libnet_UserInfo_send(struct libnet_context *ctx,
                s->userinfo.in.level = 21;
 
                /* send the request */
-               info_req = libnet_rpc_userinfo_send(s->ctx->samr.pipe,
-                                                   s,
+               info_req = libnet_rpc_userinfo_send(s, s->ctx->event_ctx,
+                                                   s->ctx->samr.samr_handle,
                                                    &s->userinfo,
                                                    s->monitor_fn);
                if (composite_nomem(info_req, c)) return c;
@@ -743,8 +747,8 @@ static void continue_domain_open_info(struct composite_context *ctx)
                s->userinfo.in.level = 21;
 
                /* send the request */
-               info_req = libnet_rpc_userinfo_send(s->ctx->samr.pipe,
-                                                   s,
+               info_req = libnet_rpc_userinfo_send(s, s->ctx->event_ctx,
+                                                   s->ctx->samr.samr_handle,
                                                    &s->userinfo,
                                                    s->monitor_fn);
                if (composite_nomem(info_req, c)) return;
@@ -784,7 +788,9 @@ static void continue_name_found(struct composite_context *ctx)
        s->userinfo.in.level = 21;
 
        /* send the request */
-       info_req = libnet_rpc_userinfo_send(s->ctx->samr.pipe, s, &s->userinfo, s->monitor_fn);
+       info_req = libnet_rpc_userinfo_send(s, s->ctx->event_ctx,
+                                           s->ctx->samr.samr_handle,
+                                           &s->userinfo, s->monitor_fn);
        if (composite_nomem(info_req, c)) return;
 
        /* set the next stage */
index 9530f9efdb5c457ad4c69083bc94352cf919f037..f8bdfbb9c2f2df9fde3f6550573bec755385a428 100644 (file)
@@ -30,7 +30,7 @@
 
 
 struct userinfo_state {
-       struct dcerpc_pipe        *pipe;
+       struct dcerpc_binding_handle *binding_handle;
        struct policy_handle      domain_handle;
        struct policy_handle      user_handle;
        uint16_t                  level;
@@ -109,7 +109,7 @@ static void continue_userinfo_lookup(struct tevent_req *subreq)
 
        /* send request */
        subreq = dcerpc_samr_OpenUser_r_send(s, c->event_ctx,
-                                            s->pipe->binding_handle,
+                                            s->binding_handle,
                                             &s->openuser);
        if (composite_nomem(subreq, c)) return;
 
@@ -160,7 +160,7 @@ static void continue_userinfo_openuser(struct tevent_req *subreq)
        
        /* queue rpc call, set event handling and new state */
        subreq = dcerpc_samr_QueryUserInfo_r_send(s, c->event_ctx,
-                                                 s->pipe->binding_handle,
+                                                 s->binding_handle,
                                                  &s->queryuserinfo);
        if (composite_nomem(subreq, c)) return;
        
@@ -211,7 +211,7 @@ static void continue_userinfo_getuser(struct tevent_req *subreq)
        
        /* queue rpc call, set event handling and new state */
        subreq = dcerpc_samr_Close_r_send(s, c->event_ctx,
-                                         s->pipe->binding_handle,
+                                         s->binding_handle,
                                          &s->samrclose);
        if (composite_nomem(subreq, c)) return;
        
@@ -263,8 +263,9 @@ static void continue_userinfo_closeuser(struct tevent_req *subreq)
  * @param p dce/rpc call pipe 
  * @param io arguments and results of the call
  */
-struct composite_context *libnet_rpc_userinfo_send(struct dcerpc_pipe *p,
-                                                  TALLOC_CTX *mem_ctx,
+struct composite_context *libnet_rpc_userinfo_send(TALLOC_CTX *mem_ctx,
+                                                  struct tevent_context *ev,
+                                                  struct dcerpc_binding_handle *b,
                                                   struct libnet_rpc_userinfo *io,
                                                   void (*monitor)(struct monitor_msg*))
 {
@@ -273,9 +274,9 @@ struct composite_context *libnet_rpc_userinfo_send(struct dcerpc_pipe *p,
        struct dom_sid *sid;
        struct tevent_req *subreq;
 
-       if (!p || !io) return NULL;
+       if (!b || !io) return NULL;
        
-       c = composite_create(mem_ctx, dcerpc_event_context(p));
+       c = composite_create(mem_ctx, ev);
        if (c == NULL) return c;
        
        s = talloc_zero(c, struct userinfo_state);
@@ -284,7 +285,7 @@ struct composite_context *libnet_rpc_userinfo_send(struct dcerpc_pipe *p,
        c->private_data = s;
 
        s->level         = io->in.level;
-       s->pipe          = p;
+       s->binding_handle= b;
        s->domain_handle = io->in.domain_handle;
        s->monitor_fn    = monitor;
 
@@ -299,7 +300,7 @@ struct composite_context *libnet_rpc_userinfo_send(struct dcerpc_pipe *p,
                
                /* send request */
                subreq = dcerpc_samr_OpenUser_r_send(s, c->event_ctx,
-                                                    p->binding_handle,
+                                                    s->binding_handle,
                                                     &s->openuser);
                if (composite_nomem(subreq, c)) return c;
 
@@ -321,7 +322,7 @@ struct composite_context *libnet_rpc_userinfo_send(struct dcerpc_pipe *p,
                
                /* send request */
                subreq = dcerpc_samr_LookupNames_r_send(s, c->event_ctx,
-                                                       p->binding_handle,
+                                                       s->binding_handle,
                                                        &s->lookup);
                if (composite_nomem(subreq, c)) return c;
                
@@ -375,6 +376,7 @@ NTSTATUS libnet_rpc_userinfo(struct dcerpc_pipe *p,
                             TALLOC_CTX *mem_ctx,
                             struct libnet_rpc_userinfo *io)
 {
-       struct composite_context *c = libnet_rpc_userinfo_send(p, mem_ctx, io, NULL);
+       struct composite_context *c = libnet_rpc_userinfo_send(mem_ctx, p->conn->event_ctx,
+                                                              p->binding_handle, io, NULL);
        return libnet_rpc_userinfo_recv(c, mem_ctx, io);
 }
index 3d592b3de7e24d0b0f2130fd453b3218cbe7837a..0a6efb029f9cb19ed714a4c82fcb65dc964a1e18 100644 (file)
@@ -79,13 +79,15 @@ static bool test_userinfo_async(struct torture_context *tctx,
 
        user_sid = dom_sid_add_rid(mem_ctx, domain_sid, *rid);
 
+       ZERO_STRUCT(user);
+
        user.in.domain_handle = *domain_handle;
        user.in.sid           = dom_sid_string(mem_ctx, user_sid);
        user.in.level         = level;       /* this should be extended */
 
        torture_comment(tctx, "Testing async libnet_rpc_userinfo (SID argument)\n");
 
-       c = libnet_rpc_userinfo_send(p, mem_ctx, &user, msg_handler);
+       c = libnet_rpc_userinfo_send(mem_ctx, tctx->ev, p->binding_handle, &user, msg_handler);
        torture_assert(tctx, c != NULL, "Failed to call async libnet_rpc_userinfo_send");
 
        status = libnet_rpc_userinfo_recv(c, mem_ctx, &user);
@@ -100,7 +102,7 @@ static bool test_userinfo_async(struct torture_context *tctx,
 
        torture_comment(tctx, "Testing async libnet_rpc_userinfo (username argument)\n");
 
-       c = libnet_rpc_userinfo_send(p, mem_ctx, &user, msg_handler);
+       c = libnet_rpc_userinfo_send(mem_ctx, tctx->ev, p->binding_handle, &user, msg_handler);
        torture_assert(tctx, c != NULL, "Failed to call async libnet_rpc_userinfo_send");
 
        status = libnet_rpc_userinfo_recv(c, mem_ctx, &user);