diff options
author | Ken Raeburn <raeburn@mit.edu> | 2004-03-14 07:08:40 +0000 |
---|---|---|
committer | Ken Raeburn <raeburn@mit.edu> | 2004-03-14 07:08:40 +0000 |
commit | 6c80f7f9c5c504a9494e93be014e994f5a0ce14e (patch) | |
tree | 73f50f7ed76477ea64b68f6c5de05a3bff3b48cd /src/lib/gssapi/generic/util_validate.c | |
parent | bd213527dab6a355867a95c104352fa101a9d2e8 (diff) | |
download | krb5-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.c | 96 |
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 } |