* Fixes for NFS in environments with large group memberships
@ 2011-04-04 8:02 Finney, Sean
[not found] ` <A50602A820F61543B29992A418BB321B66E18F8A4A-g6SuDuYnGwoBLpZRX7oUTsm4BeyDBExM@public.gmane.org>
0 siblings, 1 reply; 9+ messages in thread
From: Finney, Sean @ 2011-04-04 8:02 UTC (permalink / raw)
To: linux-nfs@vger.kernel.org
SGkgVGhlcmUhCgpMYXN0IHdlZWsgSSBmaXJlZCBvZmYgYSBjb3VwbGUgcGF0Y2hlcyB0byB0aGlz
IGxpc3QgYW5kIGluIGhpbmRzaWdodCBJCnJlYWxpemUgdGhhdCBJIG1pZ2h0IG5vdCBoYXZlIGJl
ZW4gdG90YWxseSBjbGVhciBmb3IgdGhlIG1vdGl2YXRpb24KYmVoaW5kIHRoZSBwYXRjaGVzOgoK
W1BBVENIXSBVc2UgYSBuYW1lZCBjb25zdGFudCBmb3IgbWF4IG51bWJlciBvZiBtYW5hZ2VkIGdy
b3VwcywgYW5kIGluYwpbUEFUQ0hdIEluY3JlYXNlIHRoZSBkZWZhdWx0IGJ1ZmZlciBzaXplIGZv
ciBjYWNoZWxpc3QgY2hhbm5lbCBmaWxlcy4KClNpbmNlIG5vYm9keSBoYXMgcmV2aWV3ZWQgdGhl
bSB5ZXQsIEkgdGhvdWdodCBJJ2QgbWFrZSBpdCBjbGVhciB0aGF0CnRoZXNlIGNoYW5nZXMgKG9y
IHNvbWV0aGluZyBhbG9uZyBzdWNoIGxpbmVzKSBhcmUgcmVxdWlyZWQgZm9yIE5GUwphY2Nlc3Mg
dG8gbW91bnRwb2ludHMgd2hlbiB1c2VycyBhcmUgaW4gbGFyZ2Vpc2ggKD4xMDApIG51bWJlcnMg
b2YKZ3JvdXBzLiAgVGhlcmUgYXJlIGFjdHVhbGx5IHR3byBwcm9ibGVtczoKCiogSGFyZC1jb2Rl
ZCBsaW1pdCBmb3IgZ3JvdXAgbWVtYmVyc2hpcCBhdCAxMDAgZ3JvdXBzIGluIG1vdW50ZCBzb3Vy
Y2UKKiBMYXJnZSBzZXJ2ZXItc2lkZSBwcm9jZnMgd3JpdGVzIGFyZSBzcGxpdCBpbnRvIG11bGl0
cGxlIHdyaXRlcyBkdWUgdG8Kc3RkaW8gYnVmZmVyaW5nIGluIG1vdW50ZCBhbmQgc3ZjZ3NzZCBz
b3VyY2VzLCByZXN1bHRpbmcgaW4gY2xpZW50CmhhbmdzLgoKVGhlIHBhdGNoZXMgaW4gcXVlc3Rp
b24gc29sdmUgdGhpcyBpbiBhcyBub24taW50cnVzaXZlIGEgbWFubmVyIGFzCnBvc3NpYmxlLCB0
aG91Z2ggSSdtIG9mIGNvdXJzZSBvcGVuIHRvIGNoYW5naW5nIHRoaW5ncyB1cCBpZiB5b3UgZmVl
bCBpdApzaG91bGQgYmUgZG9uZSBvdGhlcndpc2UuICBTbyBwbGVhc2UgbGV0IG1lIGtub3cgd2hh
dCB5b3UgdGhpbmssIG9yIGlmCml0IHdvdWxkIGJlIGJldHRlciBmb3IgbWUgdG8gZmlyc3QgZ28g
YW5kIG9wZW4gYSBidWcsIHN0YXJ0IGEKZGlzY3Vzc2lvbiwgZXRjLgoKClRoYW5rcywKU2VhbiAK
Tu+/ve+/ve+/ve+/ve+/vXLvv73vv71577+977+977+9Yu+/vVjvv73vv73Hp3bvv71e77+9Kd66
ey5u77+9K++/ve+/ve+/ve+/vXvvv73vv73vv70i77+977+9Xm7vv71y77+977+977+9eu+/vRrv
v73vv71o77+977+977+977+9Ju+/ve+/vR7vv71H77+977+977+9aO+/vQMo77+96ZqO77+93aJq
Iu+/ve+/vRrvv70bbe+/ve+/ve+/ve+/ve+/vXrvv73elu+/ve+/ve+/vWbvv73vv73vv71o77+9
77+977+9fu+/vW3vv70=
^ permalink raw reply [flat|nested] 9+ messages in thread[parent not found: <A50602A820F61543B29992A418BB321B66E18F8A4A-g6SuDuYnGwoBLpZRX7oUTsm4BeyDBExM@public.gmane.org>]
* Re: Fixes for NFS in environments with large group memberships [not found] ` <A50602A820F61543B29992A418BB321B66E18F8A4A-g6SuDuYnGwoBLpZRX7oUTsm4BeyDBExM@public.gmane.org> @ 2011-04-05 23:35 ` J. Bruce Fields 2011-04-07 5:53 ` Finney, Sean 2011-04-07 7:22 ` [PATCH v2 1/2] nfs-utils: mountd: Use a dynamic buffer for storing lists of gid's Sean Finney 0 siblings, 2 replies; 9+ messages in thread From: J. Bruce Fields @ 2011-04-05 23:35 UTC (permalink / raw) To: Finney, Sean; +Cc: linux-nfs@vger.kernel.org On Mon, Apr 04, 2011 at 10:02:59AM +0200, Finney, Sean wrote: > Hi There! >=20 > Last week I fired off a couple patches to this list and in hindsight = I > realize that I might not have been totally clear for the motivation > behind the patches: >=20 > [PATCH] Use a named constant for max number of managed groups, and in= c > [PATCH] Increase the default buffer size for cachelist channel files. I can't find those; could you resend? --b. >=20 > Since nobody has reviewed them yet, I thought I'd make it clear that > these changes (or something along such lines) are required for NFS > access to mountpoints when users are in largeish (>100) numbers of > groups. There are actually two problems: >=20 > * Hard-coded limit for group membership at 100 groups in mountd sourc= e > * Large server-side procfs writes are split into mulitple writes due = to > stdio buffering in mountd and svcgssd sources, resulting in client > hangs. >=20 > The patches in question solve this in as non-intrusive a manner as > possible, though I'm of course open to changing things up if you feel= it > should be done otherwise. So please let me know what you think, or i= f > it would be better for me to first go and open a bug, start a > discussion, etc. >=20 >=20 > Thanks, > Sean=20 > N?????r??y????b?X??=C7=A7v?^?)=DE=BA{.n?+????{???"??^n?r???z?=1A??h??= ???&??=1E?G???h?=03(?=E9=9A=8E?=DD=A2j"??=1A?=1Bm??????z?=DE=96???f???h= ???~?m ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: Fixes for NFS in environments with large group memberships 2011-04-05 23:35 ` J. Bruce Fields @ 2011-04-07 5:53 ` Finney, Sean 2011-04-07 7:22 ` [PATCH v2 1/2] nfs-utils: mountd: Use a dynamic buffer for storing lists of gid's Sean Finney 1 sibling, 0 replies; 9+ messages in thread From: Finney, Sean @ 2011-04-07 5:53 UTC (permalink / raw) To: bfields@fieldses.org; +Cc: linux-nfs@vger.kernel.org SGkgQnJ1Y2UsCgpPbiBUdWUsIDIwMTEtMDQtMDUgYXQgMTk6MzUgLTA0MDAsIEouIEJydWNlIEZp ZWxkcyB3cm90ZToKCj4gPiAKPiA+IFtQQVRDSF0gVXNlIGEgbmFtZWQgY29uc3RhbnQgZm9yIG1h eCBudW1iZXIgb2YgbWFuYWdlZCBncm91cHMsIGFuZCBpbmMKPiA+IFtQQVRDSF0gSW5jcmVhc2Ug dGhlIGRlZmF1bHQgYnVmZmVyIHNpemUgZm9yIGNhY2hlbGlzdCBjaGFubmVsIGZpbGVzLgo+IAo+ IEkgY2FuJ3QgZmluZCB0aG9zZTsgY291bGQgeW91IHJlc2VuZD8KClN1cmUgdGhpbmcuICBPbiBh IHNlY29uZCByZXZpZXcsIGl0IHNlZW1zIHRoYXQgdGhlICJuYW1lZCBjb25zdGFudCIKcGF0Y2gg bWF5IG5vdCBiZSBzdHJpY3RseSBuZWNlc3NhcnksIHRob3VnaCBidW1waW5nIHRoZSB2YWx1ZSBh dm9pZHMKbmVlZGluZyB0byBkbyBhIG1hbGxvYyBldmVyeSBvcGVyYXRpb24uICBJIHRoaW5rIEkn bGwgdGFrZSBhIHF1aWNrIHNob3QKYXQgcmUtc3Bpbm5pbmcgdGhhdCBwYXRjaCB0byB1c2UgYSBk eW5hbWljYWxseSBncm93aW5nIHN0YXRpYyBidWZmZXIKaW5zdGVhZFsxXSwgYW5kIHJlLXNlbmQg dGhlIHBhdGNoIGFmdGVyIHRoYXQuCgoJU2VhbgoKWzFdIEkgd2FzIGhlc2l0YW50IHRvIGRvIHRo aXMgYXQgZmlyc3QgZHVlIHRvIGFsbCB0aGUgcmVmZXJlbmNlcyB0bwoidGhyZWFkcyIsIGJ1dCBm cm9tIHdoYXQgSSBjYW4gdGVsbCAoYSkgbmZzLXV0aWxzIGRvZXNuJ3QgdXNlIHRocmVhZHMKYW5k IGluc3RlYWQgZm9yaygpLCBhbmQgKGIpIHRoZSBzYW1lIHRlY2huaXF1ZSBpcyBhbHJlYWR5IHVz ZWQgaW4gYXQKbGVhc3Qgb25lIG90aGVyIHBsYWNlIGluIHRoZSBjb2RlLgoT77+977+97Lm7HO+/ vSbvv71+77+9Ju+/vRjvv73vv70rLe+/ve+/vd22F++/ve+/vXfvv73vv73Lm++/ve+/ve+/vW3v v71i77+977+9Z37Ip++/vRfvv73vv73cqH3vv73vv73vv73GoHrvv70majordu+/ve+/ve+/vQfv v73vv73vv73vv716Wivvv73vv70rembvv73vv73vv71o77+977+977+9fu+/ve+/ve+/ve+/vWnv v73vv73vv71677+9Hu+/vXfvv73vv73vv70/77+977+977+977+9Ju+/vSnfohtm ^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH v2 1/2] nfs-utils: mountd: Use a dynamic buffer for storing lists of gid's 2011-04-05 23:35 ` J. Bruce Fields 2011-04-07 5:53 ` Finney, Sean @ 2011-04-07 7:22 ` Sean Finney 2011-04-07 7:22 ` [PATCH v2 2/2] nfs-utils: Increase the stdio file buffer size for procfs files Sean Finney 2011-04-07 12:22 ` [PATCH v2 1/2] nfs-utils: mountd: Use a dynamic buffer for storing lists of gid's Jim Rees 1 sibling, 2 replies; 9+ messages in thread From: Sean Finney @ 2011-04-07 7:22 UTC (permalink / raw) To: linux-nfs; +Cc: bfields, Sean Finney Previously, in auth_unix_gid, group lists were stored in an array of hard-coded length 100, and in the situation that the group lists for a particular call were too large, the array was swapped with a dynamically allocated/freed buffer. For environments where users are commonly in a large number of groups, this isn't an ideal approach. Instead, make the group list static scoped to the function, and use malloc/realloc to grow it on an as-needed basis. Signed-off-by: Sean Finney <sean.finney@sonyericsson.com> --- utils/mountd/cache.c | 29 ++++++++++++++++++++--------- 1 files changed, 20 insertions(+), 9 deletions(-) diff --git a/utils/mountd/cache.c b/utils/mountd/cache.c index 9bbbfb3..7deb050 100644 --- a/utils/mountd/cache.c +++ b/utils/mountd/cache.c @@ -37,6 +37,7 @@ #include "blkid/blkid.h" #endif +#define INITIAL_MANAGED_GROUPS 100 enum nfsd_fsid { FSID_DEV = 0, @@ -127,11 +128,21 @@ void auth_unix_gid(FILE *f) */ int uid; struct passwd *pw; - gid_t glist[100], *groups = glist; - int ngroups = 100; + static gid_t *groups = NULL; + static int groups_len = 0; + gid_t *more_groups; + int ngroups = 0; int rv, i; char *cp; + if (groups_len == 0) { + groups = malloc(sizeof(gid_t)*INITIAL_MANAGED_GROUPS); + if (!groups) + return; + + groups_len = ngroups = INITIAL_MANAGED_GROUPS; + } + if (readline(fileno(f), &lbuf, &lbuflen) != 1) return; @@ -144,13 +155,16 @@ void auth_unix_gid(FILE *f) rv = -1; else { rv = getgrouplist(pw->pw_name, pw->pw_gid, groups, &ngroups); - if (rv == -1 && ngroups >= 100) { - groups = malloc(sizeof(gid_t)*ngroups); - if (!groups) + if (rv == -1 && ngroups >= groups_len) { + more_groups = realloc(groups, sizeof(gid_t)*ngroups); + if (!more_groups) rv = -1; - else + else { + groups = more_groups; + groups_len = ngroups; rv = getgrouplist(pw->pw_name, pw->pw_gid, groups, &ngroups); + } } } qword_printint(f, uid); @@ -162,9 +176,6 @@ void auth_unix_gid(FILE *f) } else qword_printint(f, 0); qword_eol(f); - - if (groups != glist) - free(groups); } #if USE_BLKID -- 1.7.4.1 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH v2 2/2] nfs-utils: Increase the stdio file buffer size for procfs files 2011-04-07 7:22 ` [PATCH v2 1/2] nfs-utils: mountd: Use a dynamic buffer for storing lists of gid's Sean Finney @ 2011-04-07 7:22 ` Sean Finney 2011-04-07 12:22 ` [PATCH v2 1/2] nfs-utils: mountd: Use a dynamic buffer for storing lists of gid's Jim Rees 1 sibling, 0 replies; 9+ messages in thread From: Sean Finney @ 2011-04-07 7:22 UTC (permalink / raw) To: linux-nfs; +Cc: bfields, Sean Finney Previously, when writing to /proc/net/rpc/*/channel, if a cache line were larger than the default buffer size (likely 1024 bytes), mountd and svcgssd would split writes into a number of buffer-sized writes. Each of these writes would get an EINVAL error back from the kernel procfs handle (it expects line-oriented input and does not account for multiple/split writes), and no cache update would occur. When such behavior occurs, NFS clients depending on mountd to finish the cache operation would block/hang, or receive EPERM, depending on the context of the operation. This is likely to happen if a user is a member of a large (~100-200) number of groups. Instead, every fopen() on the procfs files in question is followed by a call to setvbuf(), using a per-file dedicated buffer of RPC_CHAN_BUF_SIZE length. Really, mountd should not be using stdio-style buffered file operations on files in /proc to begin with. A better solution would be to use internally managed buffers and calls to write() instead of these stdio calls, but that would be a more extensive change; so this is proposed as a quick and not-so-dirty fix in the meantime. Signed-off-by: Sean Finney <sean.finney@sonyericsson.com> --- support/include/misc.h | 3 +++ utils/gssd/svcgssd_proc.c | 3 +++ utils/mountd/cache.c | 2 ++ 3 files changed, 8 insertions(+), 0 deletions(-) diff --git a/support/include/misc.h b/support/include/misc.h index 9a1b25d..7e3874e 100644 --- a/support/include/misc.h +++ b/support/include/misc.h @@ -24,4 +24,7 @@ struct hostent *get_reliable_hostbyaddr(const char *addr, int len, int type); extern int is_mountpoint(char *path); +/* size of the file pointer buffers for rpc procfs files */ +#define RPC_CHAN_BUF_SIZE 32768 + #endif /* MISC_H */ diff --git a/utils/gssd/svcgssd_proc.c b/utils/gssd/svcgssd_proc.c index 6f2ba61..8f6548e 100644 --- a/utils/gssd/svcgssd_proc.c +++ b/utils/gssd/svcgssd_proc.c @@ -56,6 +56,7 @@ #include "gss_util.h" #include "err_util.h" #include "context.h" +#include "misc.h" extern char * mech2file(gss_OID mech); #define SVCGSSD_CONTEXT_CHANNEL "/proc/net/rpc/auth.rpcsec.context/channel" @@ -78,6 +79,7 @@ do_svc_downcall(gss_buffer_desc *out_handle, struct svc_cred *cred, FILE *f; int i; char *fname = NULL; + char vbuf[RPC_CHAN_BUF_SIZE]; int err; printerr(1, "doing downcall\n"); @@ -90,6 +92,7 @@ do_svc_downcall(gss_buffer_desc *out_handle, struct svc_cred *cred, SVCGSSD_CONTEXT_CHANNEL, strerror(errno)); goto out_err; } + setvbuf(f, vbuf, _IOLBF, RPC_CHAN_BUF_SIZE); qword_printhex(f, out_handle->value, out_handle->length); /* XXX are types OK for the rest of this? */ /* For context cache, use the actual context endtime */ diff --git a/utils/mountd/cache.c b/utils/mountd/cache.c index 7deb050..4eded17 100644 --- a/utils/mountd/cache.c +++ b/utils/mountd/cache.c @@ -739,6 +739,7 @@ struct { char *cache_name; void (*cache_handle)(FILE *f); FILE *f; + char vbuf[RPC_CHAN_BUF_SIZE]; } cachelist[] = { { "auth.unix.ip", auth_unix_ip}, { "auth.unix.gid", auth_unix_gid}, @@ -757,6 +758,7 @@ void cache_open(void) continue; sprintf(path, "/proc/net/rpc/%s/channel", cachelist[i].cache_name); cachelist[i].f = fopen(path, "r+"); + setvbuf(cachelist[i].f, cachelist[i].vbuf, _IOLBF, RPC_CHAN_BUF_SIZE); } } -- 1.7.4.1 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH v2 1/2] nfs-utils: mountd: Use a dynamic buffer for storing lists of gid's 2011-04-07 7:22 ` [PATCH v2 1/2] nfs-utils: mountd: Use a dynamic buffer for storing lists of gid's Sean Finney 2011-04-07 7:22 ` [PATCH v2 2/2] nfs-utils: Increase the stdio file buffer size for procfs files Sean Finney @ 2011-04-07 12:22 ` Jim Rees 2011-04-07 14:15 ` Finney, Sean 1 sibling, 1 reply; 9+ messages in thread From: Jim Rees @ 2011-04-07 12:22 UTC (permalink / raw) To: Sean Finney; +Cc: linux-nfs, bfields Sean Finney wrote: Previously, in auth_unix_gid, group lists were stored in an array of hard-coded length 100, and in the situation that the group lists for a particular call were too large, the array was swapped with a dynamically allocated/freed buffer. For environments where users are commonly in a large number of groups, this isn't an ideal approach. Instead, make the group list static scoped to the function, and use malloc/realloc to grow it on an as-needed basis. I would re-word this. The list isn't static, the list pointer is. I don't think you need to mention that, it's just confusing. "Use malloc/realloc to grow the list on an as-needed basis." + groups = malloc(sizeof(gid_t)*INITIAL_MANAGED_GROUPS); Style nit: Put blanks around the "*". I was going to suggest you first call getgrouplist with groups set to 0 so you can always alloc() the correct size list, but then I found this in the man page: BUGS In glibc versions before 2.3.3, the implementation of this function contains a buffer-overrun bug: it returns the complete list of groups for user in the array groups, even when the number of groups exceeds *ngroups. ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v2 1/2] nfs-utils: mountd: Use a dynamic buffer for storing lists of gid's 2011-04-07 12:22 ` [PATCH v2 1/2] nfs-utils: mountd: Use a dynamic buffer for storing lists of gid's Jim Rees @ 2011-04-07 14:15 ` Finney, Sean 2011-04-07 14:29 ` Chuck Lever 2011-04-07 15:01 ` Jim Rees 0 siblings, 2 replies; 9+ messages in thread From: Finney, Sean @ 2011-04-07 14:15 UTC (permalink / raw) To: rees@umich.edu; +Cc: linux-nfs@vger.kernel.org, bfields@fieldses.org SGkgSmltLAoKT24gVGh1LCAyMDExLTA0LTA3IGF0IDA4OjIyIC0wNDAwLCBKaW0gUmVlcyB3cm90 ZToKPiBTZWFuIEZpbm5leSB3cm90ZToKPiAKPiAgIFByZXZpb3VzbHksIGluIGF1dGhfdW5peF9n aWQsIGdyb3VwIGxpc3RzIHdlcmUgc3RvcmVkIGluIGFuIGFycmF5IG9mCj4gICBoYXJkLWNvZGVk IGxlbmd0aCAxMDAsIGFuZCBpbiB0aGUgc2l0dWF0aW9uIHRoYXQgdGhlIGdyb3VwIGxpc3RzIGZv ciBhCj4gICBwYXJ0aWN1bGFyIGNhbGwgd2VyZSB0b28gbGFyZ2UsIHRoZSBhcnJheSB3YXMgc3dh cHBlZCB3aXRoIGEgZHluYW1pY2FsbHkKPiAgIGFsbG9jYXRlZC9mcmVlZCBidWZmZXIuICBGb3Ig ZW52aXJvbm1lbnRzIHdoZXJlIHVzZXJzIGFyZSBjb21tb25seSBpbgo+ICAgYSBsYXJnZSBudW1i ZXIgb2YgZ3JvdXBzLCB0aGlzIGlzbid0IGFuIGlkZWFsIGFwcHJvYWNoLgo+ICAgCj4gICBJbnN0 ZWFkLCBtYWtlIHRoZSBncm91cCBsaXN0IHN0YXRpYyBzY29wZWQgdG8gdGhlIGZ1bmN0aW9uLCBh bmQKPiAgIHVzZSBtYWxsb2MvcmVhbGxvYyB0byBncm93IGl0IG9uIGFuIGFzLW5lZWRlZCBiYXNp cy4KPiAKPiBJIHdvdWxkIHJlLXdvcmQgdGhpcy4gIFRoZSBsaXN0IGlzbid0IHN0YXRpYywgdGhl IGxpc3QgcG9pbnRlciBpcy4gIEkgZG9uJ3QKPiB0aGluayB5b3UgbmVlZCB0byBtZW50aW9uIHRo YXQsIGl0J3MganVzdCBjb25mdXNpbmcuICAiVXNlIG1hbGxvYy9yZWFsbG9jIHRvCj4gZ3JvdyB0 aGUgbGlzdCBvbiBhbiBhcy1uZWVkZWQgYmFzaXMuIgoKT2theS4gIEkgd2FzIHRyeWluZyB0byBq dXN0IHB1dCBhIGhpbnQgdGhhdCB0aGVyZSB3YXMgYSBwZXJzaXN0YW50CmJ1ZmZlciB0aGF0IHdv dWxkIGhhbmcgYXJvdW5kIHRocm91Z2ggbXVsdGlwbGUgaW52b2NhdGlvbnMsIHRob3VnaApwZXJo YXBzIHRoYXQncyBhIGxpdHRsZSB0b28gbXVjaCAnaW1wbGVtZW50YXRpb24gZGV0YWlscycuICBU b3RhbGx5IGZpbmUKd2l0aCBtb2RpZnlpbmcgdGhlIGRlc2NyaXB0aW9uIGVpdGhlciB3YXkgOikK Cgo+IAo+ICAgKwkJZ3JvdXBzID0gbWFsbG9jKHNpemVvZihnaWRfdCkqSU5JVElBTF9NQU5BR0VE X0dST1VQUyk7Cj4gCj4gU3R5bGUgbml0OiAgUHV0IGJsYW5rcyBhcm91bmQgdGhlICIqIi4KCldp bGwgZG8uCgo+IEkgd2FzIGdvaW5nIHRvIHN1Z2dlc3QgeW91IGZpcnN0IGNhbGwgZ2V0Z3JvdXBs aXN0IHdpdGggZ3JvdXBzIHNldCB0byAwIHNvCj4geW91IGNhbiBhbHdheXMgYWxsb2MoKSB0aGUg Y29ycmVjdCBzaXplIGxpc3QsIGJ1dCB0aGVuIEkgZm91bmQgdGhpcyBpbiB0aGUKPiBtYW4gcGFn ZToKPiAKPiBCVUdTCj4gICAgICAgIEluICBnbGliYyAgdmVyc2lvbnMgIGJlZm9yZSAgMi4zLjMs IHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGZ1bmN0aW9uCj4gICAgICAgIGNvbnRhaW5zIGEg YnVmZmVyLW92ZXJydW4gYnVnOiBpdCByZXR1cm5zIHRoZSBjb21wbGV0ZSBsaXN0ICBvZiAgZ3Jv dXBzCj4gICAgICAgIGZvciAgdXNlciAgaW4gIHRoZSBhcnJheSBncm91cHMsIGV2ZW4gd2hlbiB0 aGUgbnVtYmVyIG9mIGdyb3VwcyBleGNlZWRzCj4gICAgICAgICpuZ3JvdXBzLgoKWXVjay4gIFRo ZSBmdW5jdGlvbiBpcyBhbHNvIG5vdCBpbiBQT1NJWCBvciBhbnkgb3RoZXIgc3RhbmRhcmRzLCBz bwptYXliZSBpdCdzIHdvcnRoIGRpc2N1c3NpbmcgYXQgYSBsYXRlciBwb2ludCB3aGV0aGVyIGdl dGdyb3VwcygyKSB3b3VsZApiZSBhIGJldHRlciBpbnRlcmZhY2UgdG8gdXNlLCBldmVuIGlmIGl0 IG1lYW5zIGFuIGV4dHJhIHN0ZXAgb3IgdHdvLgoKCkFueXdheSwgSSB3aWxsIHJlLXNwaW4gdGhp cyBwYXRjaCB3aXRoIHRoZSB0d28gY2hhbmdlcyB0aGF0IHlvdSd2ZQpzdWdnZXN0ZWQgYW5kIHN1 Ym1pdCBpdCB0b21vcnJvdy4gICBDYXJlIHRvIHRha2UgYSBsb29rIGF0IHBhdGNoCjIvMj8gIDop CgoKCVNlYW4KTu+/ve+/ve+/ve+/ve+/vXLvv73vv71577+977+977+9Yu+/vVjvv73vv73Hp3bv v71e77+9Kd66ey5u77+9K++/ve+/ve+/ve+/vXvvv73vv73vv70i77+977+9Xm7vv71y77+977+9 77+9eu+/vRrvv73vv71o77+977+977+977+9Ju+/ve+/vR7vv71H77+977+977+9aO+/vQMo77+9 6ZqO77+93aJqIu+/ve+/vRrvv70bbe+/ve+/ve+/ve+/ve+/vXrvv73elu+/ve+/ve+/vWbvv73v v73vv71o77+977+977+9fu+/vW3vv70= ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v2 1/2] nfs-utils: mountd: Use a dynamic buffer for storing lists of gid's 2011-04-07 14:15 ` Finney, Sean @ 2011-04-07 14:29 ` Chuck Lever 2011-04-07 15:01 ` Jim Rees 1 sibling, 0 replies; 9+ messages in thread From: Chuck Lever @ 2011-04-07 14:29 UTC (permalink / raw) To: Finney, Sean Cc: rees@umich.edu, linux-nfs@vger.kernel.org, bfields@fieldses.org On Apr 7, 2011, at 10:15 AM, Finney, Sean wrote: > Hi Jim, > > On Thu, 2011-04-07 at 08:22 -0400, Jim Rees wrote: > >> I was going to suggest you first call getgrouplist with groups set to 0 so >> you can always alloc() the correct size list, but then I found this in the >> man page: >> >> BUGS >> In glibc versions before 2.3.3, the implementation of this function >> contains a buffer-overrun bug: it returns the complete list of groups >> for user in the array groups, even when the number of groups exceeds >> *ngroups. > > Yuck. The function is also not in POSIX or any other standards, so > maybe it's worth discussing at a later point whether getgroups(2) would > be a better interface to use, even if it means an extra step or two. The standard RPC library function authunix_create_default() uses getgroups(2). Take a look at the glibc version of this function to see the preferred method for using getgroups(2). -- Chuck Lever chuck[dot]lever[at]oracle[dot]com ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v2 1/2] nfs-utils: mountd: Use a dynamic buffer for storing lists of gid's 2011-04-07 14:15 ` Finney, Sean 2011-04-07 14:29 ` Chuck Lever @ 2011-04-07 15:01 ` Jim Rees 1 sibling, 0 replies; 9+ messages in thread From: Jim Rees @ 2011-04-07 15:01 UTC (permalink / raw) To: Finney, Sean; +Cc: linux-nfs@vger.kernel.org, bfields@fieldses.org Finney, Sean wrote: > I would re-word this. The list isn't static, the list pointer is. I don't > think you need to mention that, it's just confusing. "Use malloc/realloc to > grow the list on an as-needed basis." Okay. I was trying to just put a hint that there was a persistant buffer that would hang around through multiple invocations, though perhaps that's a little too much 'implementation details'. Totally fine with modifying the description either way :) If it were me, I would alloc and free the list each time rather than keeping it around. It's not like malloc is super expensive. But that's a matter of taste. > BUGS > In glibc versions before 2.3.3, the implementation of this function > contains a buffer-overrun bug: it returns the complete list of groups > for user in the array groups, even when the number of groups exceeds > *ngroups. Yuck. The function is also not in POSIX or any other standards, so maybe it's worth discussing at a later point whether getgroups(2) would be a better interface to use, even if it means an extra step or two. There's no sense in making nfs-utils portable to non-linux, so depending on glibc is probably ok. 2.3.3 was released in December 2003 so I would argue we don't care about the buffer-overrun bug. Anyway, I will re-spin this patch with the two changes that you've suggested and submit it tomorrow. Care to take a look at patch 2/2? :) It looked fine to me. ^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2011-04-07 15:01 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-04-04 8:02 Fixes for NFS in environments with large group memberships Finney, Sean
[not found] ` <A50602A820F61543B29992A418BB321B66E18F8A4A-g6SuDuYnGwoBLpZRX7oUTsm4BeyDBExM@public.gmane.org>
2011-04-05 23:35 ` J. Bruce Fields
2011-04-07 5:53 ` Finney, Sean
2011-04-07 7:22 ` [PATCH v2 1/2] nfs-utils: mountd: Use a dynamic buffer for storing lists of gid's Sean Finney
2011-04-07 7:22 ` [PATCH v2 2/2] nfs-utils: Increase the stdio file buffer size for procfs files Sean Finney
2011-04-07 12:22 ` [PATCH v2 1/2] nfs-utils: mountd: Use a dynamic buffer for storing lists of gid's Jim Rees
2011-04-07 14:15 ` Finney, Sean
2011-04-07 14:29 ` Chuck Lever
2011-04-07 15:01 ` Jim Rees
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).