The branch, master has been updated via 7bdf2f8 nwrap_files_cache_reload: add close for ebadf fd just incase via 5d2b47f nwrap_files_cache_reload: add test for closed handles error via 95b1e79 nwrap_files_cache_reload: avoid error on EBADF during stat from 86420d9 nwrap_files_getaddrinfo: avoid crash on empty name
https://git.samba.org/?p=nss_wrapper.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit 7bdf2f87f4e63d57f0d9a939e0e78349d1b71342 Author: TJ Miller <mill...@us.ibm.com> Date: Wed Oct 28 13:55:59 2020 -0700 nwrap_files_cache_reload: add close for ebadf fd just incase Reviewed-by: Andreas Schneider <a...@samba.org> Reviewed-by: Ralph Boehme <s...@samba.org> commit 5d2b47fdd89c3834b226a56703cb51be8b937d21 Author: TJ Miller <mill...@us.ibm.com> Date: Wed Oct 28 13:54:48 2020 -0700 nwrap_files_cache_reload: add test for closed handles error Reviewed-by: Andreas Schneider <a...@samba.org> Reviewed-by: Ralph Boehme <s...@samba.org> commit 95b1e79a1f6ee0f1248723a3466fcce125db650f Author: TJ Miller <mill...@us.ibm.com> Date: Thu Oct 15 12:07:17 2020 -0700 nwrap_files_cache_reload: avoid error on EBADF during stat Reviewed-by: Andreas Schneider <a...@samba.org> Reviewed-by: Ralph Boehme <s...@samba.org> ----------------------------------------------------------------------- Summary of changes: src/nss_wrapper.c | 16 +++++++++++++++- tests/test_getpwuid_module.c | 25 +++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) Changeset truncated at 500 lines: diff --git a/src/nss_wrapper.c b/src/nss_wrapper.c index 4f4dc93..877f6d1 100644 --- a/src/nss_wrapper.c +++ b/src/nss_wrapper.c @@ -2129,7 +2129,21 @@ reopen: } ret = fstat(nwrap->fd, &st); - if (ret != 0) { + if (ret != 0 && errno == EBADF && retried == false) { + /* maybe something closed the fd on our behalf */ + NWRAP_LOG(NWRAP_LOG_TRACE, + "fstat(%s) - %d:%s - reopen", + nwrap->path, + ret, + strerror(errno)); + retried = true; + memset(&nwrap->st, 0, sizeof(nwrap->st)); + fclose(nwrap->fp); + nwrap->fp = NULL; + nwrap->fd = -1; + goto reopen; + } + else if (ret != 0) { NWRAP_LOG(NWRAP_LOG_ERROR, "fstat(%s) - %d:%s", nwrap->path, diff --git a/tests/test_getpwuid_module.c b/tests/test_getpwuid_module.c index 2dbecb1..a06a49d 100644 --- a/tests/test_getpwuid_module.c +++ b/tests/test_getpwuid_module.c @@ -4,6 +4,7 @@ #include <stddef.h> #include <setjmp.h> #include <cmocka.h> +#include <unistd.h> #include <pwd.h> @@ -22,12 +23,36 @@ static void test_nwrap_passwd(void **state) assert_int_equal(pwd->pw_gid, id); } +static void test_nwrap_passwd_closed_handles(void **state) +{ + struct passwd *pwd; + uid_t id = 424242; + long maxfd; + + (void) state; /* unused */ + + pwd = getpwuid(id); + assert_non_null(pwd); + + maxfd = sysconf(_SC_OPEN_MAX); + if (maxfd < 0) { + maxfd = 1024; + } + for (long fd = 3; fd < maxfd; fd++) { + close(fd); + } + + pwd = getpwuid(id); + assert_non_null(pwd); +} + int main(void) { int rc; const struct CMUnitTest tests[] = { cmocka_unit_test(test_nwrap_passwd), + cmocka_unit_test(test_nwrap_passwd_closed_handles), }; rc = cmocka_run_group_tests(tests, NULL, NULL); -- NSS Wrapper Repository