Author: mimir
Date: 2006-07-09 12:54:56 +0000 (Sun, 09 Jul 2006)
New Revision: 16895

WebSVN: 
http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=16895

Log:
Add continue function and prevent from segfaulting (or unpredictable
behaviour) if composite context returned from _send function was NULL.


rafal


Modified:
   branches/SAMBA_4_0/source/libnet/libnet_lookup.c


Changeset:
Modified: branches/SAMBA_4_0/source/libnet/libnet_lookup.c
===================================================================
--- branches/SAMBA_4_0/source/libnet/libnet_lookup.c    2006-07-09 12:54:45 UTC 
(rev 16894)
+++ branches/SAMBA_4_0/source/libnet/libnet_lookup.c    2006-07-09 12:54:56 UTC 
(rev 16895)
@@ -32,11 +32,14 @@
 #include "libcli/finddcs.h"
 
 struct lookup_state {
-       struct composite_context *resolve_ctx;
        struct nbt_name hostname;
+       const char *address;
 };
 
 
+static void continue_name_resolved(struct composite_context *ctx);
+
+
 /**
  * Sends asynchronous Lookup request
  *
@@ -48,21 +51,31 @@
 {
        struct composite_context *c;
        struct lookup_state *s;
+       struct composite_context *cresolve_req;
        const char** methods;
 
-       if (!io) return NULL;
-
        /* allocate context and state structures */
        c = talloc_zero(NULL, struct composite_context);
-       if (c == NULL) goto failed;
+       if (c == NULL) return NULL;
 
        s = talloc_zero(c, struct lookup_state);
-       if (s == NULL) goto failed;
+       if (s == NULL) {
+               composite_error(c, NT_STATUS_NO_MEMORY);
+               return c;
+       }
        
        /* prepare event context */
        c->event_ctx = event_context_find(c);
-       if (c->event_ctx == NULL) goto failed;
+       if (c->event_ctx == NULL) {
+               composite_error(c, NT_STATUS_NO_MEMORY);
+               return c;
+       }
 
+       if (io == NULL || io->in.hostname == NULL) {
+               composite_error(c, NT_STATUS_INVALID_PARAMETER);
+               return c;
+       }
+
        /* parameters */
        s->hostname.name   = talloc_strdup(s, io->in.hostname);
        s->hostname.type   = io->in.type;
@@ -79,13 +92,25 @@
        c->state        = COMPOSITE_STATE_IN_PROGRESS;
 
        /* send resolve request */
-       s->resolve_ctx = resolve_name_send(&s->hostname, c->event_ctx, methods);
+       cresolve_req = resolve_name_send(&s->hostname, c->event_ctx, methods);
 
+       composite_continue(c, cresolve_req, continue_name_resolved, c);
+
        return c;
+}
 
-failed:
-       talloc_free(c);
-       return NULL;
+
+static void continue_name_resolved(struct composite_context *ctx)
+{
+       struct composite_context *c;
+       struct lookup_state *s;
+
+       c = talloc_get_type(ctx->async.private_data, struct composite_context);
+       s = talloc_get_type(c->private_data, struct lookup_state);
+
+       c->status = resolve_name_recv(ctx, s, &s->address);
+       
+       composite_done(c);
 }
 
 
@@ -103,16 +128,16 @@
 {
        NTSTATUS status;
        struct lookup_state *s;
-       const char *address;
 
-       s = talloc_get_type(c->private_data, struct lookup_state);
+       status = composite_wait(c);
+       if (NT_STATUS_IS_OK(status)) {
+               s = talloc_get_type(c->private_data, struct lookup_state);
 
-       status = resolve_name_recv(s->resolve_ctx, mem_ctx, &address);
-       if (NT_STATUS_IS_OK(status)) {
-               io->out.address = str_list_make(mem_ctx, address, NULL);
+               io->out.address = str_list_make(mem_ctx, s->address, NULL);
                NT_STATUS_HAVE_NO_MEMORY(io->out.address);
        }
 
+       talloc_free(c);
        return status;
 }
 
@@ -198,7 +223,7 @@
 }
 
 /**
- * Synchronous version of LookupPdc
+ * Synchronous version of LookupDCs
  */
 NTSTATUS libnet_LookupDCs(struct libnet_context *ctx, TALLOC_CTX *mem_ctx,
                          struct libnet_LookupDCs *io)

Reply via email to