nwrap: catch NULL list in nwrap_add_hname_add_to_existing
[kai/samba-autobuild/.git] / nsswitch / winbind_nss_linux.c
index 2b51a8e15dbf6de4c7d848b745c53ab189e173f3..3099413ec70597c5d858a08c34973cc8e8dd734c 100644 (file)
@@ -71,6 +71,31 @@ NSS_STATUS _nss_winbind_uidtosid(uid_t uid, char **sid, char *buffer,
 NSS_STATUS _nss_winbind_gidtosid(gid_t gid, char **sid, char *buffer,
                                 size_t buflen, int *errnop);
 
+/*************************************************************************
+ ************************************************************************/
+
+#ifdef DEBUG_NSS
+static const char *nss_err_str(NSS_STATUS ret)
+{
+       switch (ret) {
+               case NSS_STATUS_TRYAGAIN:
+                       return "NSS_STATUS_TRYAGAIN";
+               case NSS_STATUS_SUCCESS:
+                       return "NSS_STATUS_SUCCESS";
+               case NSS_STATUS_NOTFOUND:
+                       return "NSS_STATUS_NOTFOUND";
+               case NSS_STATUS_UNAVAIL:
+                       return "NSS_STATUS_UNAVAIL";
+#ifdef NSS_STATUS_RETURN
+               case NSS_STATUS_RETURN:
+                       return "NSS_STATUS_RETURN";
+#endif
+               default:
+                       return "UNKNOWN RETURN CODE!!!!!!!";
+       }
+}
+#endif
+
 /* Prototypes from wb_common.c */
 
 /* Allocate some space from the nss static buffer.  The buffer and buflen
@@ -105,8 +130,8 @@ static bool next_token_alloc(const char **ptr,
                                 char **pp_buff,
                                 const char *sep)
 {
-       char *s;
-       char *saved_s;
+       const char *s;
+       const char *saved_s;
        char *pbuf;
        bool quoted;
        size_t len=1;
@@ -116,7 +141,7 @@ static bool next_token_alloc(const char **ptr,
                return(false);
        }
 
-       s = (char *)*ptr;
+       s = *ptr;
 
        /* default to simple separators */
        if (!sep) {
@@ -262,7 +287,7 @@ static NSS_STATUS fill_pwent(struct passwd *result,
    Return NSS_STATUS_TRYAGAIN if we run out of memory. */
 
 static NSS_STATUS fill_grent(struct group *result, struct winbindd_gr *gr,
-                     char *gr_mem, char **buffer, size_t *buflen)
+                     const char *gr_mem, char **buffer, size_t *buflen)
 {
        char *name;
        int i;
@@ -297,7 +322,7 @@ static NSS_STATUS fill_grent(struct group *result, struct winbindd_gr *gr,
 
        /* Group membership */
 
-       if ((gr->num_gr_mem < 0) || !gr_mem) {
+       if (!gr_mem) {
                gr->num_gr_mem = 0;
        }
 
@@ -376,7 +401,7 @@ _nss_winbind_setpwent(void)
                winbindd_free_response(&getpwent_response);
        }
 
-       ret = winbindd_request_response(WINBINDD_SETPWENT, NULL, NULL);
+       ret = winbindd_request_response(NULL, WINBINDD_SETPWENT, NULL, NULL);
 #ifdef DEBUG_NSS
        fprintf(stderr, "[%5d]: setpwent returns %s (%d)\n", getpid(),
                nss_err_str(ret), ret);
@@ -407,7 +432,7 @@ _nss_winbind_endpwent(void)
                winbindd_free_response(&getpwent_response);
        }
 
-       ret = winbindd_request_response(WINBINDD_ENDPWENT, NULL, NULL);
+       ret = winbindd_request_response(NULL, WINBINDD_ENDPWENT, NULL, NULL);
 #ifdef DEBUG_NSS
        fprintf(stderr, "[%5d]: endpwent returns %s (%d)\n", getpid(),
                nss_err_str(ret), ret);
@@ -456,7 +481,7 @@ _nss_winbind_getpwent_r(struct passwd *result, char *buffer,
 
        request.data.num_entries = MAX_GETPWENT_USERS;
 
-       ret = winbindd_request_response(WINBINDD_GETPWENT, &request,
+       ret = winbindd_request_response(NULL, WINBINDD_GETPWENT, &request,
                               &getpwent_response);
 
        if (ret == NSS_STATUS_SUCCESS) {
@@ -544,7 +569,7 @@ _nss_winbind_getpwuid_r(uid_t uid, struct passwd *result, char *buffer,
 
                request.data.uid = uid;
 
-               ret = winbindd_request_response(WINBINDD_GETPWUID, &request, &response);
+               ret = winbindd_request_response(NULL, WINBINDD_GETPWUID, &request, &response);
 
                if (ret == NSS_STATUS_SUCCESS) {
                        ret = fill_pwent(result, &response.data.pw,
@@ -620,7 +645,7 @@ _nss_winbind_getpwnam_r(const char *name, struct passwd *result, char *buffer,
                request.data.username
                        [sizeof(request.data.username) - 1] = '\0';
 
-               ret = winbindd_request_response(WINBINDD_GETPWNAM, &request, &response);
+               ret = winbindd_request_response(NULL, WINBINDD_GETPWNAM, &request, &response);
 
                if (ret == NSS_STATUS_SUCCESS) {
                        ret = fill_pwent(result, &response.data.pw, &buffer,
@@ -691,7 +716,7 @@ _nss_winbind_setgrent(void)
                winbindd_free_response(&getgrent_response);
        }
 
-       ret = winbindd_request_response(WINBINDD_SETGRENT, NULL, NULL);
+       ret = winbindd_request_response(NULL, WINBINDD_SETGRENT, NULL, NULL);
 #ifdef DEBUG_NSS
        fprintf(stderr, "[%5d]: setgrent returns %s (%d)\n", getpid(),
                nss_err_str(ret), ret);
@@ -723,7 +748,7 @@ _nss_winbind_endgrent(void)
                winbindd_free_response(&getgrent_response);
        }
 
-       ret = winbindd_request_response(WINBINDD_ENDGRENT, NULL, NULL);
+       ret = winbindd_request_response(NULL, WINBINDD_ENDGRENT, NULL, NULL);
 #ifdef DEBUG_NSS
        fprintf(stderr, "[%5d]: endgrent returns %s (%d)\n", getpid(),
                nss_err_str(ret), ret);
@@ -774,7 +799,7 @@ winbind_getgrent(enum winbindd_cmd cmd,
 
        request.data.num_entries = MAX_GETGRENT_USERS;
 
-       ret = winbindd_request_response(cmd, &request,
+       ret = winbindd_request_response(NULL, cmd, &request,
                               &getgrent_response);
 
        if (ret == NSS_STATUS_SUCCESS) {
@@ -893,7 +918,8 @@ _nss_winbind_getgrnam_r(const char *name,
                request.data.groupname
                        [sizeof(request.data.groupname) - 1] = '\0';
 
-               ret = winbindd_request_response(WINBINDD_GETGRNAM, &request, &response);
+               ret = winbindd_request_response(NULL, WINBINDD_GETGRNAM,
+                                               &request, &response);
 
                if (ret == NSS_STATUS_SUCCESS) {
                        ret = fill_grent(result, &response.data.gr,
@@ -971,7 +997,8 @@ _nss_winbind_getgrgid_r(gid_t gid,
 
                request.data.gid = gid;
 
-               ret = winbindd_request_response(WINBINDD_GETGRGID, &request, &response);
+               ret = winbindd_request_response(NULL, WINBINDD_GETGRGID,
+                                               &request, &response);
 
                if (ret == NSS_STATUS_SUCCESS) {
 
@@ -1044,7 +1071,8 @@ _nss_winbind_initgroups_dyn(char *user, gid_t group, long int *start,
        strncpy(request.data.username, user,
                sizeof(request.data.username) - 1);
 
-       ret = winbindd_request_response(WINBINDD_GETGROUPS, &request, &response);
+       ret = winbindd_request_response(NULL, WINBINDD_GETGROUPS,
+                                       &request, &response);
 
        if (ret == NSS_STATUS_SUCCESS) {
                int num_gids = response.data.num_entries;
@@ -1076,6 +1104,11 @@ _nss_winbind_initgroups_dyn(char *user, gid_t group, long int *start,
                                continue;
                        }
 
+                       /* Skip groups without a mapping */
+                       if (gid_list[i] == (uid_t)-1) {
+                               continue;
+                       }
+
                        /* Filled buffer ? If so, resize. */
 
                        if (*start == *size) {
@@ -1151,7 +1184,8 @@ _nss_winbind_getusersids(const char *user_sid, char **group_sids,
        strncpy(request.data.sid, user_sid,sizeof(request.data.sid) - 1);
        request.data.sid[sizeof(request.data.sid) - 1] = '\0';
 
-       ret = winbindd_request_response(WINBINDD_GETUSERSIDS, &request, &response);
+       ret = winbindd_request_response(NULL, WINBINDD_GETUSERSIDS,
+                                       &request, &response);
 
        if (ret != NSS_STATUS_SUCCESS) {
                goto done;
@@ -1203,7 +1237,8 @@ _nss_winbind_nametosid(const char *name, char **sid, char *buffer,
                sizeof(request.data.name.name) - 1);
        request.data.name.name[sizeof(request.data.name.name) - 1] = '\0';
 
-       ret = winbindd_request_response(WINBINDD_LOOKUPNAME, &request, &response);
+       ret = winbindd_request_response(NULL, WINBINDD_LOOKUPNAME,
+                                       &request, &response);
        if (ret != NSS_STATUS_SUCCESS) {
                *errnop = errno = EINVAL;
                goto failed;
@@ -1253,7 +1288,8 @@ _nss_winbind_sidtoname(const char *sid, char **name, char *buffer,
 
        /* we need to fetch the separator first time through */
        if (!sep_char) {
-               ret = winbindd_request_response(WINBINDD_INFO, &request, &response);
+               ret = winbindd_request_response(NULL, WINBINDD_INFO,
+                                               &request, &response);
                if (ret != NSS_STATUS_SUCCESS) {
                        *errnop = errno = EINVAL;
                        goto failed;
@@ -1268,7 +1304,8 @@ _nss_winbind_sidtoname(const char *sid, char **name, char *buffer,
                sizeof(request.data.sid) - 1);
        request.data.sid[sizeof(request.data.sid) - 1] = '\0';
 
-       ret = winbindd_request_response(WINBINDD_LOOKUPSID, &request, &response);
+       ret = winbindd_request_response(NULL, WINBINDD_LOOKUPSID,
+                                       &request, &response);
        if (ret != NSS_STATUS_SUCCESS) {
                *errnop = errno = EINVAL;
                goto failed;
@@ -1324,7 +1361,8 @@ _nss_winbind_sidtouid(const char *sid, uid_t *uid, int *errnop)
        strncpy(request.data.sid, sid, sizeof(request.data.sid) - 1);
        request.data.sid[sizeof(request.data.sid) - 1] = '\0';
 
-       ret = winbindd_request_response(WINBINDD_SID_TO_UID, &request, &response);
+       ret = winbindd_request_response(NULL, WINBINDD_SID_TO_UID,
+                                       &request, &response);
        if (ret != NSS_STATUS_SUCCESS) {
                *errnop = errno = EINVAL;
                goto failed;
@@ -1363,7 +1401,8 @@ _nss_winbind_sidtogid(const char *sid, gid_t *gid, int *errnop)
        strncpy(request.data.sid, sid, sizeof(request.data.sid) - 1);
        request.data.sid[sizeof(request.data.sid) - 1] = '\0';
 
-       ret = winbindd_request_response(WINBINDD_SID_TO_GID, &request, &response);
+       ret = winbindd_request_response(NULL, WINBINDD_SID_TO_GID,
+                                       &request, &response);
        if (ret != NSS_STATUS_SUCCESS) {
                *errnop = errno = EINVAL;
                goto failed;
@@ -1402,7 +1441,8 @@ _nss_winbind_uidtosid(uid_t uid, char **sid, char *buffer,
 
        request.data.uid = uid;
 
-       ret = winbindd_request_response(WINBINDD_UID_TO_SID, &request, &response);
+       ret = winbindd_request_response(NULL, WINBINDD_UID_TO_SID,
+                                       &request, &response);
        if (ret != NSS_STATUS_SUCCESS) {
                *errnop = errno = EINVAL;
                goto failed;
@@ -1450,7 +1490,8 @@ _nss_winbind_gidtosid(gid_t gid, char **sid, char *buffer,
 
        request.data.gid = gid;
 
-       ret = winbindd_request_response(WINBINDD_GID_TO_SID, &request, &response);
+       ret = winbindd_request_response(NULL, WINBINDD_GID_TO_SID,
+                                       &request, &response);
        if (ret != NSS_STATUS_SUCCESS) {
                *errnop = errno = EINVAL;
                goto failed;