]> git.pld-linux.org Git - packages/autofs.git/blame - autofs-5.0.2-large-groups.patch
- 5.0.3 with few official patches. ldap fixes needed
[packages/autofs.git] / autofs-5.0.2-large-groups.patch
CommitLineData
3d551623
PG
1diff --git a/CHANGELOG b/CHANGELOG
2index 2c815e7..f8260b1 100644
3--- a/CHANGELOG
4+++ b/CHANGELOG
5@@ -43,6 +43,7 @@
6 - when default master map, auto.master, is used also check for auto_master.
7 - fix schema selection in LDAP schema discovery.
8 - update negative mount timeout handling.
9+- fix large group handling (Ryan Thomas).
10
11 18/06/2007 autofs-5.0.2
12 -----------------------
13diff --git a/daemon/direct.c b/daemon/direct.c
14index 4ab4204..88e59ab 100644
15--- a/daemon/direct.c
16+++ b/daemon/direct.c
17@@ -1218,11 +1218,11 @@ static void *do_mount_direct(void *arg)
18 struct passwd *ppw = &pw;
19 struct passwd **pppw = &ppw;
20 struct group gr;
21- struct group *pgr = &gr;
22- struct group **ppgr = &pgr;
23+ struct group *pgr;
24+ struct group **ppgr;
25 char *pw_tmp, *gr_tmp;
26 struct thread_stdenv_vars *tsv;
27- int tmplen;
28+ int tmplen, grplen;
29 struct stat st;
30 int status, state;
31
32@@ -1326,7 +1326,7 @@ static void *do_mount_direct(void *arg)
33
34 /* Try to get group info */
35
36- tmplen = sysconf(_SC_GETGR_R_SIZE_MAX);
37+ grplen = sysconf(_SC_GETGR_R_SIZE_MAX);
38 if (tmplen < 0) {
39 error(ap->logopt, "failed to get buffer size for getgrgid_r");
40 free(tsv->user);
41@@ -1335,16 +1335,28 @@ static void *do_mount_direct(void *arg)
42 goto cont;
43 }
44
45- gr_tmp = malloc(tmplen + 1);
46- if (!gr_tmp) {
47- error(ap->logopt, "failed to malloc buffer for getgrgid_r");
48- free(tsv->user);
49- free(tsv->home);
50- free(tsv);
51- goto cont;
52+ gr_tmp = NULL;
53+ tmplen = grplen;
54+ while (1) {
55+ char *tmp = realloc(gr_tmp, tmplen + 1);
56+ if (!tmp) {
57+ error(ap->logopt, "failed to malloc buffer for getgrgid_r");
58+ if (gr_tmp)
59+ free(gr_tmp);
60+ free(tsv->user);
61+ free(tsv->home);
62+ free(tsv);
63+ goto cont;
64+ }
65+ gr_tmp = tmp;
66+ pgr = &gr;
67+ ppgr = &pgr;
68+ status = getgrgid_r(mt->gid, pgr, gr_tmp, tmplen, ppgr);
69+ if (status != ERANGE)
70+ break;
71+ tmplen += grplen;
72 }
73
74- status = getgrgid_r(mt->gid, pgr, gr_tmp, tmplen, ppgr);
75 if (status || !pgr) {
76 error(ap->logopt, "failed to get group info from getgrgid_r");
77 free(tsv->user);
78diff --git a/daemon/indirect.c b/daemon/indirect.c
79index 5c422c8..f6b93d0 100644
80--- a/daemon/indirect.c
81+++ b/daemon/indirect.c
82@@ -666,11 +666,11 @@ static void *do_mount_indirect(void *arg)
83 struct passwd *ppw = &pw;
84 struct passwd **pppw = &ppw;
85 struct group gr;
86- struct group *pgr = &gr;
87- struct group **ppgr = &pgr;
88+ struct group *pgr;
89+ struct group **ppgr;
90 char *pw_tmp, *gr_tmp;
91 struct thread_stdenv_vars *tsv;
92- int len, tmplen, status, state;
93+ int len, tmplen, grplen, status, state;
94
95 mt = (struct pending_args *) arg;
96
97@@ -771,7 +771,7 @@ static void *do_mount_indirect(void *arg)
98
99 /* Try to get group info */
100
101- tmplen = sysconf(_SC_GETGR_R_SIZE_MAX);
102+ grplen = sysconf(_SC_GETGR_R_SIZE_MAX);
103 if (tmplen < 0) {
104 error(ap->logopt, "failed to get buffer size for getgrgid_r");
105 free(tsv->user);
106@@ -780,16 +780,28 @@ static void *do_mount_indirect(void *arg)
107 goto cont;
108 }
109
110- gr_tmp = malloc(tmplen + 1);
111- if (!gr_tmp) {
112- error(ap->logopt, "failed to malloc buffer for getgrgid_r");
113- free(tsv->user);
114- free(tsv->home);
115- free(tsv);
116- goto cont;
117+ gr_tmp = NULL;
118+ tmplen = grplen;
119+ while (1) {
120+ char *tmp = realloc(gr_tmp, tmplen + 1);
121+ if (!tmp) {
122+ error(ap->logopt, "failed to malloc buffer for getgrgid_r");
123+ if (gr_tmp)
124+ free(gr_tmp);
125+ free(tsv->user);
126+ free(tsv->home);
127+ free(tsv);
128+ goto cont;
129+ }
130+ gr_tmp = tmp;
131+ pgr = &gr;
132+ ppgr = &pgr;
133+ status = getgrgid_r(mt->gid, pgr, gr_tmp, tmplen, ppgr);
134+ if (status != ERANGE)
135+ break;
136+ tmplen += grplen;
137 }
138
139- status = getgrgid_r(mt->gid, pgr, gr_tmp, tmplen, ppgr);
140 if (status || !pgr) {
141 error(ap->logopt, "failed to get group info from getgrgid_r");
142 free(tsv->user);
This page took 0.037262 seconds and 4 git commands to generate.