And I guess this also:
--- auth_unix.c 16 Feb 2005 21:06:50 -0000      1.37.2.2
+++ auth_unix.c 26 Apr 2005 17:53:40 -0000
@@ -157,10 +157,11 @@
 size_t len;
 {
     static char retbuf[81];
-    struct group *grp;
+    struct group grp;
     char sawalpha;
     char *p;
     int username_tolower = 0;
+    char buf[BUFLEN];

     if(!len) len = strlen(identifier);
     if(len >= sizeof(retbuf)) return NULL;
@@ -177,8 +178,8 @@
      */

     if (!strncmp(retbuf, "group:", 6)) {
-       grp = getgrnam(retbuf+6);
-       if (!grp) return 0;
+       if (getgrnam_r(retbuf + 6, &grp, buf, BUFLEN))
+           return 0;
        strcpy(retbuf+6, grp->gr_name);
        return retbuf;
     }


Index: auth_unix.c
===================================================================
RCS file: /afs/andrew.cmu.edu/system/cvs/src/cyrus/lib/auth_unix.c,v
retrieving revision 1.37.2.2
diff -u -r1.37.2.2 auth_unix.c
--- auth_unix.c 16 Feb 2005 21:06:50 -0000      1.37.2.2
+++ auth_unix.c 26 Apr 2005 17:43:56 -0000
@@ -221,9 +221,11 @@
static struct auth_state *mynewstate(const char *identifier)
{
    struct auth_state *newstate;
-    struct passwd *pwd;
-    struct group *grp;
+    struct passwd pwd, *pwdp;
    char **mem;
+    struct group grp, *grpp;
+    char buf[BUFLEN], buf2[BUFLEN];
+    int i;

    identifier = mycanonifyid(identifier, 0);
    if (!identifier) return 0;
@@ -238,22 +240,25 @@
    if(!libcyrus_config_getswitch(CYRUSOPT_AUTH_UNIX_GROUP_ENABLE))
       return newstate;

-    pwd = getpwnam(identifier);
+    getpwnam_r(identifier, pwd, buf2, BUFLEN, &pwdp);

setgrent();
- while ((grp = getgrent())) {
- for (mem = grp->gr_mem; *mem; mem++) {
- if (!strcmp(*mem, identifier)) break;
- }
-
- if (*mem || (pwd && pwd->pw_gid == grp->gr_gid)) {
- newstate->ngroups++;
- newstate->group = (char **)xrealloc((char *)newstate->group,
- newstate->ngroups * sizeof(char *));
- newstate->group[newstate->ngroups-1] = xstrdup(grp->gr_name);
- }
+ while (1) {
+ i = getgrent_r(&grp, buf, BUFLEN, &grpp);
+ if (i)
+ break;
+ for (mem = grpp->gr_mem; *mem; mem++) {
+ if (!strcmp(*mem, identifier)) break;
+ }
+ if (*mem || (pwdp && pwdp->pw_gid == grpp->gr_gid)) {
+ newstate->ngroups++;
+ newstate->group = (char **)xrealloc((char *)newstate->group,
+ newstate->ngroups * sizeof(char *));
+ newstate->group[newstate->ngroups-1] = xstrdup(grpp->gr_name);
+ }
}
endgrent();
+
return newstate;
}



---
Cyrus Home Page: http://asg.web.cmu.edu/cyrus
Cyrus Wiki/FAQ: http://cyruswiki.andrew.cmu.edu
List Archives/Info: http://asg.web.cmu.edu/cyrus/mailing-list.html

Reply via email to