Subject: Re: port-i386/33974
To: None <gnats-bugs@NetBSD.org>
From: Matthias Drochner <M.Drochner@fz-juelich.de>
List: netbsd-bugs
Date: 07/12/2006 23:09:46
This is a multipart MIME message.

--==_Exmh_16973218962900
Content-Type: text/plain; charset=us-ascii


elekktretterr@exemail.com.au said:
> Increasing grpbuf to 2048 fixed the issue as you suspected

Great to hear that at least your most pressing problem is solved.

> What exactly did you want me to printf from those functions?

OK, here is a patch which combines some diagnostic output
with an attempt to provide a fix which hopefully makes the code
sustain more than 1000 users in a group.
Could you please give it a try?

best regards
Matthias



--==_Exmh_16973218962900
Content-Type: text/plain ; name="grpbuf.txt"; charset=us-ascii
Content-Description: grpbuf.txt
Content-Disposition: attachment; filename="grpbuf.txt"

Index: files/netbsd.c
===================================================================
RCS file: /cvsroot/pkgsrc/databases/nss_ldap/files/netbsd.c,v
retrieving revision 1.5
diff -u -p -r1.5 netbsd.c
--- files/netbsd.c	15 Mar 2006 19:23:47 -0000	1.5
+++ files/netbsd.c	12 Jul 2006 21:00:08 -0000
@@ -8,6 +8,9 @@
 #include <stdlib.h>
 #include <string.h>
 
+#include <errno.h>
+#include <stdio.h>
+
 #include "netbsd.h"
 typedef enum nss_status NSS_STATUS;
 
@@ -55,7 +58,9 @@ static int nss2netbsderr[] = {
 };
 static struct passwd rpw;
 static struct group rg;
-static char pwbuf[1024], grpbuf[1024]; /* two necessary? */
+static char pwbuf[1024];
+static char *grpbuf;
+static size_t grpbuflen;
 
 static ns_mtab methods[] = {
 	{ NSDB_PASSWD, "setpwent", netbsd_setpwent, 0 },
@@ -263,6 +268,21 @@ netbsd_getpwuid_r(void *rv, void *cb_dat
 	return nss2netbsderr[s];
 }
 
+static int
+resize_grpbuf()
+{
+
+	if (grpbuflen > 50000) /* safety guard */
+		return (-1);
+	grpbuflen += 1024;
+	if (grpbuf)
+		free(grpbuf);
+	grpbuf = malloc(grpbuflen);
+	if (!grpbuf)
+		return (-1);
+	printf("resize_grpbuf: now %d\n", grpbuflen);
+	return (0);
+}
 
 static int
 netbsd_setgrent(void *rv, void *cb_data, va_list ap)
@@ -309,11 +329,15 @@ netbsd_getgrent(void *rv, void *cb_data,
 	NSS_STATUS s;
 	struct group **retval = va_arg(ap, struct group **);
 
+tryagain:
 	memset(&rg, 0, sizeof(rg));
-	s = _nss_ldap_getgrent_r(&rg, grpbuf, sizeof(grpbuf), &err);
+	s = _nss_ldap_getgrent_r(&rg, grpbuf, grpbuflen, &err);
 
 	if (s == NSS_STATUS_SUCCESS)
 		*retval = &rg;
+	else if ((s == NSS_STATUS_TRYAGAIN) && (err == ERANGE)
+		 && (resize_grpbuf() == 0))
+		goto tryagain;
 	else
 		*retval = 0;
 
@@ -355,13 +379,19 @@ netbsd_getgrnam(void *rv, void *cb_data,
 	struct group **retval = va_arg(ap, struct group **);
 	const char *name = va_arg(ap, const char *);
 
+tryagain:
 	memset(&rg, 0, sizeof(rg));
-	s = _nss_ldap_getgrnam_r(name, &rg, grpbuf, sizeof(grpbuf), &err);
+	s = _nss_ldap_getgrnam_r(name, &rg, grpbuf, grpbuflen, &err);
 
 	if (s == NSS_STATUS_SUCCESS)
 		*retval = &rg;
-	else
+	else if ((s == NSS_STATUS_TRYAGAIN) && (err == ERANGE)
+		 && (resize_grpbuf() == 0))
+		goto tryagain;
+	else {
+		printf("netbsd_getgrnam: %d/%d\n", s, err);
 		*retval = 0;
+	}
 
 	return nss2netbsderr[s];
 }
@@ -402,13 +432,19 @@ netbsd_getgrgid(void *rv, void *cb_data,
 	struct group **retval = va_arg(ap, struct group **);
 	gid_t gid = va_arg(ap, gid_t);
 
+tryagain:
 	memset(&rg, 0, sizeof(rg));
-	s = _nss_ldap_getgrgid_r(gid, &rg, grpbuf, sizeof(grpbuf), &err);
+	s = _nss_ldap_getgrgid_r(gid, &rg, grpbuf, grpbuflen, &err);
 
 	if (s == NSS_STATUS_SUCCESS)
 		*retval = &rg;
-	else
+	else if ((s == NSS_STATUS_TRYAGAIN) && (err == ERANGE)
+		 && (resize_grpbuf() == 0))
+		goto tryagain;
+	else {
+		printf("netbsd_getgrgid: %d/%d\n", s, err);
 		*retval = 0;
+	}
 
 	return nss2netbsderr[s];
 }
@@ -505,5 +541,9 @@ nss_module_register(const char *source, 
 {
 	*mtabsize = sizeof(methods)/sizeof(methods[0]);
 	*unreg = NULL;
+
+	if (resize_grpbuf())
+		return 0;
+
 	return (methods);
 }

--==_Exmh_16973218962900--