r395: BUG 1232: patch from landonf@opendarwin.org (Landon Fuller) to fix
authorGerald Carter <jerry@samba.org>
Wed, 28 Apr 2004 20:07:51 +0000 (20:07 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 15:51:21 +0000 (10:51 -0500)
user/group enumeration on systems whose libc does not call setgrent()
before trying to enumerate users (i.e. FreeBSD 5.2)

source/nsswitch/winbindd.h
source/nsswitch/winbindd_group.c
source/nsswitch/winbindd_user.c

index e884ea83800843b9cb27610974923106dab84833..751f6f3700f03b2fa46d138a52e64fe04855f5fd 100644 (file)
@@ -46,6 +46,8 @@ struct winbindd_cli_state {
 
        struct winbindd_request request;          /* Request from client */
        struct winbindd_response response;        /* Respose to client */
+       BOOL getpwent_initialized;                /* Has getpwent_state been initialized? */
+       BOOL getgrent_initialized;                /* Has getgrent_state been initialized? */
        struct getent_state *getpwent_state;      /* State for getpwent() */
        struct getent_state *getgrent_state;      /* State for getgrent() */
 };
index ec77d2db34351ad9c79f5ba9ca8174f0cff8a31e..4800ab20cfacdbe354ad3936be4fdb196b4c8044 100644 (file)
@@ -472,6 +472,8 @@ enum winbindd_result winbindd_setgrent(struct winbindd_cli_state *state)
                DLIST_ADD(state->getgrent_state, domain_state);
        }
        
+       state->getgrent_initialized = True;
+
        return WINBINDD_OK;
 }
 
@@ -482,6 +484,7 @@ enum winbindd_result winbindd_endgrent(struct winbindd_cli_state *state)
        DEBUG(3, ("[%5lu]: endgrent\n", (unsigned long)state->pid));
 
        free_getent_state(state->getgrent_state);
+       state->getgrent_initialized = False;
        state->getgrent_state = NULL;
        
        return WINBINDD_OK;
@@ -632,6 +635,9 @@ enum winbindd_result winbindd_getgrent(struct winbindd_cli_state *state)
 
        group_list = (struct winbindd_gr *)state->response.extra_data;
 
+       if (!state->getgrent_initialized)
+               winbindd_setgrent(state);
+
        if (!(ent = state->getgrent_state))
                return WINBINDD_ERROR;
 
index d10fd5664bafe7085badfa13581bdde0d7370ae5..40c398755d100fd2481a654cf7b18443447679b5 100644 (file)
@@ -360,6 +360,8 @@ enum winbindd_result winbindd_setpwent(struct winbindd_cli_state *state)
                DLIST_ADD(state->getpwent_state, domain_state);
        }
         
+       state->getpwent_initialized = True;
+        
        return WINBINDD_OK;
 }
 
@@ -370,6 +372,7 @@ enum winbindd_result winbindd_endpwent(struct winbindd_cli_state *state)
        DEBUG(3, ("[%5lu]: endpwent\n", (unsigned long)state->pid));
 
        free_getent_state(state->getpwent_state);    
+       state->getpwent_initialized = False;
        state->getpwent_state = NULL;
         
        return WINBINDD_OK;
@@ -501,6 +504,9 @@ enum winbindd_result winbindd_getpwent(struct winbindd_cli_state *state)
               sizeof(struct winbindd_pw));
 
        user_list = (struct winbindd_pw *)state->response.extra_data;
+
+       if (!state->getpwent_initialized)
+               winbindd_setpwent(state);
        
        if (!(ent = state->getpwent_state))
                return WINBINDD_ERROR;