aboutsummaryrefslogtreecommitdiff
path: root/nis/nss_nisplus/nisplus-pwd.c
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2005-12-03 22:15:54 +0000
committerUlrich Drepper <drepper@redhat.com>2005-12-03 22:15:54 +0000
commit8e64faef03af02a8d4635d199a5b8e55ec68111e (patch)
treeb9fc41a4185921aaf04c69fbf720a0fb410a4458 /nis/nss_nisplus/nisplus-pwd.c
parent636e689e6fb0da525b80620cdb64cdaf75aa3c6a (diff)
downloadglibc-8e64faef03af02a8d4635d199a5b8e55ec68111e.tar
glibc-8e64faef03af02a8d4635d199a5b8e55ec68111e.tar.gz
glibc-8e64faef03af02a8d4635d199a5b8e55ec68111e.tar.bz2
glibc-8e64faef03af02a8d4635d199a5b8e55ec68111e.zip
* nis/nis_error.c (nis_sperror_r): Let snprintf determine whether
there is an overflow. * nis/nss_nisplus/nisplus-netgrp.c (_nss_nisplus_setnetgrent): Rewrite to use snprintf. * nis/nss_nisplus/nisplus-publickey.c (_nss_nisplus_netname2user): Likewise.
Diffstat (limited to 'nis/nss_nisplus/nisplus-pwd.c')
-rw-r--r--nis/nss_nisplus/nisplus-pwd.c15
1 files changed, 6 insertions, 9 deletions
diff --git a/nis/nss_nisplus/nisplus-pwd.c b/nis/nss_nisplus/nisplus-pwd.c
index a1c53f74a6..97679dd349 100644
--- a/nis/nss_nisplus/nisplus-pwd.c
+++ b/nis/nss_nisplus/nisplus-pwd.c
@@ -56,7 +56,12 @@ _nss_pwd_create_tablename (int *errnop)
atomic_write_barrier ();
- pwd_tablename_val = p;
+ if (atomic_compare_and_exchange_bool_acq (&pwd_tablename_val, p, NULL))
+ {
+ /* Another thread already installed the value. */
+ free (p);
+ pwd_tablename_len = strlen (pwd_tablename_val);
+ }
}
return NSS_STATUS_SUCCESS;
@@ -181,12 +186,8 @@ _nss_nisplus_getpwnam_r (const char *name, struct passwd *pw,
if (pwd_tablename_val == NULL)
{
- __libc_lock_lock (lock);
-
enum nss_status status = _nss_pwd_create_tablename (errnop);
- __libc_lock_unlock (lock);
-
if (status != NSS_STATUS_SUCCESS)
return status;
}
@@ -248,12 +249,8 @@ _nss_nisplus_getpwuid_r (const uid_t uid, struct passwd *pw,
{
if (pwd_tablename_val == NULL)
{
- __libc_lock_lock (lock);
-
enum nss_status status = _nss_pwd_create_tablename (errnop);
- __libc_lock_unlock (lock);
-
if (status != NSS_STATUS_SUCCESS)
return status;
}