diff --git a/lib/libc/tests/nss/getgr_test.c b/lib/libc/tests/nss/getgr_test.c
index 28c5e2e98028..f3aef0e1abd1 100644
--- a/lib/libc/tests/nss/getgr_test.c
+++ b/lib/libc/tests/nss/getgr_test.c
@@ -1,571 +1,575 @@
 /*-
  * Copyright (c) 2006 Michael Bushkov <bushman@freebsd.org>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
  * are met:
  * 1. Redistributions of source code must retain the above copyright
  *    notice, this list of conditions and the following disclaimer.
  * 2. Redistributions in binary form must reproduce the above copyright
  *    notice, this list of conditions and the following disclaimer in the
  *    documentation and/or other materials provided with the distribution.
  *
  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
  */
 
 #include <sys/cdefs.h>
 #include <arpa/inet.h>
 #include <errno.h>
 #include <grp.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <stringlist.h>
 #include <unistd.h>
 
 #include <atf-c.h>
 
 #include "testutil.h"
 
 enum test_methods {
 	TEST_GETGRENT,
 	TEST_GETGRNAM,
 	TEST_GETGRGID,
 	TEST_GETGRENT_2PASS,
 	TEST_GETGRENT_INTERLEAVED_GETGRNAM,
 	TEST_GETGRENT_INTERLEAVED_GETGRGID,
 	TEST_BUILD_SNAPSHOT,
 };
 
 DECLARE_TEST_DATA(group)
 DECLARE_TEST_FILE_SNAPSHOT(group)
 DECLARE_1PASS_TEST(group)
 DECLARE_2PASS_TEST(group)
 
 static void clone_group(struct group *, struct group const *);
 static int compare_group(struct group *, struct group *, void *);
 static void dump_group(struct group *);
 static void free_group(struct group *);
 
 static void sdump_group(struct group *, char *, size_t);
 static int group_read_snapshot_func(struct group *, char *);
 
 static int group_check_ambiguity(struct group_test_data *, struct group *);
 static int group_fill_test_data(struct group_test_data *,
     int (*cb)(struct group *, void *));
 static int group_test_correctness(struct group *, void *);
 static int group_test_getgrnam(struct group *, void *);
 static int group_test_getgrgid(struct group *, void *);
 static int group_test_getgrent(struct group *, void *);
 
 IMPLEMENT_TEST_DATA(group)
 IMPLEMENT_TEST_FILE_SNAPSHOT(group)
 IMPLEMENT_1PASS_TEST(group)
 IMPLEMENT_2PASS_TEST(group)
 
 static void
 clone_group(struct group *dest, struct group const *src)
 {
 	ATF_REQUIRE(dest != NULL);
 	ATF_REQUIRE(src != NULL);
 
 	char **cp;
 	int members_num;
 
 	memset(dest, 0, sizeof(struct group));
 
 	if (src->gr_name != NULL) {
 		dest->gr_name = strdup(src->gr_name);
 		ATF_REQUIRE(dest->gr_name != NULL);
 	}
 
 	if (src->gr_passwd != NULL) {
 		dest->gr_passwd = strdup(src->gr_passwd);
 		ATF_REQUIRE(dest->gr_passwd != NULL);
 	}
 	dest->gr_gid = src->gr_gid;
 
 	if (src->gr_mem != NULL) {
 		members_num = 0;
 		for (cp = src->gr_mem; *cp; ++cp)
 			++members_num;
 
 		dest->gr_mem = calloc(members_num + 1, sizeof(char *));
 		ATF_REQUIRE(dest->gr_mem != NULL);
 
 		for (cp = src->gr_mem; *cp; ++cp) {
 			dest->gr_mem[cp - src->gr_mem] = strdup(*cp);
 			ATF_REQUIRE(dest->gr_mem[cp - src->gr_mem] != NULL);
 		}
 	}
 }
 
 static void
 free_group(struct group *grp)
 {
 	char **cp;
 
 	ATF_REQUIRE(grp != NULL);
 
 	free(grp->gr_name);
 	free(grp->gr_passwd);
 
 	for (cp = grp->gr_mem; *cp; ++cp)
 		free(*cp);
 	free(grp->gr_mem);
 }
 
 static  int
 compare_group(struct group *grp1, struct group *grp2, void *mdata)
 {
 	char **c1, **c2;
 
 	if (grp1 == grp2)
 		return (0);
 
 	if (grp1 == NULL || grp2 == NULL)
 		goto errfin;
 
 	if (strcmp(grp1->gr_name, grp2->gr_name) != 0 ||
 	    strcmp(grp1->gr_passwd, grp2->gr_passwd) != 0 ||
 	    grp1->gr_gid != grp2->gr_gid)
 			goto errfin;
 
 	c1 = grp1->gr_mem;
 	c2 = grp2->gr_mem;
 
 	if (grp1->gr_mem == NULL || grp2->gr_mem == NULL)
 		goto errfin;
 
 	for (; *c1 && *c2; ++c1, ++c2)
 		if (strcmp(*c1, *c2) != 0)
 			goto errfin;
 
 	if (*c1 != NULL || *c2 != NULL)
 		goto errfin;
 
 	return 0;
 
 errfin:
 	if (mdata == NULL) {
 		printf("following structures are not equal:\n");
 		dump_group(grp1);
 		dump_group(grp2);
 	}
 
 	return (-1);
 }
 
 static void
 sdump_group(struct group *grp, char *buffer, size_t buflen)
 {
 	char **cp;
 	int written;
 
 	written = snprintf(buffer, buflen, "%s:%s:%d:",
 	    grp->gr_name, grp->gr_passwd, grp->gr_gid);
 	buffer += written;
 	if (written > (int)buflen)
 		return;
 	buflen -= written;
 
 	if (grp->gr_mem != NULL) {
 		if (*(grp->gr_mem) != NULL) {
 			for (cp = grp->gr_mem; *cp; ++cp) {
 				written = snprintf(buffer, buflen, "%s%s",
 				    cp == grp->gr_mem ? "" : ",", *cp);
 				buffer += written;
 				if (written > (int)buflen)
 					return;
 				buflen -= written;
 
 				if (buflen == 0)
 					return;
 			}
 		} else
 			snprintf(buffer, buflen, "nomem");
 	} else
 		snprintf(buffer, buflen, "(null)");
 }
 
 static int
 group_read_snapshot_func(struct group *grp, char *line)
 {
 	StringList *sl;
 	char *s, *ps, *ts;
 	const char *sep;
 	int i;
 
 	printf("1 line read from snapshot:\n%s\n", line);
 
 	i = 0;
 	sl = NULL;
 	ps = line;
 	sep = ":";
 	memset(grp, 0, sizeof(struct group));
 	while ((s = strsep(&ps, sep)) != NULL) {
 		switch (i) {
 		case 0:
 			grp->gr_name = strdup(s);
 			ATF_REQUIRE(grp->gr_name != NULL);
 			break;
 
 		case 1:
 			grp->gr_passwd = strdup(s);
 			ATF_REQUIRE(grp->gr_passwd != NULL);
 			break;
 
 		case 2:
 			grp->gr_gid = (gid_t)strtol(s, &ts, 10);
 			if (*ts != '\0') {
 				free(grp->gr_name);
 				free(grp->gr_passwd);
 				grp->gr_name = NULL;
 				grp->gr_passwd = NULL;
 				return (-1);
 			}
 			/* Change to parsing groups. */
 			sep = ",";
 			break;
 
 		default:
 			if (sl == NULL) {
 				if (strcmp(s, "(null)") == 0)
 					return (0);
 
 				sl = sl_init();
 				ATF_REQUIRE(sl != NULL);
 
 				if (strcmp(s, "nomem") != 0) {
 					ts = strdup(s);
 					ATF_REQUIRE(ts != NULL);
 					sl_add(sl, ts);
 				}
 			} else {
 				ts = strdup(s);
 				ATF_REQUIRE(ts != NULL);
 				sl_add(sl, ts);
 			}
 			break;
 		}
 		++i;
 	}
 
 	if (i < 3) {
 		free(grp->gr_name);
 		free(grp->gr_passwd);
 		memset(grp, 0, sizeof(struct group));
 		return (-1);
 	}
 
 	sl_add(sl, NULL);
 	grp->gr_mem = sl->sl_str;
 
 	/* NOTE: is it a dirty hack or not? */
 	free(sl);
 	return (0);
 }
 
 static void
 dump_group(struct group *result)
 {
 	if (result != NULL) {
 		char buffer[1024];
 		sdump_group(result, buffer, sizeof(buffer));
 		printf("%s\n", buffer);
 	} else
 		printf("(null)\n");
 }
 
 static int
 group_fill_test_data(struct group_test_data *td,
     int (*cb)(struct group *, void *))
 {
 	struct group *grp;
+	const int limit = 1024;
+	int count = 0;
 
 	setgroupent(1);
 	while ((grp = getgrent()) != NULL) {
 		if (group_test_correctness(grp, NULL) == 0) {
 			TEST_DATA_APPEND(group, td, grp);
 			if (cb != NULL && cb(grp, td) != 0)
 				return (-1);
 		} else {
 			return (-1);
 		}
+		if (++count >= limit)
+			break;
 	}
 	endgrent();
 
 	return (0);
 }
 
 static int
 group_test_correctness(struct group *grp, void *mdata __unused)
 {
 	printf("testing correctness with the following data:\n");
 	dump_group(grp);
 
 	if (grp == NULL)
 		goto errfin;
 
 	if (grp->gr_name == NULL)
 		goto errfin;
 
 	if (grp->gr_passwd == NULL)
 		goto errfin;
 
 	if (grp->gr_mem == NULL)
 		goto errfin;
 
 	printf("correct\n");
 
 	return (0);
 errfin:
 	printf("incorrect\n");
 
 	return (-1);
 }
 
 /* group_check_ambiguity() is needed here because when doing the getgrent()
  * calls sequence, records from different nsswitch sources can be different,
  * though having the same pw_name/pw_uid */
 static int
 group_check_ambiguity(struct group_test_data *td, struct group *pwd)
 {
 
 	return (TEST_DATA_FIND(group, td, pwd, compare_group, NULL) !=
 	    NULL ? 0 : -1);
 }
 
 static int
 group_test_getgrnam(struct group *grp_model, void *mdata)
 {
 	struct group *grp;
 
 	printf("testing getgrnam() with the following data:\n");
 	dump_group(grp_model);
 
 	grp = getgrnam(grp_model->gr_name);
 	if (group_test_correctness(grp, NULL) != 0)
 		goto errfin;
 
 	if (compare_group(grp, grp_model, NULL) != 0 &&
 	    group_check_ambiguity((struct group_test_data *)mdata, grp) != 0)
 	    goto errfin;
 
 	return (0);
 
 errfin:
 	return (-1);
 }
 
 static int
 group_test_getgrgid(struct group *grp_model, void *mdata)
 {
 	struct group *grp;
 
 	printf("testing getgrgid() with the following data...\n");
 	dump_group(grp_model);
 
 	grp = getgrgid(grp_model->gr_gid);
 	if (group_test_correctness(grp, NULL) != 0 ||
 	    (compare_group(grp, grp_model, NULL) != 0 &&
 	     group_check_ambiguity((struct group_test_data *)mdata, grp) != 0))
 		return (-1);
 	else
 		return (0);
 }
 
 static int
 group_test_getgrent(struct group *grp, void *mdata __unused)
 {
 	/*
 	 * Only correctness can be checked when doing 1-pass test for
 	 * getgrent().
 	 */
 	return (group_test_correctness(grp, NULL));
 }
 
 static int
 run_tests(const char *snapshot_file, enum test_methods method)
 {
 	struct group_test_data td, td_snap, td_2pass, td_interleaved;
 	int rv;
 
 	TEST_DATA_INIT(group, &td, clone_group, free_group);
 	TEST_DATA_INIT(group, &td_snap, clone_group, free_group);
 	if (snapshot_file != NULL) {
 		if (access(snapshot_file, W_OK | R_OK) != 0) {
 			if (errno == ENOENT)
 				method = TEST_BUILD_SNAPSHOT;
 			else {
 				printf("can't access the file %s\n",
 				    snapshot_file);
 
 				rv = -1;
 				goto fin;
 			}
 		} else {
 			if (method == TEST_BUILD_SNAPSHOT) {
 				rv = 0;
 				goto fin;
 			}
 
 			TEST_SNAPSHOT_FILE_READ(group, snapshot_file,
 				&td_snap, group_read_snapshot_func);
 		}
 	}
 
 	rv = group_fill_test_data(&td, NULL);
 	if (rv == -1)
 		return (-1);
 	switch (method) {
 	case TEST_GETGRNAM:
 		if (snapshot_file == NULL)
 			rv = DO_1PASS_TEST(group, &td,
 				group_test_getgrnam, (void *)&td);
 		else
 			rv = DO_1PASS_TEST(group, &td_snap,
 				group_test_getgrnam, (void *)&td_snap);
 		break;
 	case TEST_GETGRGID:
 		if (snapshot_file == NULL)
 			rv = DO_1PASS_TEST(group, &td,
 				group_test_getgrgid, (void *)&td);
 		else
 			rv = DO_1PASS_TEST(group, &td_snap,
 				group_test_getgrgid, (void *)&td_snap);
 		break;
 	case TEST_GETGRENT:
 		if (snapshot_file == NULL)
 			rv = DO_1PASS_TEST(group, &td, group_test_getgrent,
 				(void *)&td);
 		else
 			rv = DO_2PASS_TEST(group, &td, &td_snap,
 				compare_group, NULL);
 		break;
 	case TEST_GETGRENT_2PASS:
 		TEST_DATA_INIT(group, &td_2pass, clone_group, free_group);
 		rv = group_fill_test_data(&td_2pass, NULL);
 		if (rv != -1)
 			rv = DO_2PASS_TEST(group, &td, &td_2pass,
 				compare_group, NULL);
 		TEST_DATA_DESTROY(group, &td_2pass);
 		break;
 	case TEST_GETGRENT_INTERLEAVED_GETGRNAM:
 		TEST_DATA_INIT(group, &td_interleaved, clone_group, free_group);
 		rv = group_fill_test_data(&td_interleaved, group_test_getgrnam);
 		if (rv != -1)
 			rv = DO_2PASS_TEST(group, &td, &td_interleaved,
 			    compare_group, NULL);
 		TEST_DATA_DESTROY(group, &td_interleaved);
 		break;
 	case TEST_GETGRENT_INTERLEAVED_GETGRGID:
 		TEST_DATA_INIT(group, &td_interleaved, clone_group, free_group);
 		rv = group_fill_test_data(&td_interleaved, group_test_getgrgid);
 		if (rv != -1)
 			rv = DO_2PASS_TEST(group, &td, &td_interleaved,
 			    compare_group, NULL);
 		TEST_DATA_DESTROY(group, &td_interleaved);
 		break;
 	case TEST_BUILD_SNAPSHOT:
 		if (snapshot_file != NULL)
 			rv = TEST_SNAPSHOT_FILE_WRITE(group, snapshot_file, &td,
 			    sdump_group);
 		break;
 	default:
 		rv = 0;
 		break;
 	}
 
 fin:
 	TEST_DATA_DESTROY(group, &td_snap);
 	TEST_DATA_DESTROY(group, &td);
 
 	return (rv);
 }
 
 #define	SNAPSHOT_FILE	"snapshot_grp"
 
 ATF_TC_WITHOUT_HEAD(getgrent);
 ATF_TC_BODY(getgrent, tc)
 {
 	ATF_REQUIRE(run_tests(NULL, TEST_GETGRENT) == 0);
 }
 
 ATF_TC_WITHOUT_HEAD(getgrent_with_snapshot);
 ATF_TC_BODY(getgrent_with_snapshot, tc)
 {
 	ATF_REQUIRE(run_tests(SNAPSHOT_FILE, TEST_BUILD_SNAPSHOT) == 0);
 	ATF_REQUIRE(run_tests(SNAPSHOT_FILE, TEST_GETGRENT) == 0);
 }
 
 ATF_TC_WITHOUT_HEAD(getgrent_with_two_pass);
 ATF_TC_BODY(getgrent_with_two_pass, tc)
 {
 	ATF_REQUIRE(run_tests(NULL, TEST_GETGRENT_2PASS) == 0);
 }
 
 ATF_TC_WITHOUT_HEAD(getgrgid);
 ATF_TC_BODY(getgrgid, tc)
 {
 	ATF_REQUIRE(run_tests(NULL, TEST_GETGRGID) == 0);
 }
 
 ATF_TC_WITHOUT_HEAD(getgrgid_with_snapshot);
 ATF_TC_BODY(getgrgid_with_snapshot, tc)
 {
 	ATF_REQUIRE(run_tests(SNAPSHOT_FILE, TEST_BUILD_SNAPSHOT) == 0);
 	ATF_REQUIRE(run_tests(SNAPSHOT_FILE, TEST_GETGRGID) == 0);
 }
 
 ATF_TC_WITHOUT_HEAD(getgrnam);
 ATF_TC_BODY(getgrnam, tc)
 {
 	ATF_REQUIRE(run_tests(NULL, TEST_GETGRNAM) == 0);
 }
 
 ATF_TC_WITHOUT_HEAD(getgrnam_with_snapshot);
 ATF_TC_BODY(getgrnam_with_snapshot, tc)
 {
 	ATF_REQUIRE(run_tests(SNAPSHOT_FILE, TEST_BUILD_SNAPSHOT) == 0);
 	ATF_REQUIRE(run_tests(SNAPSHOT_FILE, TEST_GETGRNAM) == 0);
 }
 
 ATF_TC_WITHOUT_HEAD(getgrent_interleaved_getgrnam);
 ATF_TC_BODY(getgrent_interleaved_getgrnam, tc)
 {
 	ATF_REQUIRE(run_tests(NULL, TEST_GETGRENT_INTERLEAVED_GETGRNAM) == 0);
 }
 
 ATF_TC_WITHOUT_HEAD(getgrent_interleaved_getgrgid);
 ATF_TC_BODY(getgrent_interleaved_getgrgid, tc)
 {
 	ATF_REQUIRE(run_tests(NULL, TEST_GETGRENT_INTERLEAVED_GETGRGID) == 0);
 }
 
 ATF_TP_ADD_TCS(tp)
 {
 	ATF_TP_ADD_TC(tp, getgrent);
 	ATF_TP_ADD_TC(tp, getgrent_with_snapshot);
 	ATF_TP_ADD_TC(tp, getgrent_with_two_pass);
 	ATF_TP_ADD_TC(tp, getgrgid);
 	ATF_TP_ADD_TC(tp, getgrgid_with_snapshot);
 	ATF_TP_ADD_TC(tp, getgrnam);
 	ATF_TP_ADD_TC(tp, getgrnam_with_snapshot);
 	ATF_TP_ADD_TC(tp, getgrent_interleaved_getgrnam);
 	ATF_TP_ADD_TC(tp, getgrent_interleaved_getgrgid);
 
 	return (atf_no_error());
 }
diff --git a/lib/libc/tests/nss/getpw_test.c b/lib/libc/tests/nss/getpw_test.c
index 7525cd28b962..94b8b9373272 100644
--- a/lib/libc/tests/nss/getpw_test.c
+++ b/lib/libc/tests/nss/getpw_test.c
@@ -1,552 +1,556 @@
 /*-
  * Copyright (c) 2006 Michael Bushkov <bushman@freebsd.org>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
  * are met:
  * 1. Redistributions of source code must retain the above copyright
  *    notice, this list of conditions and the following disclaimer.
  * 2. Redistributions in binary form must reproduce the above copyright
  *    notice, this list of conditions and the following disclaimer in the
  *    documentation and/or other materials provided with the distribution.
  *
  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
  */
 
 #include <sys/cdefs.h>
 #include <errno.h>
 #include <pwd.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
 
 #include <atf-c.h>
 
 #include "testutil.h"
 
 enum test_methods {
 	TEST_GETPWENT,
 	TEST_GETPWENT_INTERLEAVED_GETPWNAM,
 	TEST_GETPWENT_INTERLEAVED_GETPWUID,
 	TEST_GETPWNAM,
 	TEST_GETPWUID,
 	TEST_GETPWENT_2PASS,
 	TEST_BUILD_SNAPSHOT
 };
 
 DECLARE_TEST_DATA(passwd)
 DECLARE_TEST_FILE_SNAPSHOT(passwd)
 DECLARE_1PASS_TEST(passwd)
 DECLARE_2PASS_TEST(passwd)
 
 static void clone_passwd(struct passwd *, struct passwd const *);
 static int compare_passwd(struct passwd *, struct passwd *, void *);
 static void free_passwd(struct passwd *);
 
 static void sdump_passwd(struct passwd *, char *, size_t);
 #ifdef DEBUG
 static void dump_passwd(struct passwd *);
 #endif
 
 static int passwd_read_snapshot_func(struct passwd *, char *);
 
 static int passwd_check_ambiguity(struct passwd_test_data *, struct passwd *);
 static int passwd_fill_test_data(struct passwd_test_data *,
     int (*cb)(struct passwd *, void *));
 static int passwd_test_correctness(struct passwd *, void *);
 static int passwd_test_getpwnam(struct passwd *, void *);
 static int passwd_test_getpwuid(struct passwd *, void *);
 static int passwd_test_getpwent(struct passwd *, void *);
 
 IMPLEMENT_TEST_DATA(passwd)
 IMPLEMENT_TEST_FILE_SNAPSHOT(passwd)
 IMPLEMENT_1PASS_TEST(passwd)
 IMPLEMENT_2PASS_TEST(passwd)
 
 static void
 clone_passwd(struct passwd *dest, struct passwd const *src)
 {
 	ATF_REQUIRE(dest != NULL);
 	ATF_REQUIRE(src != NULL);
 
 	memcpy(dest, src, sizeof(struct passwd));
 	if (src->pw_name != NULL)
 		dest->pw_name = strdup(src->pw_name);
 	if (src->pw_passwd != NULL)
 		dest->pw_passwd = strdup(src->pw_passwd);
 	if (src->pw_class != NULL)
 		dest->pw_class = strdup(src->pw_class);
 	if (src->pw_gecos != NULL)
 		dest->pw_gecos = strdup(src->pw_gecos);
 	if (src->pw_dir != NULL)
 		dest->pw_dir = strdup(src->pw_dir);
 	if (src->pw_shell != NULL)
 		dest->pw_shell = strdup(dest->pw_shell);
 }
 
 static int
 compare_passwd(struct passwd *pwd1, struct passwd *pwd2, void *mdata __unused)
 {
 	ATF_REQUIRE(pwd1 != NULL);
 	ATF_REQUIRE(pwd2 != NULL);
 
 	if (pwd1 == pwd2)
 		return (0);
 
 	if (pwd1->pw_uid != pwd2->pw_uid ||
 	    pwd1->pw_gid != pwd2->pw_gid ||
 	    pwd1->pw_change != pwd2->pw_change ||
 	    pwd1->pw_expire != pwd2->pw_expire ||
 	    pwd1->pw_fields != pwd2->pw_fields ||
 	    strcmp(pwd1->pw_name, pwd2->pw_name) != 0 ||
 	    strcmp(pwd1->pw_passwd, pwd2->pw_passwd) != 0 ||
 	    strcmp(pwd1->pw_class, pwd2->pw_class) != 0 ||
 	    strcmp(pwd1->pw_gecos, pwd2->pw_gecos) != 0 ||
 	    strcmp(pwd1->pw_dir, pwd2->pw_dir) != 0 ||
 	    strcmp(pwd1->pw_shell, pwd2->pw_shell) != 0)
 		return (-1);
 	else
 		return (0);
 }
 
 static void
 free_passwd(struct passwd *pwd)
 {
 	free(pwd->pw_name);
 	free(pwd->pw_passwd);
 	free(pwd->pw_class);
 	free(pwd->pw_gecos);
 	free(pwd->pw_dir);
 	free(pwd->pw_shell);
 }
 
 static void
 sdump_passwd(struct passwd *pwd, char *buffer, size_t buflen)
 {
 	snprintf(buffer, buflen, "%s:%s:%d:%d:%jd:%s:%s:%s:%s:%jd:%d",
 	    pwd->pw_name, pwd->pw_passwd, pwd->pw_uid, pwd->pw_gid,
 	    (uintmax_t)pwd->pw_change, pwd->pw_class, pwd->pw_gecos,
 	    pwd->pw_dir, pwd->pw_shell, (uintmax_t)pwd->pw_expire,
 	    pwd->pw_fields);
 }
 
 #ifdef DEBUG
 static void
 dump_passwd(struct passwd *pwd)
 {
 	if (pwd != NULL) {
 		char buffer[2048];
 		sdump_passwd(pwd, buffer, sizeof(buffer));
 		printf("%s\n", buffer);
 	} else
 		printf("(null)\n");
 }
 #endif
 
 static int
 passwd_read_snapshot_func(struct passwd *pwd, char *line)
 {
 	char *s, *ps, *ts;
 	int i;
 
 #ifdef DEBUG
 	printf("1 line read from snapshot:\n%s\n", line);
 #endif
 
 	i = 0;
 	ps = line;
 	memset(pwd, 0, sizeof(struct passwd));
 	while ((s = strsep(&ps, ":")) != NULL) {
 		switch (i) {
 		case 0:
 			pwd->pw_name = strdup(s);
 			ATF_REQUIRE(pwd->pw_name != NULL);
 			break;
 		case 1:
 			pwd->pw_passwd = strdup(s);
 			ATF_REQUIRE(pwd->pw_passwd != NULL);
 			break;
 		case 2:
 			pwd->pw_uid = (uid_t)strtol(s, &ts, 10);
 			if (*ts != '\0')
 				goto fin;
 			break;
 		case 3:
 			pwd->pw_gid = (gid_t)strtol(s, &ts, 10);
 			if (*ts != '\0')
 				goto fin;
 			break;
 		case 4:
 			pwd->pw_change = (time_t)strtol(s, &ts, 10);
 			if (*ts != '\0')
 				goto fin;
 			break;
 		case 5:
 			pwd->pw_class = strdup(s);
 			ATF_REQUIRE(pwd->pw_class != NULL);
 			break;
 		case 6:
 			pwd->pw_gecos = strdup(s);
 			ATF_REQUIRE(pwd->pw_gecos != NULL);
 			break;
 		case 7:
 			pwd->pw_dir = strdup(s);
 			ATF_REQUIRE(pwd->pw_dir != NULL);
 			break;
 		case 8:
 			pwd->pw_shell = strdup(s);
 			ATF_REQUIRE(pwd->pw_shell != NULL);
 			break;
 		case 9:
 			pwd->pw_expire = (time_t)strtol(s, &ts, 10);
 			if (*ts != '\0')
 				goto fin;
 			break;
 		case 10:
 			pwd->pw_fields = (int)strtol(s, &ts, 10);
 			if (*ts != '\0')
 				goto fin;
 			break;
 		default:
 			break;
 		}
 		++i;
 	}
 
 fin:
 	if (i != 11) {
 		free_passwd(pwd);
 		memset(pwd, 0, sizeof(struct passwd));
 		return (-1);
 	}
 
 	return (0);
 }
 
 static int
 passwd_fill_test_data(struct passwd_test_data *td,
     int (*cb)(struct passwd *, void *))
 {
 	struct passwd *pwd;
+	const int limit = 1024;
+	int count = 0;
 
 	setpassent(1);
 	while ((pwd = getpwent()) != NULL) {
 		if (passwd_test_correctness(pwd, NULL) == 0) {
 			TEST_DATA_APPEND(passwd, td, pwd);
 			if (cb != NULL && cb(pwd, td) != 0)
 				return (-1);
 		} else {
 			return (-1);
 		}
+		if (++count >= limit)
+			break;
 	}
 	endpwent();
 
 	return (0);
 }
 
 static int
 passwd_test_correctness(struct passwd *pwd, void *mdata __unused)
 {
 
 #ifdef DEBUG
 	printf("testing correctness with the following data:\n");
 	dump_passwd(pwd);
 #endif
 
 	if (pwd == NULL)
 		return (-1);
 
 	if (pwd->pw_name == NULL)
 		goto errfin;
 
 	if (pwd->pw_passwd == NULL)
 		goto errfin;
 
 	if (pwd->pw_class == NULL)
 		goto errfin;
 
 	if (pwd->pw_gecos == NULL)
 		goto errfin;
 
 	if (pwd->pw_dir == NULL)
 		goto errfin;
 
 	if (pwd->pw_shell == NULL)
 		goto errfin;
 
 #ifdef DEBUG
 	printf("correct\n");
 #endif
 
 	return (0);
 errfin:
 #ifdef DEBUG
 	printf("incorrect\n");
 #endif
 
 	return (-1);
 }
 
 /* passwd_check_ambiguity() is needed here because when doing the getpwent()
  * calls sequence, records from different nsswitch sources can be different,
  * though having the same pw_name/pw_uid */
 static int
 passwd_check_ambiguity(struct passwd_test_data *td, struct passwd *pwd)
 {
 
 	return (TEST_DATA_FIND(passwd, td, pwd, compare_passwd, NULL) !=
 	    NULL ? 0 : -1);
 }
 
 static int
 passwd_test_getpwnam(struct passwd *pwd_model, void *mdata)
 {
 	struct passwd *pwd;
 
 #ifdef DEBUG
 	printf("testing getpwnam() with the following data:\n");
 	dump_passwd(pwd_model);
 #endif
 
 	pwd = getpwnam(pwd_model->pw_name);
 	if (passwd_test_correctness(pwd, NULL) != 0)
 		goto errfin;
 
 	if (compare_passwd(pwd, pwd_model, NULL) != 0 &&
 	    passwd_check_ambiguity((struct passwd_test_data *)mdata, pwd) != 0)
 		goto errfin;
 
 #ifdef DEBUG
 	printf("ok\n");
 #endif
 	return (0);
 
 errfin:
 #ifdef DEBUG
 	printf("not ok\n");
 #endif
 	return (-1);
 }
 
 static int
 passwd_test_getpwuid(struct passwd *pwd_model, void *mdata)
 {
 	struct passwd *pwd;
 
 #ifdef DEBUG
 	printf("testing getpwuid() with the following data...\n");
 	dump_passwd(pwd_model);
 #endif
 
 	pwd = getpwuid(pwd_model->pw_uid);
 	if (passwd_test_correctness(pwd, NULL) != 0 ||
 	    (compare_passwd(pwd, pwd_model, NULL) != 0 &&
 	    passwd_check_ambiguity((struct passwd_test_data *)mdata,
 	    pwd) != 0)) {
 #ifdef DEBUG
 		printf("not ok\n");
 #endif
 		return (-1);
 	} else {
 #ifdef DEBUG
 		printf("ok\n");
 #endif
 		return (0);
 	}
 }
 
 static int
 passwd_test_getpwent(struct passwd *pwd, void *mdata __unused)
 {
 	/*
 	 * Only correctness can be checked when doing 1-pass test for
 	 * getpwent().
 	 */
 	return (passwd_test_correctness(pwd, NULL));
 }
 
 static int
 run_tests(const char *snapshot_file, enum test_methods method)
 {
 	struct passwd_test_data td, td_snap, td_2pass, td_interleaved;
 	int rv;
 
 	TEST_DATA_INIT(passwd, &td, clone_passwd, free_passwd);
 	TEST_DATA_INIT(passwd, &td_snap, clone_passwd, free_passwd);
 	if (snapshot_file != NULL) {
 		if (access(snapshot_file, W_OK | R_OK) != 0) {
 			if (errno == ENOENT)
 				method = TEST_BUILD_SNAPSHOT;
 			else {
 				printf("can't access the file %s\n",
 				    snapshot_file);
 				rv = -1;
 				goto fin;
 			}
 		} else {
 			if (method == TEST_BUILD_SNAPSHOT) {
 				rv = 0;
 				goto fin;
 			}
 
 			TEST_SNAPSHOT_FILE_READ(passwd, snapshot_file,
 			    &td_snap, passwd_read_snapshot_func);
 		}
 	}
 
 	rv = passwd_fill_test_data(&td, NULL);
 	if (rv == -1)
 		return (-1);
 
 	switch (method) {
 	case TEST_GETPWNAM:
 		if (snapshot_file == NULL)
 			rv = DO_1PASS_TEST(passwd, &td,
 			    passwd_test_getpwnam, (void *)&td);
 		else
 			rv = DO_1PASS_TEST(passwd, &td_snap,
 			    passwd_test_getpwnam, (void *)&td_snap);
 		break;
 	case TEST_GETPWUID:
 		if (snapshot_file == NULL)
 			rv = DO_1PASS_TEST(passwd, &td,
 			    passwd_test_getpwuid, (void *)&td);
 		else
 			rv = DO_1PASS_TEST(passwd, &td_snap,
 			    passwd_test_getpwuid, (void *)&td_snap);
 		break;
 	case TEST_GETPWENT:
 		if (snapshot_file == NULL)
 			rv = DO_1PASS_TEST(passwd, &td, passwd_test_getpwent,
 			    (void *)&td);
 		else
 			rv = DO_2PASS_TEST(passwd, &td, &td_snap,
 			    compare_passwd, NULL);
 		break;
 	case TEST_GETPWENT_2PASS:
 		TEST_DATA_INIT(passwd, &td_2pass, clone_passwd, free_passwd);
 		rv = passwd_fill_test_data(&td_2pass, NULL);
 		if (rv != -1)
 			rv = DO_2PASS_TEST(passwd, &td, &td_2pass,
 			    compare_passwd, NULL);
 		TEST_DATA_DESTROY(passwd, &td_2pass);
 		break;
 	case TEST_GETPWENT_INTERLEAVED_GETPWNAM:
 		TEST_DATA_INIT(passwd, &td_interleaved, clone_passwd, free_passwd);
 		rv = passwd_fill_test_data(&td_interleaved, passwd_test_getpwnam);
 		if (rv != -1)
 			rv = DO_2PASS_TEST(passwd, &td, &td_interleaved,
 			    compare_passwd, NULL);
 		TEST_DATA_DESTROY(passwd, &td_interleaved);
 		break;
 	case TEST_GETPWENT_INTERLEAVED_GETPWUID:
 		TEST_DATA_INIT(passwd, &td_interleaved, clone_passwd, free_passwd);
 		rv = passwd_fill_test_data(&td_interleaved, passwd_test_getpwuid);
 		if (rv != -1)
 			rv = DO_2PASS_TEST(passwd, &td, &td_interleaved,
 			    compare_passwd, NULL);
 		TEST_DATA_DESTROY(passwd, &td_interleaved);
 		break;
 	case TEST_BUILD_SNAPSHOT:
 		if (snapshot_file != NULL)
 			rv = TEST_SNAPSHOT_FILE_WRITE(passwd, snapshot_file,
 			    &td, sdump_passwd);
 		break;
 	default:
 		rv = 0;
 		break;
 	}
 
 fin:
 	TEST_DATA_DESTROY(passwd, &td_snap);
 	TEST_DATA_DESTROY(passwd, &td);
 
 	return (rv);
 }
 
 #define	SNAPSHOT_FILE	"snapshot_pwd"
 
 ATF_TC_WITHOUT_HEAD(getpwent);
 ATF_TC_BODY(getpwent, tc)
 {
 	ATF_REQUIRE(run_tests(NULL, TEST_GETPWENT) == 0);
 }
 
 ATF_TC_WITHOUT_HEAD(getpwent_with_snapshot);
 ATF_TC_BODY(getpwent_with_snapshot, tc)
 {
 	ATF_REQUIRE(run_tests(SNAPSHOT_FILE, TEST_BUILD_SNAPSHOT) == 0);
 	ATF_REQUIRE(run_tests(SNAPSHOT_FILE, TEST_GETPWENT) == 0);
 }
 
 ATF_TC_WITHOUT_HEAD(getpwent_with_two_pass);
 ATF_TC_BODY(getpwent_with_two_pass, tc)
 {
 	ATF_REQUIRE(run_tests(NULL, TEST_GETPWENT_2PASS) == 0);
 }
 
 ATF_TC_WITHOUT_HEAD(getpwnam);
 ATF_TC_BODY(getpwnam, tc)
 {
 	ATF_REQUIRE(run_tests(NULL, TEST_GETPWNAM) == 0);
 }
 
 ATF_TC_WITHOUT_HEAD(getpwnam_with_snapshot);
 ATF_TC_BODY(getpwnam_with_snapshot, tc)
 {
 	ATF_REQUIRE(run_tests(SNAPSHOT_FILE, TEST_BUILD_SNAPSHOT) == 0);
 	ATF_REQUIRE(run_tests(SNAPSHOT_FILE, TEST_GETPWNAM) == 0);
 }
 
 ATF_TC_WITHOUT_HEAD(getpwuid);
 ATF_TC_BODY(getpwuid, tc)
 {
 	ATF_REQUIRE(run_tests(NULL, TEST_GETPWUID) == 0);
 }
 
 ATF_TC_WITHOUT_HEAD(getpwuid_with_snapshot);
 ATF_TC_BODY(getpwuid_with_snapshot, tc)
 {
 	ATF_REQUIRE(run_tests(SNAPSHOT_FILE, TEST_BUILD_SNAPSHOT) == 0);
 	ATF_REQUIRE(run_tests(SNAPSHOT_FILE, TEST_GETPWUID) == 0);
 }
 
 ATF_TC_WITHOUT_HEAD(getpwent_interleaved_getpwnam);
 ATF_TC_BODY(getpwent_interleaved_getpwnam, tc)
 {
 	ATF_REQUIRE(run_tests(NULL, TEST_GETPWENT_INTERLEAVED_GETPWNAM) == 0);
 }
 
 ATF_TC_WITHOUT_HEAD(getpwent_interleaved_getpwuid);
 ATF_TC_BODY(getpwent_interleaved_getpwuid, tc)
 {
 	ATF_REQUIRE(run_tests(NULL, TEST_GETPWENT_INTERLEAVED_GETPWUID) == 0);
 }
 
 ATF_TP_ADD_TCS(tp)
 {
 	ATF_TP_ADD_TC(tp, getpwent);
 	ATF_TP_ADD_TC(tp, getpwent_with_snapshot);
 	ATF_TP_ADD_TC(tp, getpwent_with_two_pass);
 	ATF_TP_ADD_TC(tp, getpwnam);
 	ATF_TP_ADD_TC(tp, getpwnam_with_snapshot);
 	ATF_TP_ADD_TC(tp, getpwuid);
 	ATF_TP_ADD_TC(tp, getpwuid_with_snapshot);
 	ATF_TP_ADD_TC(tp, getpwent_interleaved_getpwnam);
 	ATF_TP_ADD_TC(tp, getpwent_interleaved_getpwuid);
 
 	return (atf_no_error());
 }
diff --git a/lib/libc/tests/nss/getserv_test.c b/lib/libc/tests/nss/getserv_test.c
index d74feb113a69..d7fce475d70d 100644
--- a/lib/libc/tests/nss/getserv_test.c
+++ b/lib/libc/tests/nss/getserv_test.c
@@ -1,568 +1,572 @@
 /*-
  * Copyright (c) 2006 Michael Bushkov <bushman@freebsd.org>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
  * are met:
  * 1. Redistributions of source code must retain the above copyright
  *    notice, this list of conditions and the following disclaimer.
  * 2. Redistributions in binary form must reproduce the above copyright
  *    notice, this list of conditions and the following disclaimer in the
  *    documentation and/or other materials provided with the distribution.
  *
  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
  */
 
 #include <sys/cdefs.h>
 #include <arpa/inet.h>
 #include <errno.h>
 #include <netdb.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <stringlist.h>
 #include <unistd.h>
 
 #include <atf-c.h>
 
 #include "testutil.h"
 
 enum test_methods {
 	TEST_GETSERVENT,
 	TEST_GETSERVBYNAME,
 	TEST_GETSERVBYPORT,
 	TEST_GETSERVENT_2PASS,
 	TEST_BUILD_SNAPSHOT
 };
 
 DECLARE_TEST_DATA(servent)
 DECLARE_TEST_FILE_SNAPSHOT(servent)
 DECLARE_1PASS_TEST(servent)
 DECLARE_2PASS_TEST(servent)
 
 static void clone_servent(struct servent *, struct servent const *);
 static int compare_servent(struct servent *, struct servent *, void *);
 static void dump_servent(struct servent *);
 static void free_servent(struct servent *);
 
 static void sdump_servent(struct servent *, char *, size_t);
 static int servent_read_snapshot_func(struct servent *, char *);
 
 static int servent_check_ambiguity(struct servent_test_data *,
 	struct servent *);
 static int servent_fill_test_data(struct servent_test_data *);
 static int servent_test_correctness(struct servent *, void *);
 static int servent_test_getservbyname(struct servent *, void *);
 static int servent_test_getservbyport(struct servent *, void *);
 static int servent_test_getservent(struct servent *, void *);
 
 IMPLEMENT_TEST_DATA(servent)
 IMPLEMENT_TEST_FILE_SNAPSHOT(servent)
 IMPLEMENT_1PASS_TEST(servent)
 IMPLEMENT_2PASS_TEST(servent)
 
 static void
 clone_servent(struct servent *dest, struct servent const *src)
 {
 	ATF_REQUIRE(dest != NULL);
 	ATF_REQUIRE(src != NULL);
 
 	char **cp;
 	int aliases_num;
 
 	memset(dest, 0, sizeof(struct servent));
 
 	if (src->s_name != NULL) {
 		dest->s_name = strdup(src->s_name);
 		ATF_REQUIRE(dest->s_name != NULL);
 	}
 
 	if (src->s_proto != NULL) {
 		dest->s_proto = strdup(src->s_proto);
 		ATF_REQUIRE(dest->s_proto != NULL);
 	}
 	dest->s_port = src->s_port;
 
 	if (src->s_aliases != NULL) {
 		aliases_num = 0;
 		for (cp = src->s_aliases; *cp; ++cp)
 			++aliases_num;
 
 		dest->s_aliases = calloc(aliases_num + 1, sizeof(char *));
 		ATF_REQUIRE(dest->s_aliases != NULL);
 
 		for (cp = src->s_aliases; *cp; ++cp) {
 			dest->s_aliases[cp - src->s_aliases] = strdup(*cp);
 			ATF_REQUIRE(dest->s_aliases[cp - src->s_aliases] != NULL);
 		}
 	}
 }
 
 static void
 free_servent(struct servent *serv)
 {
 	char **cp;
 
 	ATF_REQUIRE(serv != NULL);
 
 	free(serv->s_name);
 	free(serv->s_proto);
 
 	for (cp = serv->s_aliases; *cp; ++cp)
 		free(*cp);
 	free(serv->s_aliases);
 }
 
 static  int
 compare_servent(struct servent *serv1, struct servent *serv2, void *mdata)
 {
 	char **c1, **c2;
 
 	if (serv1 == serv2)
 		return 0;
 
 	if ((serv1 == NULL) || (serv2 == NULL))
 		goto errfin;
 
 	if ((strcmp(serv1->s_name, serv2->s_name) != 0) ||
 		(strcmp(serv1->s_proto, serv2->s_proto) != 0) ||
 		(serv1->s_port != serv2->s_port))
 			goto errfin;
 
 	c1 = serv1->s_aliases;
 	c2 = serv2->s_aliases;
 
 	if ((serv1->s_aliases == NULL) || (serv2->s_aliases == NULL))
 		goto errfin;
 
 	for (;*c1 && *c2; ++c1, ++c2)
 		if (strcmp(*c1, *c2) != 0)
 			goto errfin;
 
 	if ((*c1 != NULL) || (*c2 != NULL))
 		goto errfin;
 
 	return 0;
 
 errfin:
 	if (mdata == NULL) {
 		printf("following structures are not equal:\n");
 		dump_servent(serv1);
 		dump_servent(serv2);
 	}
 
 	return (-1);
 }
 
 static void
 sdump_servent(struct servent *serv, char *buffer, size_t buflen)
 {
 	char **cp;
 	int written;
 
 	written = snprintf(buffer, buflen, "%s %d %s",
 		serv->s_name, ntohs(serv->s_port), serv->s_proto);
 	buffer += written;
 	if (written > (int)buflen)
 		return;
 	buflen -= written;
 
 	if (serv->s_aliases != NULL) {
 		if (*(serv->s_aliases) != NULL) {
 			for (cp = serv->s_aliases; *cp; ++cp) {
 				written = snprintf(buffer, buflen, " %s", *cp);
 				buffer += written;
 				if (written > (int)buflen)
 					return;
 				buflen -= written;
 
 				if (buflen == 0)
 					return;
 			}
 		} else
 			snprintf(buffer, buflen, " noaliases");
 	} else
 		snprintf(buffer, buflen, " (null)");
 }
 
 static int
 servent_read_snapshot_func(struct servent *serv, char *line)
 {
 	StringList *sl;
 	char *s, *ps, *ts;
 	int i;
 
 	printf("1 line read from snapshot:\n%s\n", line);
 
 	i = 0;
 	sl = NULL;
 	ps = line;
 	memset(serv, 0, sizeof(struct servent));
 	while ( (s = strsep(&ps, " ")) != NULL) {
 		switch (i) {
 			case 0:
 				serv->s_name = strdup(s);
 				ATF_REQUIRE(serv->s_name != NULL);
 			break;
 
 			case 1:
 				serv->s_port = htons(
 					(int)strtol(s, &ts, 10));
 				if (*ts != '\0') {
 					free(serv->s_name);
 					return (-1);
 				}
 			break;
 
 			case 2:
 				serv->s_proto = strdup(s);
 				ATF_REQUIRE(serv->s_proto != NULL);
 			break;
 
 			default:
 				if (sl == NULL) {
 					if (strcmp(s, "(null)") == 0)
 						return (0);
 
 					sl = sl_init();
 					ATF_REQUIRE(sl != NULL);
 
 					if (strcmp(s, "noaliases") != 0) {
 						ts = strdup(s);
 						ATF_REQUIRE(ts != NULL);
 						sl_add(sl, ts);
 					}
 				} else {
 					ts = strdup(s);
 					ATF_REQUIRE(ts != NULL);
 					sl_add(sl, ts);
 				}
 			break;
 		}
 		++i;
 	}
 
 	if (i < 3) {
 		free(serv->s_name);
 		free(serv->s_proto);
 		memset(serv, 0, sizeof(struct servent));
 		return (-1);
 	}
 
 	sl_add(sl, NULL);
 	serv->s_aliases = sl->sl_str;
 
 	/* NOTE: is it a dirty hack or not? */
 	free(sl);
 	return (0);
 }
 
 static void
 dump_servent(struct servent *result)
 {
 	if (result != NULL) {
 		char buffer[1024];
 		sdump_servent(result, buffer, sizeof(buffer));
 		printf("%s\n", buffer);
 	} else
 		printf("(null)\n");
 }
 
 static int
 servent_fill_test_data(struct servent_test_data *td)
 {
 	struct servent *serv;
+	const int limit = 1024;
+	int count = 0;
 
 	setservent(1);
 	while ((serv = getservent()) != NULL) {
 		if (servent_test_correctness(serv, NULL) == 0)
 			TEST_DATA_APPEND(servent, td, serv);
 		else
 			return (-1);
+		if (++count >= limit)
+			break;
 	}
 	endservent();
 
 	return (0);
 }
 
 static int
 servent_test_correctness(struct servent *serv, void *mdata __unused)
 {
 	printf("testing correctness with the following data:\n");
 	dump_servent(serv);
 
 	if (serv == NULL)
 		goto errfin;
 
 	if (serv->s_name == NULL)
 		goto errfin;
 
 	if (serv->s_proto == NULL)
 		goto errfin;
 
 	if (ntohs(serv->s_port < 0))
 		goto errfin;
 
 	if (serv->s_aliases == NULL)
 		goto errfin;
 
 	printf("correct\n");
 
 	return (0);
 errfin:
 	printf("incorrect\n");
 
 	return (-1);
 }
 
 /* servent_check_ambiguity() is needed when one port+proto is associated with
  * more than one service (these cases are usually marked as PROBLEM in
  * /etc/services. This functions is needed also when one service+proto is
  * associated with several ports. We have to check all the servent structures
  * to make sure that serv really exists and correct */
 static int
 servent_check_ambiguity(struct servent_test_data *td, struct servent *serv)
 {
 
 	return (TEST_DATA_FIND(servent, td, serv, compare_servent,
 		NULL) != NULL ? 0 : -1);
 }
 
 static int
 servent_test_getservbyname(struct servent *serv_model, void *mdata)
 {
 	char **alias;
 	struct servent *serv;
 
 	printf("testing getservbyname() with the following data:\n");
 	dump_servent(serv_model);
 
 	serv = getservbyname(serv_model->s_name, serv_model->s_proto);
 	if (servent_test_correctness(serv, NULL) != 0)
 		goto errfin;
 
 	if ((compare_servent(serv, serv_model, NULL) != 0) &&
 	    (servent_check_ambiguity((struct servent_test_data *)mdata, serv)
 	    !=0))
 		goto errfin;
 
 	for (alias = serv_model->s_aliases; *alias; ++alias) {
 		serv = getservbyname(*alias, serv_model->s_proto);
 
 		if (servent_test_correctness(serv, NULL) != 0)
 			goto errfin;
 
 		if ((compare_servent(serv, serv_model, NULL) != 0) &&
 		    (servent_check_ambiguity(
 		    (struct servent_test_data *)mdata, serv) != 0))
 		    goto errfin;
 	}
 
 	printf("ok\n");
 	return (0);
 
 errfin:
 	printf("not ok\n");
 
 	return (-1);
 }
 
 static int
 servent_test_getservbyport(struct servent *serv_model, void *mdata)
 {
 	struct servent *serv;
 
 	printf("testing getservbyport() with the following data...\n");
 	dump_servent(serv_model);
 
 	serv = getservbyport(serv_model->s_port, serv_model->s_proto);
 	if ((servent_test_correctness(serv, NULL) != 0) ||
 	    ((compare_servent(serv, serv_model, NULL) != 0) &&
 	    (servent_check_ambiguity((struct servent_test_data *)mdata, serv)
 	    != 0))) {
 		printf("not ok\n");
 		return (-1);
 	} else {
 		printf("ok\n");
 		return (0);
 	}
 }
 
 static int
 servent_test_getservent(struct servent *serv, void *mdata __unused)
 {
 	/* Only correctness can be checked when doing 1-pass test for
 	 * getservent(). */
 	return (servent_test_correctness(serv, NULL));
 }
 
 static int
 run_tests(const char *snapshot_file, enum test_methods method)
 {
 	struct servent_test_data td, td_snap, td_2pass;
 	int rv;
 
 	TEST_DATA_INIT(servent, &td, clone_servent, free_servent);
 	TEST_DATA_INIT(servent, &td_snap, clone_servent, free_servent);
 	if (snapshot_file != NULL) {
 		if (access(snapshot_file, W_OK | R_OK) != 0) {
 			if (errno == ENOENT)
 				method = TEST_BUILD_SNAPSHOT;
 			else {
 				printf("can't access the file %s\n",
 				    snapshot_file);
 
 				rv = -1;
 				goto fin;
 			}
 		} else {
 			if (method == TEST_BUILD_SNAPSHOT) {
 				rv = 0;
 				goto fin;
 			}
 
 			TEST_SNAPSHOT_FILE_READ(servent, snapshot_file,
 				&td_snap, servent_read_snapshot_func);
 		}
 	}
 
 	rv = servent_fill_test_data(&td);
 	if (rv == -1)
 		return (-1);
 	switch (method) {
 	case TEST_GETSERVBYNAME:
 		if (snapshot_file == NULL)
 			rv = DO_1PASS_TEST(servent, &td,
 				servent_test_getservbyname, (void *)&td);
 		else
 			rv = DO_1PASS_TEST(servent, &td_snap,
 				servent_test_getservbyname, (void *)&td_snap);
 		break;
 	case TEST_GETSERVBYPORT:
 		if (snapshot_file == NULL)
 			rv = DO_1PASS_TEST(servent, &td,
 				servent_test_getservbyport, (void *)&td);
 		else
 			rv = DO_1PASS_TEST(servent, &td_snap,
 				servent_test_getservbyport, (void *)&td_snap);
 		break;
 	case TEST_GETSERVENT:
 		if (snapshot_file == NULL)
 			rv = DO_1PASS_TEST(servent, &td, servent_test_getservent,
 				(void *)&td);
 		else
 			rv = DO_2PASS_TEST(servent, &td, &td_snap,
 				compare_servent, NULL);
 		break;
 	case TEST_GETSERVENT_2PASS:
 			TEST_DATA_INIT(servent, &td_2pass, clone_servent, free_servent);
 			rv = servent_fill_test_data(&td_2pass);
 			if (rv != -1)
 				rv = DO_2PASS_TEST(servent, &td, &td_2pass,
 					compare_servent, NULL);
 			TEST_DATA_DESTROY(servent, &td_2pass);
 		break;
 	case TEST_BUILD_SNAPSHOT:
 		if (snapshot_file != NULL)
 		    rv = TEST_SNAPSHOT_FILE_WRITE(servent, snapshot_file, &td,
 			sdump_servent);
 		break;
 	default:
 		rv = 0;
 		break;
 	}
 
 fin:
 	TEST_DATA_DESTROY(servent, &td_snap);
 	TEST_DATA_DESTROY(servent, &td);
 
 	return (rv);
 }
 
 #define	SNAPSHOT_FILE	"snapshot_serv"
 
 ATF_TC_WITHOUT_HEAD(build_snapshot);
 ATF_TC_BODY(build_snapshot, tc)
 {
 
 	ATF_REQUIRE(run_tests(SNAPSHOT_FILE, TEST_BUILD_SNAPSHOT) == 0);
 }
 
 ATF_TC_WITHOUT_HEAD(getservbyname);
 ATF_TC_BODY(getservbyname, tc)
 {
 
 	ATF_REQUIRE(run_tests(NULL, TEST_GETSERVBYNAME) == 0);
 }
 
 ATF_TC_WITHOUT_HEAD(getservbyname_with_snapshot);
 ATF_TC_BODY(getservbyname_with_snapshot, tc)
 {
 
 	ATF_REQUIRE(run_tests(SNAPSHOT_FILE, TEST_BUILD_SNAPSHOT) == 0);
 	ATF_REQUIRE(run_tests(SNAPSHOT_FILE, TEST_GETSERVBYNAME) == 0);
 }
 
 ATF_TC_WITHOUT_HEAD(getservbyport);
 ATF_TC_BODY(getservbyport, tc)
 {
 
 	ATF_REQUIRE(run_tests(NULL, TEST_GETSERVBYPORT) == 0);
 }
 
 ATF_TC_WITHOUT_HEAD(getservbyport_with_snapshot);
 ATF_TC_BODY(getservbyport_with_snapshot, tc)
 {
 
 	ATF_REQUIRE(run_tests(SNAPSHOT_FILE, TEST_BUILD_SNAPSHOT) == 0);
 	ATF_REQUIRE(run_tests(SNAPSHOT_FILE, TEST_GETSERVBYPORT) == 0);
 }
 
 ATF_TC_WITHOUT_HEAD(getservbyent);
 ATF_TC_BODY(getservbyent, tc)
 {
 
 	ATF_REQUIRE(run_tests(NULL, TEST_GETSERVENT) == 0);
 }
 
 ATF_TC_WITHOUT_HEAD(getservbyent_with_snapshot);
 ATF_TC_BODY(getservbyent_with_snapshot, tc)
 {
 
 	ATF_REQUIRE(run_tests(SNAPSHOT_FILE, TEST_BUILD_SNAPSHOT) == 0);
 	ATF_REQUIRE(run_tests(SNAPSHOT_FILE, TEST_GETSERVENT) == 0);
 }
 
 ATF_TC_WITHOUT_HEAD(getservbyent_with_two_pass);
 ATF_TC_BODY(getservbyent_with_two_pass, tc)
 {
 
 	ATF_REQUIRE(run_tests(NULL, TEST_GETSERVENT_2PASS) == 0);
 }
 
 ATF_TP_ADD_TCS(tp)
 {
 
 	ATF_TP_ADD_TC(tp, build_snapshot);
 	ATF_TP_ADD_TC(tp, getservbyent);
 	ATF_TP_ADD_TC(tp, getservbyent_with_snapshot);
 	ATF_TP_ADD_TC(tp, getservbyent_with_two_pass);
 	ATF_TP_ADD_TC(tp, getservbyname);
 	ATF_TP_ADD_TC(tp, getservbyname_with_snapshot);
 	ATF_TP_ADD_TC(tp, getservbyport);
 	ATF_TP_ADD_TC(tp, getservbyport_with_snapshot);
 
 	return (atf_no_error());
 }