components/proftpd/patches/mod_auth_unix_getgrp.patch
branchs11u2-sru
changeset 4311 3a33895438c9
parent 4294 427b52500a3a
child 4319 da855e17148a
equal deleted inserted replaced
4294:427b52500a3a 4311:3a33895438c9
     1 --- old/modules/mod_auth_unix.c	Fri May 25 08:31:35 2012
       
     2 +++ new/modules/mod_auth_unix.c	Fri May 25 08:31:35 2012
       
     3 @@ -896,6 +896,13 @@
       
     4  
       
     5    return gr ? mod_create_data(cmd, (void *) &gr->gr_gid) : PR_DECLINED(cmd);
       
     6  }
       
     7 +#ifdef HAVE__GETGRPSBYMEMBER
       
     8 +  extern int _getgroupsbymember
       
     9 +  (
       
    10 +	const char* username, gid_t gid_array[],
       
    11 +	int maxgids, int numgids
       
    12 +  ); 
       
    13 +#endif /* HAVE__GETGRPSBYMEMBER */
       
    14  
       
    15  /* cmd->argv[0] = name
       
    16   * cmd->argv[1] = (array_header **) group_ids
       
    17 @@ -1065,7 +1072,40 @@
       
    18      }
       
    19  
       
    20      free(ptr);
       
    21 -#else
       
    22 +#else /* !HAVE_GETGRSET */
       
    23 +#ifdef HAVE__GETGRPSBYMEMBER
       
    24 +    gid_t group_ids[NGROUPS_MAX];
       
    25 +    int ngroups = NGROUPS_MAX;
       
    26 +    register unsigned int i;
       
    27 +
       
    28 +    pr_trace_msg("auth", 4,
       
    29 +      "using _getgroupsbymember() to look up group membership");
       
    30 +
       
    31 +    memset(group_ids, 0, sizeof(group_ids));
       
    32 +
       
    33 +    group_ids[0]=pw->pw_gid;
       
    34 +    ngroups=
       
    35 +      _getgroupsbymember(pw->pw_name, group_ids, NGROUPS_MAX, 1);
       
    36 +
       
    37 +    if (ngroups < 0) {
       
    38 +	pr_log_pri(PR_LOG_ERR,
       
    39 +	    "_getgroupsbymember error: %s", strerror(errno));
       
    40 +	return PR_DECLINED(cmd);
       
    41 +    }
       
    42 +
       
    43 +    for (i = 0; i < ngroups; i++) {
       
    44 +      gr = my_getgrgid(group_ids[i]);
       
    45 +      if (gr) {
       
    46 +        if (gids && pw->pw_gid != gr->gr_gid)
       
    47 +          *((gid_t *) push_array(gids)) = gr->gr_gid;
       
    48 +
       
    49 +        if (groups && pw->pw_gid != gr->gr_gid) {
       
    50 +          *((char **) push_array(groups)) = pstrdup(session.pool,
       
    51 +            gr->gr_name);
       
    52 +        }
       
    53 +      }
       
    54 +    }
       
    55 +#else /* !HAVE__GETGRPSBYMEMBER */
       
    56      char **gr_member = NULL;
       
    57  
       
    58      /* This is where things get slow, expensive, and ugly.  Loop through
       
    59 @@ -1091,6 +1131,7 @@
       
    60          }
       
    61        }
       
    62      }
       
    63 +#endif /* !HAVE__GETGROUPSBYMEMBER */
       
    64  #endif /* !HAVE_GETGRSET */
       
    65    }
       
    66