From: Aki Tuomi Date: Fri, 5 Oct 2018 07:18:35 +0000 (+0300) Subject: userdb-passwd: Fix getpwent errno handling X-Git-Tag: 2.3.8~193 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=0c222e2961569462011af3e6fab7e7b6910003fc;p=thirdparty%2Fdovecot%2Fcore.git userdb-passwd: Fix getpwent errno handling In https://bugs.gentoo.org/667118 Reuben Farrelly noticed that running # doveadm user '*' causes auth daemon to generate errors like: auth-worker(3585): Error: getpwent() failed: Invalid argument This happens because on successful call getpwent() now sets errno=EINVAL starting from glibc-2.28. See https://sourceware.org/PR16004 for details. The fix is to reset 'errno' before 'getpwent()' is called. Reported-by: Reuben Farrelly Bug: https://bugs.gentoo.org/667118 Bug: https://sourceware.org/PR16004 Original-Author: Sergei Trofimovich --- diff --git a/src/auth/userdb-passwd.c b/src/auth/userdb-passwd.c index d0f8b680aa..fa868e6b81 100644 --- a/src/auth/userdb-passwd.c +++ b/src/auth/userdb-passwd.c @@ -172,12 +172,16 @@ static void passwd_iterate_next(struct userdb_iterate_context *_ctx) return; } + /* reset errno since it might have been set when we got here */ errno = 0; while ((pw = getpwent()) != NULL) { if (passwd_iterate_want_pw(pw, set)) { _ctx->callback(pw->pw_name, _ctx->context); return; } + /* getpwent might set errno to something even if it + returns non-NULL. */ + errno = 0; } if (errno != 0) { i_error("getpwent() failed: %m");