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;
 }

Reply via email to