From patchwork Wed Oct 8 11:29:42 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Schwab X-Patchwork-Id: 121480 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 71CBC3858434 for ; Wed, 8 Oct 2025 11:30:59 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 71CBC3858434 Authentication-Results: sourceware.org; dkim=pass (1024-bit key, unprotected) header.d=suse.de header.i=@suse.de header.a=rsa-sha256 header.s=susede2_rsa header.b=qn6ea3Pr; dkim=pass header.d=suse.de header.i=@suse.de header.a=ed25519-sha256 header.s=susede2_ed25519 header.b=MhF9SrwU; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.a=rsa-sha256 header.s=susede2_rsa header.b=qn6ea3Pr; dkim=neutral header.d=suse.de header.i=@suse.de header.a=ed25519-sha256 header.s=susede2_ed25519 header.b=MhF9SrwU X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from smtp-out1.suse.de (smtp-out1.suse.de [195.135.223.130]) by sourceware.org (Postfix) with ESMTPS id 22E28385B510 for ; Wed, 8 Oct 2025 11:29:43 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 22E28385B510 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=suse.de Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=suse.de ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 22E28385B510 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=195.135.223.130 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1759922983; cv=none; b=qkB5UM0krsIRCB23/ZMj3b0aSqLkAFZlNNZaGyhE73sY1hufImiL2WomUQPXEepSSucE4imdxjQCm0rzmlPyveMsVtO5lRNj+hk/8/TPSL4YMtdhC2PV5WZRWWr6kVMqHyS7aE5IvZlZh5cG4CL+qk6XrCsuSWOnsrFfe7EfUUk= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1759922983; c=relaxed/simple; bh=b8b9nsV3TbWZG6dgBBt2n02crbAasW0O4aZDCEROh/g=; h=DKIM-Signature:DKIM-Signature:DKIM-Signature:DKIM-Signature:From: To:Subject:Date:Message-ID:MIME-Version; b=OATNLzVdktJxCVBAZd7/4hAzoXLUabEfDsIOQ8ppvPDNI1jaTwjibmogqIgvf/WLAxaSKYG30XDtWmzv9eRips6JEqbDOwOnikVqKnFeg9AF/E3rm0k+NKSaYCVBgz0vdvd+reM7To1Ijqr7npTArX+ZH510930nCT2hNxUF+p4= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 22E28385B510 Received: from hawking.nue2.suse.org (unknown [10.168.4.11]) by smtp-out1.suse.de (Postfix) with ESMTP id 1EE6722C93 for ; Wed, 8 Oct 2025 11:29:42 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1759922982; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version:content-type:content-type; bh=yKvPJN9ZkhDEBaTgu+59Nvh96AxfQbjNRQ9WrisVhKQ=; b=qn6ea3PrksfCMNQvSl+SbcuFvuYhA8fThnS9JgH9CHcchZU2SyFvJxCmFBHWPrysps0pDV qbkQiadjJwpVjLz83Ikvsn6AwaEwUvVsuFRJv6K1P+FmQeGU+E5Lya0L+9UKjOhb1T35Vs luPRNRHITogs9hsYwCjJdMp6DPFUbOs= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1759922982; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version:content-type:content-type; bh=yKvPJN9ZkhDEBaTgu+59Nvh96AxfQbjNRQ9WrisVhKQ=; b=MhF9SrwUazxX6XWtVb2jBcdGBcp7beeKy4MfJa0dweK7mkBx+WJlIZdJTxIMFYmZenfcJK xvkqxv6nfgCM9+DQ== Authentication-Results: smtp-out1.suse.de; none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1759922982; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version:content-type:content-type; bh=yKvPJN9ZkhDEBaTgu+59Nvh96AxfQbjNRQ9WrisVhKQ=; b=qn6ea3PrksfCMNQvSl+SbcuFvuYhA8fThnS9JgH9CHcchZU2SyFvJxCmFBHWPrysps0pDV qbkQiadjJwpVjLz83Ikvsn6AwaEwUvVsuFRJv6K1P+FmQeGU+E5Lya0L+9UKjOhb1T35Vs luPRNRHITogs9hsYwCjJdMp6DPFUbOs= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1759922982; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version:content-type:content-type; bh=yKvPJN9ZkhDEBaTgu+59Nvh96AxfQbjNRQ9WrisVhKQ=; b=MhF9SrwUazxX6XWtVb2jBcdGBcp7beeKy4MfJa0dweK7mkBx+WJlIZdJTxIMFYmZenfcJK xvkqxv6nfgCM9+DQ== Received: by hawking.nue2.suse.org (Postfix, from userid 17005) id 10D284AAE3D; Wed, 8 Oct 2025 13:29:42 +0200 (CEST) From: Andreas Schwab To: libc-alpha@sourceware.org Subject: [PATCH] nss: use C locale for parsing nsswitch.conf (bug 33519) Date: Wed, 08 Oct 2025 13:29:42 +0200 Message-ID: User-Agent: Gnus/5.13 (Gnus v5.13) MIME-Version: 1.0 X-Spam-Level: X-Spamd-Result: default: False [-4.20 / 50.00]; BAYES_HAM(-3.00)[100.00%]; NEURAL_HAM_LONG(-1.00)[-1.000]; NEURAL_HAM_SHORT(-0.20)[-0.992]; RCVD_NO_TLS_LAST(0.10)[]; MIME_GOOD(-0.10)[text/plain]; FROM_HAS_DN(0.00)[]; RCPT_COUNT_ONE(0.00)[1]; MIME_TRACE(0.00)[0:+]; RCVD_COUNT_ONE(0.00)[1]; ARC_NA(0.00)[]; MID_RHS_MATCH_FROM(0.00)[]; DKIM_SIGNED(0.00)[suse.de:s=susede2_rsa,suse.de:s=susede2_ed25519]; FROM_EQ_ENVFROM(0.00)[]; FUZZY_RATELIMITED(0.00)[rspamd.com]; TO_DN_NONE(0.00)[]; TO_MATCH_ENVRCPT_ALL(0.00)[]; DBL_BLOCKED_OPENRESOLVER(0.00)[suse.de:email,suse.de:mid] X-Spam-Score: -4.20 X-Spam-Status: No, score=-9.4 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, KAM_SHORT, RCVD_IN_VALIDITY_RPBL_BLOCKED, RCVD_IN_VALIDITY_SAFE_BLOCKED, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.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 The keywords in nsswitch.conf are ASCII-only, but some locales map ASCII charactes to non-ASCII characters in case conversion. Reviewed-by: Florian Weimer --- nss/Makefile | 6 +++ nss/nss_action_parse.c | 32 ++++++++------ nss/tst-nss-action-parse.c | 42 +++++++++++++++++++ nss/tst-nss-action-parse.root/etc/group | 1 + .../etc/nsswitch.conf | 1 + 5 files changed, 70 insertions(+), 12 deletions(-) create mode 100644 nss/tst-nss-action-parse.c create mode 100644 nss/tst-nss-action-parse.root/etc/group create mode 100644 nss/tst-nss-action-parse.root/etc/nsswitch.conf diff --git a/nss/Makefile b/nss/Makefile index 1991b7482a..96d9295778 100644 --- a/nss/Makefile +++ b/nss/Makefile @@ -356,6 +356,7 @@ tests-container := \ tst-nss-gai-actions \ tst-nss-gai-hv2-canonname \ tst-nss-test3 \ + tst-nss-action-parse \ tst-reload1 \ tst-reload2 \ # tests-container @@ -444,6 +445,9 @@ generated += mtrace-tst-nss-gai-hv2-canonname.out \ include ../Rules +LOCALES := tr_TR.UTF-8 +include ../gen-locales.mk + ifeq (yes,$(have-selinux)) LDLIBS-makedb := -lselinux endif @@ -521,6 +525,8 @@ $(objpfx)mtrace-tst-nss-gai-hv2-canonname.out: \ $(objpfx)tst-nss-gai-hv2-canonname.mtrace; } > $@; \ $(evaluate-test) +$(objpfx)tst-nss-action-parse.out: $(gen-locales) + # Disable DT_RUNPATH on NSS tests so that the glibc internal NSS # functions can load testing NSS modules via DT_RPATH. LDFLAGS-tst-nss-test1 = -Wl,--disable-new-dtags diff --git a/nss/nss_action_parse.c b/nss/nss_action_parse.c index ee3aadf312..cf55b7036b 100644 --- a/nss/nss_action_parse.c +++ b/nss/nss_action_parse.c @@ -48,7 +48,8 @@ nss_action_parse (const char *line, struct action_list *result) /* Read identifier. */ const char *name = line; - while (line[0] != '\0' && !isspace (line[0]) && line[0] != '[') + while (line[0] != '\0' && !__isspace_l (line[0], _nl_C_locobj_ptr) + && line[0] != '[') ++line; if (name == line) return true; @@ -88,25 +89,29 @@ nss_action_parse (const char *line, struct action_list *result) /* Read status name. */ name = line; - while (line[0] != '\0' && !isspace (line[0]) && line[0] != '=' - && line[0] != ']') + while (line[0] != '\0' && !__isspace_l (line[0], _nl_C_locobj_ptr) + && line[0] != '=' && line[0] != ']') ++line; /* Compare with known statuses. */ if (line - name == 7) { - if (__strncasecmp (name, "SUCCESS", 7) == 0) + if (__strncasecmp_l (name, "SUCCESS", 7, + _nl_C_locobj_ptr) == 0) status = NSS_STATUS_SUCCESS; - else if (__strncasecmp (name, "UNAVAIL", 7) == 0) + else if (__strncasecmp_l (name, "UNAVAIL", 7, + _nl_C_locobj_ptr) == 0) status = NSS_STATUS_UNAVAIL; else return false; } else if (line - name == 8) { - if (__strncasecmp (name, "NOTFOUND", 8) == 0) + if (__strncasecmp_l (name, "NOTFOUND", 8, + _nl_C_locobj_ptr) == 0) status = NSS_STATUS_NOTFOUND; - else if (__strncasecmp (name, "TRYAGAIN", 8) == 0) + else if (__strncasecmp_l (name, "TRYAGAIN", 8, + _nl_C_locobj_ptr) == 0) status = NSS_STATUS_TRYAGAIN; else return false; @@ -122,17 +127,20 @@ nss_action_parse (const char *line, struct action_list *result) ++line; SKIP_WS (); name = line; - while (line[0] != '\0' && !isspace (line[0]) && line[0] != '=' - && line[0] != ']') + while (line[0] != '\0' && !__isspace_l (line[0], _nl_C_locobj_ptr) + && line[0] != '=' && line[0] != ']') ++line; - if (line - name == 6 && __strncasecmp (name, "RETURN", 6) == 0) + if (line - name == 6 + && __strncasecmp_l (name, "RETURN", 6, _nl_C_locobj_ptr) == 0) action = NSS_ACTION_RETURN; else if (line - name == 8 - && __strncasecmp (name, "CONTINUE", 8) == 0) + && __strncasecmp_l (name, "CONTINUE", 8, + _nl_C_locobj_ptr) == 0) action = NSS_ACTION_CONTINUE; else if (line - name == 5 - && __strncasecmp (name, "MERGE", 5) == 0) + && __strncasecmp_l (name, "MERGE", 5, + _nl_C_locobj_ptr) == 0) action = NSS_ACTION_MERGE; else return false; diff --git a/nss/tst-nss-action-parse.c b/nss/tst-nss-action-parse.c new file mode 100644 index 0000000000..8c4a71085e --- /dev/null +++ b/nss/tst-nss-action-parse.c @@ -0,0 +1,42 @@ +/* Test that the nsswitch.conf parser is locale agnostic. + Copyright (C) 2025 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include +#include + +#include +#include + +/* Test that the nsswitch.conf parser works correctly in a locale that + maps ASCII characters to non-ASCII characters in case conversion. + Bug #33519 */ + +static int +do_test (void) +{ + xsetlocale (LC_ALL, "tr_TR.UTF-8"); + + /* Trigger parsing of nsswitch.conf. If that fails then the use of any + NSS function will return an error. */ + struct group *grp = getgrgid (0); + TEST_VERIFY (grp != NULL); + + return 0; +} + +#include diff --git a/nss/tst-nss-action-parse.root/etc/group b/nss/tst-nss-action-parse.root/etc/group new file mode 100644 index 0000000000..1dbf9013ee --- /dev/null +++ b/nss/tst-nss-action-parse.root/etc/group @@ -0,0 +1 @@ +root:x:0: diff --git a/nss/tst-nss-action-parse.root/etc/nsswitch.conf b/nss/tst-nss-action-parse.root/etc/nsswitch.conf new file mode 100644 index 0000000000..4f5151f625 --- /dev/null +++ b/nss/tst-nss-action-parse.root/etc/nsswitch.conf @@ -0,0 +1 @@ +group: files [unavail=return]