summaryrefslogtreecommitdiffstats
path: root/src/lib/gssapi/generic/util_validate.c
diff options
context:
space:
mode:
authorKen Raeburn <raeburn@mit.edu>2004-03-14 07:08:40 +0000
committerKen Raeburn <raeburn@mit.edu>2004-03-14 07:08:40 +0000
commit6c80f7f9c5c504a9494e93be014e994f5a0ce14e (patch)
tree73f50f7ed76477ea64b68f6c5de05a3bff3b48cd /src/lib/gssapi/generic/util_validate.c
parentbd213527dab6a355867a95c104352fa101a9d2e8 (diff)
downloadkrb5-6c80f7f9c5c504a9494e93be014e994f5a0ce14e.tar.gz
krb5-6c80f7f9c5c504a9494e93be014e994f5a0ce14e.tar.xz
krb5-6c80f7f9c5c504a9494e93be014e994f5a0ce14e.zip
Add a mutex to protect the set manipulations
* gssapiP_generic.h: Include k5-thread.h. (g_set): Add a mutex. (G_SET_INIT): Initialize it. * util_validate.c (g_save, g_validate, g_delete): Lock the mutex while working on the set. (BDB version untested.) git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@16167 dc483132-0cff-0310-8789-dd5450dbe970
Diffstat (limited to 'src/lib/gssapi/generic/util_validate.c')
-rw-r--r--src/lib/gssapi/generic/util_validate.c96
1 files changed, 77 insertions, 19 deletions
diff --git a/src/lib/gssapi/generic/util_validate.c b/src/lib/gssapi/generic/util_validate.c
index 4c0c6d848..779260892 100644
--- a/src/lib/gssapi/generic/util_validate.c
+++ b/src/lib/gssapi/generic/util_validate.c
@@ -64,11 +64,18 @@ static int g_save(db, type, ptr)
#endif
void *ptr;
{
+ int ret;
#ifdef HAVE_BSD_DB
- DB **vdb = (DB **) &db->data;
+ DB **vdb;
vkey vk;
DBT key;
+ ret = k5_mutex_lock(&db->mutex);
+ if (ret)
+ return 0;
+
+ vdb = (DB **) &db->data;
+
if (!*vdb)
*vdb = dbopen(NULL, O_CREAT|O_RDWR, O_CREAT|O_RDWR, DB_HASH, NULL);
@@ -78,15 +85,27 @@ static int g_save(db, type, ptr)
key.data = &vk;
key.size = sizeof(vk);
- return((*((*vdb)->put))(*vdb, &key, &dbtone, 0) == 0);
+ ret = ((*((*vdb)->put))(*vdb, &key, &dbtone, 0) == 0);
+ k5_mutex_unlock(&db->mutex);
+ return ret;
#else
- g_set_elt *gs = (g_set_elt *) &db->data;
+ g_set_elt *gs;
+
+ ret = k5_mutex_lock(&db->mutex);
+ if (ret)
+ return 0;
+
+ gs = (g_set_elt *) &db->data;
if (!*gs)
- if (g_set_init(gs))
+ if (g_set_init(gs)) {
+ k5_mutex_unlock(&db->mutex);
return(0);
+ }
- return(g_set_entry_add(gs, ptr, type) == 0);
+ ret = (g_set_entry_add(gs, ptr, type) == 0);
+ k5_mutex_unlock(&db->mutex);
+ return ret;
#endif
}
@@ -99,13 +118,21 @@ static int g_validate(db, type, ptr)
#endif
void *ptr;
{
+ int ret;
#ifdef HAVE_BSD_DB
- DB **vdb = (DB **) &db->data;
+ DB **vdb;
vkey vk;
DBT key, value;
- if (!*vdb)
+ ret = k5_mutex_lock(&db->mutex);
+ if (ret)
+ return 0;
+
+ vdb = (DB **) &db->data;
+ if (!*vdb) {
+ k5_mutex_unlock(&db->mutex);
return(0);
+ }
vk.type = type;
vk.ptr = ptr;
@@ -113,21 +140,33 @@ static int g_validate(db, type, ptr)
key.data = &vk;
key.size = sizeof(vk);
- if ((*((*vdb)->get))(*vdb, &key, &value, 0))
+ if ((*((*vdb)->get))(*vdb, &key, &value, 0)) {
+ k5_mutex_unlock(&db->mutex);
return(0);
+ }
+ k5_mutex_unlock(&db->mutex);
return((value.size == sizeof(one)) &&
(*((int *) value.data) == one));
#else
- g_set_elt *gs = (g_set_elt *) &db->data;
+ g_set_elt *gs;
void *value;
- if (!*gs)
- return(0);
+ ret = k5_mutex_lock(&db->mutex);
+ if (ret)
+ return 0;
- if (g_set_entry_get(gs, ptr, (void **) &value))
+ gs = (g_set_elt *) &db->data;
+ if (!*gs) {
+ k5_mutex_unlock(&db->mutex);
return(0);
+ }
+ if (g_set_entry_get(gs, ptr, (void **) &value)) {
+ k5_mutex_unlock(&db->mutex);
+ return(0);
+ }
+ k5_mutex_unlock(&db->mutex);
return(value == type);
#endif
}
@@ -141,13 +180,21 @@ static int g_delete(db, type, ptr)
#endif
void *ptr;
{
+ int ret;
#ifdef HAVE_BSD_DB
- DB **vdb = (DB **) &db->data;
+ DB **vdb;
vkey vk;
DBT key;
- if (!*vdb)
+ ret = k5_mutex_lock(&db->mutex);
+ if (ret)
+ return 0;
+
+ vdb = (DB **) &db->data;
+ if (!*vdb) {
+ k5_mutex_unlock(&db->mutex);
return(0);
+ }
vk.type = type;
vk.ptr = ptr;
@@ -155,16 +202,27 @@ static int g_delete(db, type, ptr)
key.data = &vk;
key.size = sizeof(vk);
- return((*((*vdb)->del))(*vdb, &key, 0) == 0);
+ ret = ((*((*vdb)->del))(*vdb, &key, 0) == 0);
+ k5_mutex_unlock(&db->mutex);
+ return ret;
#else
- g_set_elt *gs = (g_set_elt *) &db->data;
+ g_set_elt *gs;
- if (!*gs)
- return(0);
+ ret = k5_mutex_lock(&db->mutex);
+ if (ret)
+ return 0;
- if (g_set_entry_delete(gs, ptr))
+ gs = (g_set_elt *) &db->data;
+ if (!*gs) {
+ k5_mutex_unlock(&db->mutex);
return(0);
+ }
+ if (g_set_entry_delete(gs, ptr)) {
+ k5_mutex_unlock(&db->mutex);
+ return(0);
+ }
+ k5_mutex_unlock(&db->mutex);
return(1);
#endif
}