summaryrefslogtreecommitdiffstats
path: root/src/lib/gssapi/krb5
diff options
context:
space:
mode:
authorKen Raeburn <raeburn@mit.edu>2004-07-07 00:29:31 +0000
committerKen Raeburn <raeburn@mit.edu>2004-07-07 00:29:31 +0000
commit67623e8db7aef5bbe49bf57614de4892c6baedeb (patch)
treeaf63695aaa7a12ebf19491d816ba78582196d086 /src/lib/gssapi/krb5
parent37ca131d2e46bc897e555785900019fa63184285 (diff)
downloadkrb5-67623e8db7aef5bbe49bf57614de4892c6baedeb.tar.gz
krb5-67623e8db7aef5bbe49bf57614de4892c6baedeb.tar.xz
krb5-67623e8db7aef5bbe49bf57614de4892c6baedeb.zip
* import_name.c (krb5_gss_import_name) [HAVE_GETPWUID_R]: Use getpwuid_r
git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@16548 dc483132-0cff-0310-8789-dd5450dbe970
Diffstat (limited to 'src/lib/gssapi/krb5')
-rw-r--r--src/lib/gssapi/krb5/ChangeLog6
-rw-r--r--src/lib/gssapi/krb5/import_name.c31
2 files changed, 32 insertions, 5 deletions
diff --git a/src/lib/gssapi/krb5/ChangeLog b/src/lib/gssapi/krb5/ChangeLog
index 0004e66213..2b77951aa1 100644
--- a/src/lib/gssapi/krb5/ChangeLog
+++ b/src/lib/gssapi/krb5/ChangeLog
@@ -1,3 +1,9 @@
+2004-07-06 Ken Raeburn <raeburn@mit.edu>
+
+ * import_name.c [HAVE_GETPWUID_R]: Include stdio.h.
+ (krb5_gss_import_name) [HAVE_GETPWUID_R]: Use getpwuid_r instead
+ of getpwuid, for thread safety.
+
2004-06-17 Tom Yu <tlyu@mit.edu>
* ser_sctx.c (kg_ctx_size, kg_ctx_externalize):
diff --git a/src/lib/gssapi/krb5/import_name.c b/src/lib/gssapi/krb5/import_name.c
index c9f95857d4..ed78b1e258 100644
--- a/src/lib/gssapi/krb5/import_name.c
+++ b/src/lib/gssapi/krb5/import_name.c
@@ -28,6 +28,9 @@
#ifndef NO_PASSWORD
#include <pwd.h>
+#ifdef HAVE_GETPWUID_R
+#include <stdio.h>
+#endif
#endif
#ifdef HAVE_STRING_H
@@ -116,6 +119,14 @@ krb5_gss_import_name(minor_status, input_name_buffer,
return(GSS_S_FAILURE);
}
} else {
+#ifndef NO_PASSWORD
+ uid_t uid;
+#ifdef HAVE_GETPWUID_R
+ struct passwd pwx;
+ char pwbuf[BUFSIZ];
+#endif
+#endif
+
stringrep = NULL;
if ((tmp =
@@ -135,15 +146,25 @@ krb5_gss_import_name(minor_status, input_name_buffer,
stringrep = (char *) tmp;
#ifndef NO_PASSWORD
} else if (g_OID_equal(input_name_type, gss_nt_machine_uid_name)) {
- if ((pw = getpwuid(*((uid_t *) input_name_buffer->value))))
+ uid = *(uid_t *) input_name_buffer->value;
+ do_getpwuid:
+#ifndef HAVE_GETPWUID_R
+ pw = getpwuid(uid);
+#elif defined(GETPWUID_R_4_ARGS)
+ /* old POSIX drafts */
+ pw = getpwuid_r(uid, &pwx, pwbuf, sizeof(pwbuf));
+#else
+ /* POSIX */
+ if (getpwuid_r(uid, &pwx, pwbuf, sizeof(pwbuf), &pw) != 0)
+ pw = NULL;
+#endif
+ if (pw)
stringrep = pw->pw_name;
else
*minor_status = (OM_uint32) G_NOUSER;
} else if (g_OID_equal(input_name_type, gss_nt_string_uid_name)) {
- if ((pw = getpwuid((uid_t) atoi(tmp))))
- stringrep = pw->pw_name;
- else
- *minor_status = (OM_uint32) G_NOUSER;
+ uid = atoi(tmp);
+ goto do_getpwuid;
#endif
} else if (g_OID_equal(input_name_type, gss_nt_exported_name)) {
cp = tmp;