Hi,
I sent this to sssd-devel already, but probably it was the wrong channel, so I'm trying it here.
I'm using Dovecot with its "passwd" userdb, which effectivly uses NSS. NSS services are provided by the files and by the sss "plugins".
The `doveadm user *` command enumerates the list of users. Repeating the command doesn't enumerate the users provided by sssd again.
Analyzing this issue reveals:
Dovecot uses a long living process talking to NSS. For user enumeration it uses
setpwent() while (…) { getpwent(); }
and then misses the call to endpwent(). This bug is already confirmed by the Dovecot developers.
I'm not sure about the semantics of setpwent()/endpwend(), especially about calling sequences like
setpwent() while (…) { getpwent(); }
setpwent() while (…) { getpwent(); }
According to setpwent(3) it should rewind to the beginning. Calling endpwent() seems to be for curtesy only (to have resources freed)
I suggest calling a preventive endpwent() before using setpwent() again in nss_cmd.c.
Attached you'll find my patch. I'd be happy about review and integration into upstream.
Best regards from Dresden/Germany Viele Grüße aus Dresden Heiko Schlittermann -- SCHLITTERMANN.de ---------------------------- internet & unix support - Heiko Schlittermann, Dipl.-Ing. (TU) - {fon,fax}: +49.351.802998{1,3} - gnupg encrypted messages are welcome --------------- key ID: F69376CE -
On Fri, Feb 26, 2021 at 11:47:34AM +0100, Heiko Schlittermann wrote:
Hi,
Hi,
please see my reply on sssd-devel.
bye, Sumit
I sent this to sssd-devel already, but probably it was the wrong channel, so I'm trying it here.
I'm using Dovecot with its "passwd" userdb, which effectivly uses NSS. NSS services are provided by the files and by the sss "plugins".
The `doveadm user *` command enumerates the list of users. Repeating the command doesn't enumerate the users provided by sssd again.
Analyzing this issue reveals:
Dovecot uses a long living process talking to NSS. For user enumeration it uses
setpwent() while (…) { getpwent(); }
and then misses the call to endpwent(). This bug is already confirmed by the Dovecot developers.
I'm not sure about the semantics of setpwent()/endpwend(), especially about calling sequences like
setpwent() while (…) { getpwent(); } setpwent() while (…) { getpwent(); }
According to setpwent(3) it should rewind to the beginning. Calling endpwent() seems to be for curtesy only (to have resources freed)
I suggest calling a preventive endpwent() before using setpwent() again in nss_cmd.c.
Attached you'll find my patch. I'd be happy about review and integration into upstream.
Best regards from Dresden/Germany Viele Grüße aus Dresden Heiko Schlittermann
-- SCHLITTERMANN.de ---------------------------- internet & unix support - Heiko Schlittermann, Dipl.-Ing. (TU) - {fon,fax}: +49.351.802998{1,3} - gnupg encrypted messages are welcome --------------- key ID: F69376CE -
From: Heiko Schlittermann hs@schlittermann.de Subject: Add preventive endpwent() to setpwent() --- a/src/responder/nss/nss_cmd.c +++ b/src/responder/nss/nss_cmd.c @@ -936,10 +936,19 @@ SSS_MC_PASSWD, nss_protocol_fill_pwent); }
+static errno_t nss_cmd_endpwent(struct cli_ctx *cli_ctx) +{
- struct nss_state_ctx *state_ctx;
- state_ctx = talloc_get_type(cli_ctx->state_ctx, struct nss_state_ctx);
- return nss_endent(cli_ctx, &state_ctx->pwent);
+}
static errno_t nss_cmd_setpwent(struct cli_ctx *cli_ctx) { struct nss_ctx *nss_ctx;
nss_cmd_endpwent(cli_ctx); nss_ctx = talloc_get_type(cli_ctx->rctx->pvt_ctx, struct nss_ctx);
return nss_setent(cli_ctx, CACHE_REQ_ENUM_USERS, &nss_ctx->pwent);
@@ -958,15 +967,6 @@ &nss_ctx->pwent); }
-static errno_t nss_cmd_endpwent(struct cli_ctx *cli_ctx) -{
- struct nss_state_ctx *state_ctx;
- state_ctx = talloc_get_type(cli_ctx->state_ctx, struct nss_state_ctx);
- return nss_endent(cli_ctx, &state_ctx->pwent);
-}
static errno_t nss_cmd_getgrnam(struct cli_ctx *cli_ctx) { return nss_getby_name(cli_ctx, false, CACHE_REQ_GROUP_BY_NAME, NULL,
sssd-users mailing list -- sssd-users@lists.fedorahosted.org To unsubscribe send an email to sssd-users-leave@lists.fedorahosted.org Fedora Code of Conduct: https://docs.fedoraproject.org/en-US/project/code-of-conduct/ List Guidelines: https://fedoraproject.org/wiki/Mailing_list_guidelines List Archives: https://lists.fedorahosted.org/archives/list/sssd-users@lists.fedorahosted.o... Do not reply to spam on the list, report it: https://pagure.io/fedora-infrastructure
sssd-users@lists.fedorahosted.org