git: 3dc01440a064 - stable/14 - Fix lib/libc/nss/getgr_test with large numbers of groups
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Mon, 20 Jan 2025 16:58:03 UTC
The branch stable/14 has been updated by asomers:
URL: https://cgit.FreeBSD.org/src/commit/?id=3dc01440a064c95bc5f125acf7c0ef6acbb5c257
commit 3dc01440a064c95bc5f125acf7c0ef6acbb5c257
Author: Alan Somers <asomers@FreeBSD.org>
AuthorDate: 2024-12-31 20:41:01 +0000
Commit: Alan Somers <asomers@FreeBSD.org>
CommitDate: 2025-01-20 16:54:45 +0000
Fix lib/libc/nss/getgr_test with large numbers of groups
These tests create a linked list with one entry for every group on the
running system. On a system with about 30,000 groups, the test took 69
seconds to run, and crashed Kyua with the below error:
kyua: E: string or blob too big (sqlite op: sqlite3_bind_blob) (sqlite db: /root/.kyua/store/results.usr_tests.20241231-203317-570235.db).
Fix the test by limiting it to operating on the first 1024 groups.
Apply the same change to getpw_test and getserv_test too, which are
vulnerable to the same problem.
Sponsored by: ConnectWise
Reviewed by: markj
Differential Revision: https://reviews.freebsd.org/D48275
(cherry picked from commit d11904b350214943dedb64c7121d4602799d7afd)
---
lib/libc/tests/nss/getgr_test.c | 4 ++++
lib/libc/tests/nss/getpw_test.c | 4 ++++
lib/libc/tests/nss/getserv_test.c | 4 ++++
3 files changed, 12 insertions(+)
diff --git a/lib/libc/tests/nss/getgr_test.c b/lib/libc/tests/nss/getgr_test.c
index 7c0e265fa6f6..974632d4b7c7 100644
--- a/lib/libc/tests/nss/getgr_test.c
+++ b/lib/libc/tests/nss/getgr_test.c
@@ -293,6 +293,8 @@ 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) {
@@ -303,6 +305,8 @@ group_fill_test_data(struct group_test_data *td,
} else {
return (-1);
}
+ if (++count >= limit)
+ break;
}
endgrent();
diff --git a/lib/libc/tests/nss/getpw_test.c b/lib/libc/tests/nss/getpw_test.c
index 3a44497cf848..434d86a31591 100644
--- a/lib/libc/tests/nss/getpw_test.c
+++ b/lib/libc/tests/nss/getpw_test.c
@@ -240,6 +240,8 @@ 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) {
@@ -250,6 +252,8 @@ passwd_fill_test_data(struct passwd_test_data *td,
} else {
return (-1);
}
+ if (++count >= limit)
+ break;
}
endpwent();
diff --git a/lib/libc/tests/nss/getserv_test.c b/lib/libc/tests/nss/getserv_test.c
index 486a8c20836f..cc66fdb2fa52 100644
--- a/lib/libc/tests/nss/getserv_test.c
+++ b/lib/libc/tests/nss/getserv_test.c
@@ -283,6 +283,8 @@ 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) {
@@ -290,6 +292,8 @@ servent_fill_test_data(struct servent_test_data *td)
TEST_DATA_APPEND(servent, td, serv);
else
return (-1);
+ if (++count >= limit)
+ break;
}
endservent();