diff options
| author | Ken Raeburn <raeburn@mit.edu> | 2004-03-06 03:16:02 +0000 |
|---|---|---|
| committer | Ken Raeburn <raeburn@mit.edu> | 2004-03-06 03:16:02 +0000 |
| commit | b577efbd36c4fabe18bb5281d180c2ddce28fee7 (patch) | |
| tree | f17741415b15adf912ebb3799f759ec415dfee45 /src/lib/krb5/rcache | |
| parent | bf465a1bc8657d3b6b1fefde16deeb1af1ed229e (diff) | |
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/rcache')
| -rw-r--r-- | src/lib/krb5/rcache/ChangeLog | 7 | ||||
| -rw-r--r-- | src/lib/krb5/rcache/rc_base.c | 24 |
2 files changed, 28 insertions, 3 deletions
diff --git a/src/lib/krb5/rcache/ChangeLog b/src/lib/krb5/rcache/ChangeLog index c71e5f851..a096114f2 100644 --- a/src/lib/krb5/rcache/ChangeLog +++ b/src/lib/krb5/rcache/ChangeLog @@ -1,3 +1,10 @@ +2004-03-05 Ken Raeburn <raeburn@mit.edu> + + * rc_base.c: Include k5-thread.h. + (rc_typelist_lock): New mutex var. + (krb5_rc_register_type, krb5_rc_resolve_type): Lock it while + working with the type list. + 2004-03-03 Ken Raeburn <raeburn@mit.edu> * rc_base.c: Delete unused and untested semaphore support. diff --git a/src/lib/krb5/rcache/rc_base.c b/src/lib/krb5/rcache/rc_base.c index 40651787c..5758c20bc 100644 --- a/src/lib/krb5/rcache/rc_base.c +++ b/src/lib/krb5/rcache/rc_base.c @@ -12,6 +12,7 @@ */ #include "rc_base.h" +#include "k5-thread.h" #define FREE(x) ((void) free((char *) (x))) @@ -21,21 +22,31 @@ struct krb5_rc_typelist { }; static struct krb5_rc_typelist krb5_rc_typelist_dfl = { &krb5_rc_dfl_ops, 0 }; static struct krb5_rc_typelist *typehead = &krb5_rc_typelist_dfl; +static k5_mutex_t rc_typelist_lock = K5_MUTEX_INITIALIZER; krb5_error_code krb5_rc_register_type(krb5_context context, const krb5_rc_ops *ops) { struct krb5_rc_typelist *t; + krb5_error_code err; + err = k5_mutex_lock(&rc_typelist_lock); + if (err) + return err; for (t = typehead;t && strcmp(t->ops->type,ops->type);t = t->next) ; - if (t) + if (t) { + k5_mutex_unlock(&rc_typelist_lock); return KRB5_RC_TYPE_EXISTS; + } t = (struct krb5_rc_typelist *) malloc(sizeof(struct krb5_rc_typelist)); - if (t == NULL) + if (t == NULL) { + k5_mutex_unlock(&rc_typelist_lock); return KRB5_RC_MALLOC; + } t->next = typehead; t->ops = ops; typehead = t; + k5_mutex_unlock(&rc_typelist_lock); return 0; } @@ -43,12 +54,19 @@ krb5_error_code krb5_rc_resolve_type(krb5_context context, krb5_rcache *id, char *type) { struct krb5_rc_typelist *t; + krb5_error_code err; + err = k5_mutex_lock(&rc_typelist_lock); + if (err) + return err; for (t = typehead;t && strcmp(t->ops->type,type);t = t->next) ; - if (!t) + if (!t) { + k5_mutex_unlock(&rc_typelist_lock); return KRB5_RC_TYPE_NOTFOUND; + } /* allocate *id? nah */ (*id)->ops = t->ops; + k5_mutex_unlock(&rc_typelist_lock); return 0; } |
