summaryrefslogtreecommitdiffstats
path: root/src/lib/krb5/keytab/ktbase.c
diff options
context:
space:
mode:
authorKen Raeburn <raeburn@mit.edu>2004-03-06 03:16:02 +0000
committerKen Raeburn <raeburn@mit.edu>2004-03-06 03:16:02 +0000
commitb577efbd36c4fabe18bb5281d180c2ddce28fee7 (patch)
treef17741415b15adf912ebb3799f759ec415dfee45 /src/lib/krb5/keytab/ktbase.c
parentbf465a1bc8657d3b6b1fefde16deeb1af1ed229e (diff)
downloadkrb5-b577efbd36c4fabe18bb5281d180c2ddce28fee7.tar.gz
krb5-b577efbd36c4fabe18bb5281d180c2ddce28fee7.tar.xz
krb5-b577efbd36c4fabe18bb5281d180c2ddce28fee7.zip
For keytab, ccache, and rcache type registries, use const more, and
use a mutex to protect manipulation of the lists. git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@16153 dc483132-0cff-0310-8789-dd5450dbe970
Diffstat (limited to 'src/lib/krb5/keytab/ktbase.c')
-rw-r--r--src/lib/krb5/keytab/ktbase.c38
1 files changed, 30 insertions, 8 deletions
diff --git a/src/lib/krb5/keytab/ktbase.c b/src/lib/krb5/keytab/ktbase.c
index 6e199d685..c415361bb 100644
--- a/src/lib/krb5/keytab/ktbase.c
+++ b/src/lib/krb5/keytab/ktbase.c
@@ -28,6 +28,7 @@
*/
#include "k5-int.h"
+#include "k5-thread.h"
extern const krb5_kt_ops krb5_ktf_ops;
extern const krb5_kt_ops krb5_ktf_writable_ops;
@@ -50,6 +51,8 @@ const static struct krb5_kt_typelist krb5_kt_typelist_srvtab = {
&krb5_kt_typelist_file
};
static const struct krb5_kt_typelist *kt_typehead = &krb5_kt_typelist_srvtab;
+/* Lock for protecting the type list. */
+static k5_mutex_t kt_typehead_lock = K5_MUTEX_INITIALIZER;
/*
@@ -60,17 +63,27 @@ static const struct krb5_kt_typelist *kt_typehead = &krb5_kt_typelist_srvtab;
krb5_error_code KRB5_CALLCONV
krb5_kt_register(krb5_context context, const krb5_kt_ops *ops)
{
- struct krb5_kt_typelist *t;
- for (t = kt_typehead;t && strcmp(t->ops->prefix,ops->prefix);t = t->next)
+ const struct krb5_kt_typelist *t;
+ struct krb5_kt_typelist *newt;
+ krb5_error_code err;
+
+ err = k5_mutex_lock(&kt_typehead_lock);
+ if (err)
+ return err;
+ for (t = kt_typehead; t && strcmp(t->ops->prefix,ops->prefix);t = t->next)
;
if (t) {
+ k5_mutex_unlock(&kt_typehead_lock);
return KRB5_KT_TYPE_EXISTS;
}
- if (!(t = (struct krb5_kt_typelist *) malloc(sizeof(*t))))
+ if (!(newt = (struct krb5_kt_typelist *) malloc(sizeof(*t)))) {
+ k5_mutex_unlock(&kt_typehead_lock);
return ENOMEM;
- t->next = kt_typehead;
- t->ops = ops;
- kt_typehead = t;
+ }
+ newt->next = kt_typehead;
+ newt->ops = ops;
+ kt_typehead = newt;
+ k5_mutex_unlock(&kt_typehead_lock);
return 0;
}
@@ -87,10 +100,11 @@ krb5_kt_register(krb5_context context, const krb5_kt_ops *ops)
krb5_error_code KRB5_CALLCONV
krb5_kt_resolve (krb5_context context, const char *name, krb5_keytab *ktid)
{
- struct krb5_kt_typelist *tlist;
+ const struct krb5_kt_typelist *tlist;
char *pfx;
unsigned int pfxlen;
const char *cp, *resid;
+ krb5_error_code err;
cp = strchr (name, ':');
if (!cp) {
@@ -109,7 +123,15 @@ krb5_kt_resolve (krb5_context context, const char *name, krb5_keytab *ktid)
*ktid = (krb5_keytab) 0;
- for (tlist = kt_typehead; tlist; tlist = tlist->next) {
+ err = k5_mutex_lock(&kt_typehead_lock);
+ if (err)
+ return err;
+ tlist = kt_typehead;
+ /* Don't need to hold the lock, since entries are never modified
+ or removed once they're in the list. Just need to protect
+ access to the list head variable itself. */
+ k5_mutex_unlock(&kt_typehead_lock);
+ for (; tlist; tlist = tlist->next) {
if (strcmp (tlist->ops->prefix, pfx) == 0) {
free(pfx);
return (*tlist->ops->resolve)(context, resid, ktid);