]> 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)
committerAki Tuomi <aki.tuomi@open-xchange.com>
Wed, 10 Jul 2019 06:00:32 +0000 (09:00 +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 ee8edf04eec3e47a16f70dfdf7d86892431dee71..708762b84a3a8414085f227ebae897ffd1511398 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");