Back-ported fix from 3.2 (mainly from Bo Yang <boyang@novell.com>)
[tprouty/samba.git] / source / nsswitch / winbindd_async.c
index 1a68005efc8b8c286d5cd96f3584c188fc9eb28a..ad136bdc0d783eaf437a523fd5e40b424ae78c3b 100644 (file)
@@ -687,40 +687,6 @@ static void name2gid_recv(TALLOC_CTX *mem_ctx, BOOL success,
 }
 #endif /* not used */
 
-struct lookupsid_state {
-       DOM_SID sid;    
-       void *caller_private_data;
-};
-
-
-static void lookupsid_recv2(TALLOC_CTX *mem_ctx, BOOL success,
-                          struct winbindd_response *response,
-                          void *c, void *private_data)
-{
-       void (*cont)(void *priv, BOOL succ, const char *dom_name,
-                    const char *name, enum lsa_SidType type) =
-               (void (*)(void *, BOOL, const char *, const char *,
-                         enum lsa_SidType))c;
-       struct lookupsid_state *s = talloc_get_type_abort(private_data, 
-                                                         struct lookupsid_state);
-
-       if (!success) {
-               DEBUG(5, ("Could not trigger lookupsid\n"));
-               cont(s->caller_private_data, False, NULL, NULL, SID_NAME_UNKNOWN);
-               return;
-       }
-
-       if (response->result != WINBINDD_OK) {
-               DEBUG(5, ("lookupsid (forest root) returned an error\n"));              
-               cont(s->caller_private_data, False, NULL, NULL, SID_NAME_UNKNOWN);
-               return;
-       }
-
-       cont(s->caller_private_data, True, response->data.name.dom_name,
-            response->data.name.name,
-            (enum lsa_SidType)response->data.name.type);
-}
-
 static void lookupsid_recv(TALLOC_CTX *mem_ctx, BOOL success,
                           struct winbindd_response *response,
                           void *c, void *private_data)
@@ -729,37 +695,20 @@ static void lookupsid_recv(TALLOC_CTX *mem_ctx, BOOL success,
                     const char *name, enum lsa_SidType type) =
                (void (*)(void *, BOOL, const char *, const char *,
                          enum lsa_SidType))c;
-       struct lookupsid_state *s = talloc_get_type_abort(private_data, 
-                                                         struct lookupsid_state);
 
        if (!success) {
                DEBUG(5, ("Could not trigger lookupsid\n"));
-               cont(s->caller_private_data, False, NULL, NULL, SID_NAME_UNKNOWN);
+               cont(private_data, False, NULL, NULL, SID_NAME_UNKNOWN);
                return;
        }
 
        if (response->result != WINBINDD_OK) {
-               /* Try again using the forest root */
-               struct winbindd_domain *root_domain = find_root_domain();
-               struct winbindd_request request;
-               
-               if ( !root_domain ) {
-                       DEBUG(5,("lookupsid_recv: unable to determine forest root\n"));
-                       cont(s->caller_private_data, False, NULL, NULL, SID_NAME_UNKNOWN);
-                       return;
-               }
-
-               ZERO_STRUCT(request);
-               request.cmd = WINBINDD_LOOKUPSID;
-               fstrcpy(request.data.sid, sid_string_static(&s->sid));
-
-               do_async_domain(mem_ctx, root_domain, &request, lookupsid_recv2,
-                               (void *)cont, s);
-
+               DEBUG(5, ("lookupsid returned an error\n"));
+               cont(private_data, False, NULL, NULL, SID_NAME_UNKNOWN);
                return;
        }
 
-       cont(s->caller_private_data, True, response->data.name.dom_name,
+       cont(private_data, True, response->data.name.dom_name,
             response->data.name.name,
             (enum lsa_SidType)response->data.name.type);
 }
@@ -773,7 +722,6 @@ void winbindd_lookupsid_async(TALLOC_CTX *mem_ctx, const DOM_SID *sid,
 {
        struct winbindd_domain *domain;
        struct winbindd_request request;
-       struct lookupsid_state *s;      
 
        domain = find_lookup_domain_from_sid(sid);
        if (domain == NULL) {
@@ -787,17 +735,8 @@ void winbindd_lookupsid_async(TALLOC_CTX *mem_ctx, const DOM_SID *sid,
        request.cmd = WINBINDD_LOOKUPSID;
        fstrcpy(request.data.sid, sid_string_static(sid));
 
-       if ( (s = TALLOC_ZERO_P(mem_ctx, struct lookupsid_state)) == NULL ) {
-               DEBUG(0, ("winbindd_lookupsid_async: talloc failed\n"));
-               cont(private_data, False, NULL, NULL, SID_NAME_UNKNOWN);
-               return;
-       }
-
-       sid_copy( &s->sid, sid );       
-       s->caller_private_data = private_data;  
-
        do_async_domain(mem_ctx, domain, &request, lookupsid_recv,
-                       (void *)cont, s);
+                       (void *)cont, private_data);
 }
 
 enum winbindd_result winbindd_dual_lookupsid(struct winbindd_domain *domain,
@@ -823,9 +762,8 @@ enum winbindd_result winbindd_dual_lookupsid(struct winbindd_domain *domain,
 
        /* Lookup the sid */
 
-       if (!winbindd_lookup_name_by_sid(state->mem_ctx, domain, &sid, 
-                                        &dom_name, &name, &type)) 
-       {
+       if (!winbindd_lookup_name_by_sid(state->mem_ctx, &sid, &dom_name, &name,
+                                        &type)) {
                TALLOC_FREE(dom_name);
                TALLOC_FREE(name);
                return WINBINDD_ERROR;
@@ -850,7 +788,6 @@ struct lookupname_state {
        void *caller_private_data;
 };
 
-
 static void lookupname_recv2(TALLOC_CTX *mem_ctx, BOOL success,
                            struct winbindd_response *response,
                            void *c, void *private_data)
@@ -859,9 +796,7 @@ static void lookupname_recv2(TALLOC_CTX *mem_ctx, BOOL success,
                     enum lsa_SidType type) =
                (void (*)(void *, BOOL, const DOM_SID *, enum lsa_SidType))c;
        DOM_SID sid;
-       struct lookupname_state *s = talloc_get_type_abort( private_data, 
-                                                           struct lookupname_state );
-       
+       struct lookupname_state *s = talloc_get_type_abort(private_data, struct lookupname_state);
 
        if (!success) {
                DEBUG(5, ("Could not trigger lookup_name\n"));
@@ -898,8 +833,7 @@ static void lookupname_recv(TALLOC_CTX *mem_ctx, BOOL success,
                     enum lsa_SidType type) =
                (void (*)(void *, BOOL, const DOM_SID *, enum lsa_SidType))c;
        DOM_SID sid;
-       struct lookupname_state *s = talloc_get_type_abort( private_data, 
-                                                           struct lookupname_state );  
+       struct lookupname_state *s = talloc_get_type_abort(private_data, struct lookupname_state);
 
        if (!success) {
                DEBUG(5, ("lookupname_recv: lookup_name() failed!\n"));
@@ -910,8 +844,8 @@ static void lookupname_recv(TALLOC_CTX *mem_ctx, BOOL success,
        if (response->result != WINBINDD_OK) {
                /* Try again using the forest root */
                struct winbindd_domain *root_domain = find_root_domain();
-               struct winbindd_request request;                
-               
+               struct winbindd_request request;
+
                if ( !root_domain ) {
                        DEBUG(5,("lookupname_recv: unable to determine forest root\n"));
                        cont(s->caller_private_data, False, NULL, SID_NAME_UNKNOWN);
@@ -920,9 +854,8 @@ static void lookupname_recv(TALLOC_CTX *mem_ctx, BOOL success,
 
                ZERO_STRUCT(request);
                request.cmd = WINBINDD_LOOKUPNAME;
-
-               fstrcpy( request.data.name.dom_name, s->dom_name );
-               fstrcpy( request.data.name.name, s->name );             
+               fstrcpy(request.data.name.dom_name, s->dom_name);
+               fstrcpy(request.data.name.name, s->name);
 
                do_async_domain(mem_ctx, root_domain, &request, lookupname_recv2,
                                (void *)cont, s);
@@ -956,7 +889,7 @@ void winbindd_lookupname_async(TALLOC_CTX *mem_ctx,
 {
        struct winbindd_request request;
        struct winbindd_domain *domain;
-       struct lookupname_state *s;     
+       struct lookupname_state *s;
 
        if ( (domain = find_lookup_domain_from_name(dom_name)) == NULL ) {
                DEBUG(5, ("Could not find domain for name %s\n", dom_name));
@@ -977,7 +910,12 @@ void winbindd_lookupname_async(TALLOC_CTX *mem_ctx,
 
        s->dom_name = talloc_strdup( s, dom_name );
        s->name     = talloc_strdup( s, name );
-       s->caller_private_data = private_data;  
+       if (!s->dom_name || !s->name) {
+               cont(private_data, False, NULL, SID_NAME_UNKNOWN);
+               return;
+       }
+
+       s->caller_private_data = private_data;
 
        do_async_domain(mem_ctx, domain, &request, lookupname_recv,
                        (void *)cont, s);
@@ -1494,6 +1432,12 @@ static void query_user_recv(TALLOC_CTX *mem_ctx, BOOL success,
                return;
        }
 
+       if (response->result != WINBINDD_OK) {
+               DEBUG(5, ("query_user returned an error\n"));
+               cont(private_data, False, NULL, NULL, NULL, NULL, -1, -1);
+               return;
+       }
+
        cont(private_data, True, response->data.user_info.acct_name,
             response->data.user_info.full_name,
             response->data.user_info.homedir,