]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
userdb-passwd: Fix getpwent errno handling
authorAki Tuomi <aki.tuomi@dovecot.fi>
Fri, 5 Oct 2018 07:18:35 +0000 (10:18 +0300)
committerVille Savolainen <ville.savolainen@dovecot.fi>
Tue, 10 Sep 2019 07:01:55 +0000 (10:01 +0300)
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 <slyfox@gentoo.org>

src/auth/userdb-passwd.c

index d0f8b680aad9a0cf135066d432f5d36fc4c93be8..fa868e6b817451ec03b5d4ff9052ef2fc703ab60 100644 (file)
@@ -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");