From patchwork Fri Mar 20 20:42:50 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Florian Weimer X-Patchwork-Id: 132125 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from vm01.sourceware.org (localhost [127.0.0.1]) by sourceware.org (Postfix) with ESMTP id 7CA574C9174F for ; Fri, 20 Mar 2026 20:58:23 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 7CA574C9174F Authentication-Results: sourceware.org; dkim=pass (1024-bit key, unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=H0G3Rq7t X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by sourceware.org (Postfix) with ESMTP id 3E67E4C31843 for ; Fri, 20 Mar 2026 20:42:56 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 3E67E4C31843 Authentication-Results: sourceware.org; dmarc=pass (p=quarantine dis=none) header.from=redhat.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=redhat.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 3E67E4C31843 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=170.10.129.124 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1774039376; cv=none; b=VnV0VIpuQvRyAzu96gNtlALNsI6KaXZs+cb3NtnPSWpTxeH49/gAhypJFtpaQaSNfLGUdxND2PVVUin9GX6fO79TdLnoo/m0FDQpqOlF7fq6T3cKA6ayEvnj4S+oPIoDa2d/YVJ2SypTnJeyT1UpQ1rQpks8dvcnMqbESkWB+9I= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1774039376; c=relaxed/simple; bh=kJn+ZWFyuCXOQtEJ43EBYQcXpG/1EVeKZZq/G3Yc4eI=; h=DKIM-Signature:From:To:Subject:Message-ID:Date:MIME-Version; b=VmKJatGN8aXMJ83/qe6kWST+tpcQPISU7MKAFo/rRGoVzYXD0VKeseHJmp1HfkyadSDZIaoXZpWn6SAy/7GXnhRhN6zPHy6fm9Wl6H5KZh6cFMNBPvFv0wwlpeDGc61Mj/tNmuIFoYVhkHKaCFhacwGFcstf7c9Si+yylyNTG5g= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 3E67E4C31843 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1774039375; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=myyibIa5dKUPMuZWDrlux6FLeGYYTJBVZMtjGA6yz24=; b=H0G3Rq7tLCjrlC0yR1W255L8c3cUD5q7iUSwOSraTieMpLtRmLOBmbrWBWBYPQZSJ+ZVDI J9r0aCtZmwuSRHZaDFwozpyHG4MqL4wawWEX2Rc+Sq2qEJR4p4Pi2Nz0oDGpQhlgYfuz9S 9Ek/2V85KUeSLkQpVLKtyWE0ZvRjzxw= Received: from mx-prod-mc-03.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-515-0DCo1pqsPpivMfrAw71xVA-1; Fri, 20 Mar 2026 16:42:54 -0400 X-MC-Unique: 0DCo1pqsPpivMfrAw71xVA-1 X-Mimecast-MFC-AGG-ID: 0DCo1pqsPpivMfrAw71xVA_1774039374 Received: from mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.17]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-03.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 0659F19560AA for ; Fri, 20 Mar 2026 20:42:54 +0000 (UTC) Received: from fweimer-oldenburg.csb.redhat.com (unknown [10.45.224.63]) by mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 50A141953944 for ; Fri, 20 Mar 2026 20:42:53 +0000 (UTC) From: Florian Weimer To: libc-alpha@sourceware.org Subject: [PATCH v2 17/23] nscd: Convert passwd client to __nscd_generic_get In-Reply-To: Message-ID: References: X-From-Line: dc974c5044755a818cd015e82088a649c4141c39 Mon Sep 17 00:00:00 2001 Date: Fri, 20 Mar 2026 21:42:50 +0100 User-Agent: Gnus/5.13 (Gnus v5.13) MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.0 on 10.30.177.17 X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: NUkC5ttWl5nx-GHjakhdlxhnl8kRRzDvG-jFDOmAKGk_1774039374 X-Mimecast-Originator: redhat.com X-Spam-Status: No, score=-9.9 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_BLOCKED, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, RCVD_IN_VALIDITY_RPBL_BLOCKED, RCVD_IN_VALIDITY_SAFE_BLOCKED, SPF_HELO_PASS, SPF_NONE, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libc-alpha-bounces~patchwork=sourceware.org@sourceware.org --- nscd/nscd_getpw_r.c | 165 +++++--------------------------------------- 1 file changed, 19 insertions(+), 146 deletions(-) Reviewed-by: Carlos O'Donell diff --git a/nscd/nscd_getpw_r.c b/nscd/nscd_getpw_r.c index 8ce1009fe0..97a752fa48 100644 --- a/nscd/nscd_getpw_r.c +++ b/nscd/nscd_getpw_r.c @@ -29,23 +29,21 @@ #include #include #include <_itoa.h> +#include #include "nscd-client.h" #include "nscd-dbtype.h" #include "nscd_proto.h" -static int nscd_getpw_r (const char *key, size_t keylen, request_type type, - struct passwd *resultbuf, char *buffer, - size_t buflen, struct passwd **result); +static int nscd_getpw_r (enum nss_lookup_type lt, const void *key, + struct passwd *resultbuf, char *buffer, size_t buflen, + struct passwd **result); int __nscd_getpwnam_r (const char *name, struct passwd *resultbuf, char *buffer, size_t buflen, struct passwd **result) { - if (name == NULL) - return -1; - - return nscd_getpw_r (name, strlen (name) + 1, GETPWBYNAME, resultbuf, + return nscd_getpw_r (nss_lookup_getpwnam, name, resultbuf, buffer, buflen, result); } @@ -53,155 +51,30 @@ int __nscd_getpwuid_r (uid_t uid, struct passwd *resultbuf, char *buffer, size_t buflen, struct passwd **result) { - char buf[3 * sizeof (uid_t)]; - buf[sizeof (buf) - 1] = '\0'; - char *cp = _itoa_word (uid, buf + sizeof (buf) - 1, 10, 0); - - return nscd_getpw_r (cp, buf + sizeof (buf) - cp, GETPWBYUID, resultbuf, + return nscd_getpw_r (nss_lookup_getpwuid, &uid, resultbuf, buffer, buflen, result); } static int -nscd_getpw_r (const char *key, size_t keylen, request_type type, +nscd_getpw_r (enum nss_lookup_type lt, const void *key, struct passwd *resultbuf, char *buffer, size_t buflen, struct passwd **result) { - int gc_cycle; - int nretries = 0; - - /* If the mapping is available, try to search there instead of - communicating with the nscd. */ - struct mapped_database *map = __nscd_get_map_ref (pwddb, &gc_cycle); - - retry:; - const char *pw_name = NULL; - int retval = -1; - const char *recend = (const char *) ~UINTMAX_C (0); - pw_response_header pw_resp; - - if (map != NULL) + void *result1; + bool ok = __nscd_generic_get (lt, key, &result1); + if (ok) { - struct datahead *found = __nscd_cache_search (type, key, keylen, map, - sizeof pw_resp); - if (found != NULL) + if (result1 == NULL) { - pw_name = (const char *) (&found->data[0].pwdata + 1); - pw_resp = found->data[0].pwdata; - recend = (const char *) found->data + found->recsize; - /* Now check if we can trust pw_resp fields. If GC is - in progress, it can contain anything. */ - if (map->head->gc_cycle != gc_cycle) - { - retval = -2; - goto out; - } + *result = NULL; + return 0; } + int ret = __nss_generic_copy (lt, result1, resultbuf, buffer, buflen); + free (result1); + if (ret == 0) + *result = resultbuf; + return ret; } - - int sock = -1; - if (pw_name == NULL) - { - sock = __nscd_open_socket (key, keylen, type, &pw_resp, - sizeof (pw_resp)); - if (sock == -1) - { - __nscd_defer_database (pwddb); - goto out; - } - } - - /* No value found so far. */ - *result = NULL; - - if (__glibc_unlikely (pw_resp.found == -1)) - { - /* The daemon does not cache this database. */ - __nscd_defer_database (pwddb); - goto out_close; - } - - if (pw_resp.found == 1) - { - /* Set the information we already have. */ - resultbuf->pw_uid = pw_resp.pw_uid; - resultbuf->pw_gid = pw_resp.pw_gid; - - char *p = buffer; - /* get pw_name */ - resultbuf->pw_name = p; - p += pw_resp.pw_name_len; - /* get pw_passwd */ - resultbuf->pw_passwd = p; - p += pw_resp.pw_passwd_len; - /* get pw_gecos */ - resultbuf->pw_gecos = p; - p += pw_resp.pw_gecos_len; - /* get pw_dir */ - resultbuf->pw_dir = p; - p += pw_resp.pw_dir_len; - /* get pw_pshell */ - resultbuf->pw_shell = p; - p += pw_resp.pw_shell_len; - - ssize_t total = p - buffer; - if (__glibc_unlikely (pw_name + total > recend)) - goto out_close; - if (__glibc_unlikely (buflen < total)) - { - __set_errno (ERANGE); - retval = ERANGE; - goto out_close; - } - - retval = 0; - if (pw_name == NULL) - { - ssize_t nbytes = __readall (sock, buffer, total); - - if (__glibc_unlikely (nbytes != total)) - { - /* The `errno' to some value != ERANGE. */ - __set_errno (ENOENT); - retval = ENOENT; - } - else - *result = resultbuf; - } - else - { - /* Copy the various strings. */ - memcpy (resultbuf->pw_name, pw_name, total); - - /* Try to detect corrupt databases. */ - if (resultbuf->pw_name[pw_resp.pw_name_len - 1] != '\0' - || resultbuf->pw_passwd[pw_resp.pw_passwd_len - 1] != '\0' - || resultbuf->pw_gecos[pw_resp.pw_gecos_len - 1] != '\0' - || resultbuf->pw_dir[pw_resp.pw_dir_len - 1] != '\0' - || resultbuf->pw_shell[pw_resp.pw_shell_len - 1] != '\0') - { - /* We cannot use the database. */ - retval = map->head->gc_cycle != gc_cycle ? -2 : -1; - goto out_close; - } - - *result = resultbuf; - } - } - else - { - /* Set errno to 0 to indicate no error, just no found record. */ - __set_errno (0); - /* Even though we have not found anything, the result is zero. */ - retval = 0; - } - - out_close: - if (sock != -1) - __close_nocancel_nostatus (sock); - out: - if (__nscd_map_ref_retry_or_drop (&map, &gc_cycle, &nretries, retval)) - goto retry; - - return retval; + return -1; }