summaryrefslogtreecommitdiffstats
path: root/src/lib/krb5/rcache
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/rcache
parentbf465a1bc8657d3b6b1fefde16deeb1af1ed229e (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/ChangeLog7
-rw-r--r--src/lib/krb5/rcache/rc_base.c24
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;
}