]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
nss: fix __get_default_domain logic master
authorDJ Delorie <dj@redhat.com>
Wed, 1 Apr 2026 21:52:25 +0000 (17:52 -0400)
committerDJ Delorie <dj@redhat.com>
Mon, 13 Apr 2026 21:14:21 +0000 (17:14 -0400)
Fix logic bug in __nss_get_default_domain that prevents
proper initialization.

Because this function is not exposed, the test case must link
against the object directly.

Bug origin commit: 64d1e08ea822bf47cb2796ad0f727136227f983c

Co-authored-by: Florian Weimer <fweimer@redhat.com>
Reviewed-by: Frédéric Bérat <fberat@redhat.com>
nss/Makefile
nss/nss_compat/nisdomain.c
nss/tst-default-domain.c [new file with mode: 0644]

index 1c48bd087642d0819bba8b841a533eeb68f351dc..54389ced0ee53bc3f631f10450b190407a46ef18 100644 (file)
@@ -317,6 +317,7 @@ tests := \
   test-netdb \
   test-rpcent \
   testgrp \
+  tst-default-domain \
   tst-fgetsgent_r \
   tst-getaddrinfo \
   tst-getaddrinfo2 \
@@ -515,6 +516,8 @@ endif
 $(objpfx)tst-nss-files-alias-leak.out: $(objpfx)libnss_files.so
 $(objpfx)tst-nss-files-alias-truncated.out: $(objpfx)libnss_files.so
 
+$(objpfx)tst-default-domain: $(objpfx)nisdomain.os
+
 tst-nss-gai-hv2-canonname-ENV = \
                MALLOC_TRACE=$(objpfx)tst-nss-gai-hv2-canonname.mtrace \
                LD_PRELOAD=$(common-objpfx)/malloc/libc_malloc_debug.so
index e7a776b539f11aad79f3cb7ae9a84ae209907ebe..e98ad69f44c03901e55c82e9030c234e5bd5507a 100644 (file)
@@ -36,7 +36,7 @@ __nss_get_default_domain (char **outdomain)
 
   __libc_lock_lock (domainname_lock);
 
-  if (domainname[0] != '\0')
+  if (domainname[0] == '\0')
     {
       if (getdomainname (domainname, MAXDOMAINNAMELEN) < 0)
        result = errno;
diff --git a/nss/tst-default-domain.c b/nss/tst-default-domain.c
new file mode 100644 (file)
index 0000000..2fa9153
--- /dev/null
@@ -0,0 +1,123 @@
+/* Basic test of __nss_get_default_domain
+   Copyright (C) 2026 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
+   <https://www.gnu.org/licenses/>.  */
+
+#include <unistd.h>
+#include <string.h>
+#include <dlfcn.h>
+
+#include "nss_compat/nisdomain.h"
+
+#include <support/test-driver.h>
+#include <support/support.h>
+#include <support/namespace.h>
+#include <support/check.h>
+
+char unset_domain[] = "unset_domain";
+char new_domain[] = "new_domain";
+
+/* This function checks the __nss_get_default_domain() function in
+   nss_compat/nssdomain.c.  Because this is an internal function to
+   libnss_compat.so, the Makefile will link that object to this test
+   case directly.  */
+
+static int
+do_test (void)
+{
+  char *domain_name;
+  char buf[1024];
+
+  /* We need to be in a network namespace so we can change the domain
+     name without interfering with the host system.  */
+  support_become_root ();
+  support_enter_network_namespace ();
+  if (!support_in_uts_namespace ())
+    return EXIT_UNSUPPORTED;
+
+  /* First pass: set an empty domain and make sure it's returned
+     correctly.  This should not be cached.  */
+
+  /* Set the domain name to a known value.  */
+  TEST_VERIFY (setdomainname ("", 0) == 0);
+
+  /* Make sure it got set.  */
+  TEST_VERIFY (getdomainname (buf, sizeof(buf)) == 0);
+  TEST_COMPARE_STRING (buf, "");
+
+  /* Set this to a known "unknown" value so we can detect if it's not
+     changed.  */
+  domain_name = unset_domain;
+
+  /* This is the function we're testing.  */
+  TEST_VERIFY (__nss_get_default_domain (& domain_name) == 0);
+
+  /* Make sure the correct domain name is returned.  */
+  TEST_VERIFY (domain_name != NULL);
+  TEST_COMPARE_STRING (domain_name, "");
+
+  /* Second pass: set a non-empty domain and make sure it's returned
+     correctly.  This works because the empty domain is not
+     cached.  */
+
+  /* Set the domain name to a known value.  */
+  TEST_VERIFY (setdomainname (new_domain, strlen (new_domain)) == 0);
+
+  /* Make sure it got set.  */
+  TEST_VERIFY (getdomainname (buf, sizeof(buf)) == 0);
+  TEST_COMPARE_STRING (buf, new_domain);
+
+  /* Set this to a known "unknown" value so we can detect if it's not
+     changed.  */
+  domain_name = unset_domain;
+
+  /* This is the function we're testing.  */
+  TEST_VERIFY (__nss_get_default_domain (& domain_name) == 0);
+
+  /* Make sure the correct domain name is returned.  */
+  TEST_VERIFY (domain_name != NULL);
+  TEST_COMPARE_STRING (domain_name, new_domain);
+
+  /* The function caches the name, so check it twice.  */
+  TEST_VERIFY (__nss_get_default_domain (& domain_name) == 0);
+
+  TEST_VERIFY (domain_name != NULL);
+  TEST_COMPARE_STRING (domain_name, new_domain);
+
+  /* Third pass: set an empty domain again but expect the cached
+     value.  */
+
+  /* Set the domain name to a known value.  */
+  TEST_VERIFY (setdomainname ("", 0) == 0);
+
+  /* Make sure it got set.  */
+  TEST_VERIFY (getdomainname (buf, sizeof(buf)) == 0);
+  TEST_COMPARE_STRING (buf, "");
+
+  /* Set this to a known "unknown" value so we can detect if it's not
+     changed.  */
+  domain_name = unset_domain;
+
+  /* This is the function we're testing.  */
+  TEST_VERIFY (__nss_get_default_domain (& domain_name) == 0);
+
+  TEST_VERIFY (domain_name != NULL);
+  TEST_COMPARE_STRING (domain_name, new_domain);
+
+  return 0;
+}
+
+#include <support/test-driver.c>