]>
Commit | Line | Data |
---|---|---|
3d551623 PG |
1 | diff --git a/CHANGELOG b/CHANGELOG |
2 | index 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 | ----------------------- | |
13 | diff --git a/daemon/direct.c b/daemon/direct.c | |
14 | index 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); | |
78 | diff --git a/daemon/indirect.c b/daemon/indirect.c | |
79 | index 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); |