]> git.pld-linux.org Git - packages/autofs.git/blob - autofs-5.0.2-large-groups.patch
d811f5eb308b68301b3b8942a168e63f4f03cb02
[packages/autofs.git] / autofs-5.0.2-large-groups.patch
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);
This page took 0.056434 seconds and 2 git commands to generate.