Package: libnfsidmap2
Version: 0.18-0
Severity: important
Tags: patch
The 0.18 release need a patch to deal with large group (more than ~100 users)
Here the mail: http://marc.theaimsgroup.com/?l=linux-nfsv4&m=116311577732733&w=2
I've tried the patch and it is working fine
-- System Information:
Debian Release: 4.0
APT prefers testing
APT policy: (500, 'testing'), (500, 'stable')
Architecture: i386 (i686)
Shell: /bin/sh linked to /bin/bash
Kernel: Linux 2.6.18.5y
Locale: [EMAIL PROTECTED], [EMAIL PROTECTED] (charmap=ISO-8859-15)
Versions of packages libnfsidmap2 depends on:
ii libc6 2.3.6.ds1-8 GNU C Library: Shared libraries
ii libldap2 2.1.30-13+b1 OpenLDAP libraries
libnfsidmap2 recommends no packages.
-- no debconf information
diff -ru libnfsidmap-0.18.orig/nss.c libnfsidmap-0.18/nss.c
--- libnfsidmap-0.18.orig/nss.c 2006-08-14 14:34:04.000000000 -0400
+++ libnfsidmap-0.18/nss.c 2006-11-09 15:44:18.491168000 -0500
@@ -99,16 +99,25 @@
struct group grbuf;
char *buf;
size_t buflen = sysconf(_SC_GETGR_R_SIZE_MAX);
- int err = -ENOMEM;
+ int err;
- buf = malloc(buflen);
- if (!buf)
- goto out;
if (domain == NULL)
domain = get_default_domain();
- err = -getgrgid_r(gid, &grbuf, buf, buflen, &gr);
- if (gr == NULL)
- err = -ENOENT;
+
+ do {
+ err = -ENOMEM;
+ buf = malloc(buflen);
+ if (!buf)
+ goto out;
+ err = -getgrgid_r(gid, &grbuf, buf, buflen, &gr);
+ if (gr == NULL && !err)
+ err = -ENOENT;
+ if (err == -ERANGE) {
+ buflen *= 2;
+ free(buf);
+ }
+ } while (err == -ERANGE);
+
if (err)
goto out_buf;
err = write_name(name, gr->gr_name, domain, len);
@@ -217,26 +226,34 @@
struct group grbuf;
char *buf, *localname, *domain;
size_t buflen = sysconf(_SC_GETGR_R_SIZE_MAX);
- int err = -ENOMEM;
+ int err = -EINVAL;
- buf = malloc(buflen);
- if (!buf)
- goto out;
- err = -EINVAL;
domain = get_default_domain();
localname = strip_domain(name, domain);
if (!localname)
- goto out_buf;
- err = -getgrnam_r(localname, &grbuf, buf, buflen, &gr);
- if (gr == NULL)
- err = -ENOENT;
+ goto out;
+
+ do {
+ err = -ENOMEM;
+ buf = malloc(buflen);
+ if (!buf)
+ goto out_name;
+ err = -getgrnam_r(localname, &grbuf, buf, buflen, &gr);
+ if (gr == NULL && !err)
+ err = -ENOENT;
+ if (err == -ERANGE) {
+ buflen *= 2;
+ free(buf);
+ }
+ } while (err == -ERANGE);
+
if (err)
- goto out_name;
+ goto out_buf;
*gid = gr->gr_gid;
-out_name:
- free(localname);
out_buf:
free(buf);
+out_name:
+ free(localname);
out:
return err;
}