diff options
author | rmacklem <rmacklem@FreeBSD.org> | 2012-12-18 00:25:48 +0000 |
---|---|---|
committer | rmacklem <rmacklem@FreeBSD.org> | 2012-12-18 00:25:48 +0000 |
commit | a41d1bc642641e36d620138f93f484921d361bce (patch) | |
tree | 1a528b7e5e6224c7d6841c880e1617f1b61ec29e /sys/kgssapi/gss_pname_to_uid.c | |
parent | 17649eee7d94c9b2e7885ee9119c83cef611a8e4 (diff) | |
download | FreeBSD-src-a41d1bc642641e36d620138f93f484921d361bce.zip FreeBSD-src-a41d1bc642641e36d620138f93f484921d361bce.tar.gz |
Piete.Brooks at cl.cam.ac.uk reported via email a crash which was
caused by use of an invalid kgss_gssd_handle during an upcall to
the gssd daemon when it has exited. This patch seems to avoid the
crashes by holding a reference count on the kgss_gssd_handle until
the upcall is done. It also adds a new mutex kgss_gssd_lock used to
make manipulation of kgss_gssd_handle SMP safe.
Tested by: Illias A. Marinos, Herbert Poeckl
Reviewed by: jhb
MFC after: 2 weeks
Diffstat (limited to 'sys/kgssapi/gss_pname_to_uid.c')
-rw-r--r-- | sys/kgssapi/gss_pname_to_uid.c | 24 |
1 files changed, 16 insertions, 8 deletions
diff --git a/sys/kgssapi/gss_pname_to_uid.c b/sys/kgssapi/gss_pname_to_uid.c index b83fd73..45ead36 100644 --- a/sys/kgssapi/gss_pname_to_uid.c +++ b/sys/kgssapi/gss_pname_to_uid.c @@ -31,7 +31,9 @@ __FBSDID("$FreeBSD$"); #include <sys/param.h> #include <sys/kernel.h> #include <sys/kobj.h> +#include <sys/lock.h> #include <sys/malloc.h> +#include <sys/mutex.h> #include <kgssapi/gssapi.h> #include <kgssapi/gssapi_impl.h> @@ -45,20 +47,23 @@ gss_pname_to_uid(OM_uint32 *minor_status, const gss_name_t pname, struct pname_to_uid_res res; struct pname_to_uid_args args; enum clnt_stat stat; + CLIENT *cl; *minor_status = 0; - if (!kgss_gssd_handle) - return (GSS_S_FAILURE); - if (pname == GSS_C_NO_NAME) return (GSS_S_BAD_NAME); + cl = kgss_gssd_client(); + if (cl == NULL) + return (GSS_S_FAILURE); + args.pname = pname->handle; args.mech = mech; bzero(&res, sizeof(res)); - stat = gssd_pname_to_uid_1(&args, &res, kgss_gssd_handle); + stat = gssd_pname_to_uid_1(&args, &res, cl); + CLNT_RELEASE(cl); if (stat != RPC_SUCCESS) { *minor_status = stat; return (GSS_S_FAILURE); @@ -83,20 +88,23 @@ gss_pname_to_unix_cred(OM_uint32 *minor_status, const gss_name_t pname, struct pname_to_uid_args args; enum clnt_stat stat; int i, n; + CLIENT *cl; *minor_status = 0; - if (!kgss_gssd_handle) - return (GSS_S_FAILURE); - if (pname == GSS_C_NO_NAME) return (GSS_S_BAD_NAME); + cl = kgss_gssd_client(); + if (cl == NULL) + return (GSS_S_FAILURE); + args.pname = pname->handle; args.mech = mech; bzero(&res, sizeof(res)); - stat = gssd_pname_to_uid_1(&args, &res, kgss_gssd_handle); + stat = gssd_pname_to_uid_1(&args, &res, cl); + CLNT_RELEASE(cl); if (stat != RPC_SUCCESS) { *minor_status = stat; return (GSS_S_FAILURE); |