I've recently run into an issue with autofs 5 when using groups with a large 
number of members.  The issue is that getgrgid_r doesn't always fit in a 
_SC_GETGR_R_SIZE_MAX sized buffer.  Here is a patch that solves this problem by 
attempting larger and larger buffer sizes if the group structure exceeds 
_SC_GETGR_R_SIZE_MAX.  

This patch is very similar to the one that recently went into the NFS4 
libnfsidmap code.  See http://marc.info/?l=linux-nfsv4&m=116311577732733&w=2


--- autofs-5.0.1/daemon/indirect.c.biggroup     2007-08-29 07:26:25.000000000 
-0400
+++ autofs-5.0.1/daemon/indirect.c      2007-08-29 07:27:11.000000000 -0400
@@ -844,16 +844,27 @@
                goto cont;
        }
 
-       gr_tmp = malloc(tmplen + 1);
-       if (!gr_tmp) {
-               error(ap->logopt, "failed to malloc buffer for getgrgid_r");
-               free(tsv->user);
-               free(tsv->home);
-               free(tsv);
-               goto cont;
-       }
+       do {
+         status = ENOMEM;
+
+         gr_tmp = malloc(tmplen + 1);
+         if (!gr_tmp) {
+           error(ap->logopt, "failed to malloc buffer for getgrgid_r");
+           free(tsv->user);
+           free(tsv->home);
+           free(tsv);
+           goto cont;
+         }
+         pgr = &gr;
+         status = getgrgid_r(mt->gid, pgr, gr_tmp, tmplen, ppgr);
+         if (ppgr == NULL && !status)
+           status = ENOENT;
+         if (status == ERANGE) {
+           tmplen *= 2;
+           free(gr_tmp);
+         }
+       } while (status == ERANGE);
 
-       status = getgrgid_r(mt->gid, pgr, gr_tmp, tmplen, ppgr);
        if (status) {
                error(ap->logopt, "failed to get group info from getgrgid_r");
                free(tsv->user);
--- autofs-5.0.1/daemon/direct.c.biggroup       2007-08-29 07:26:25.000000000 
-0400
+++ autofs-5.0.1/daemon/direct.c        2007-08-29 07:27:01.000000000 -0400
@@ -1364,16 +1364,27 @@
                goto cont;
        }
 
-       gr_tmp = malloc(tmplen + 1);
-       if (!gr_tmp) {
-               error(ap->logopt, "failed to malloc buffer for getgrgid_r");
-               free(tsv->user);
-               free(tsv->home);
-               free(tsv);
-               goto cont;
-       }
+       do {
+         status = ENOMEM;
+
+         gr_tmp = malloc(tmplen + 1);
+         if (!gr_tmp) {
+           error(ap->logopt, "failed to malloc buffer for getgrgid_r");
+           free(tsv->user);
+           free(tsv->home);
+           free(tsv);
+           goto cont;
+         }
+         pgr = &gr;
+         status = getgrgid_r(mt->gid, pgr, gr_tmp, tmplen, ppgr);
+         if (ppgr == NULL && !status)
+           status = ENOENT;
+         if (status == ERANGE) {
+           tmplen *= 2;
+           free(gr_tmp);
+         }
+       } while (status == ERANGE);
 
-       status = getgrgid_r(mt->gid, pgr, gr_tmp, tmplen, ppgr);
        if (status) {
                error(ap->logopt, "failed to get group info from getgrgid_r");
                free(tsv->user);

_______________________________________________
autofs mailing list
[email protected]
http://linux.kernel.org/mailman/listinfo/autofs

Reply via email to