summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/lib/kdb/kdb_dbm.c18
1 files changed, 11 insertions, 7 deletions
diff --git a/src/lib/kdb/kdb_dbm.c b/src/lib/kdb/kdb_dbm.c
index 964074af4..bc2fd26b0 100644
--- a/src/lib/kdb/kdb_dbm.c
+++ b/src/lib/kdb/kdb_dbm.c
@@ -38,6 +38,7 @@ extern int errno;
static int dblfd = -1;
static int mylock = 0;
+static int lockmode = 0;
static int inited = 0;
static char default_db_name[] = DEFAULT_DBM_FILE;
@@ -234,7 +235,7 @@ time_t *age;
if (!okname)
return ENOMEM;
if (stat (okname, &st) < 0)
- *age = 0;
+ *age = -1;
else
*age = st.st_mtime;
@@ -543,9 +544,10 @@ int mode;
{
int flock_mode;
- if (mylock) /* Detect lock call when lock already
- * locked */
- return KRB5_KDB_RECURSIVELOCK;
+ if (mylock && (lockmode >= mode)) {
+ mylock++; /* No need to upgrade lock, just return */
+ return(0);
+ }
switch (mode) {
case KRB5_DBM_EXCLUSIVE:
@@ -557,6 +559,7 @@ int mode;
default:
return KRB5_KDB_BADLOCKMODE;
}
+ lockmode = mode;
if (non_blocking)
flock_mode |= LOCK_NB;
@@ -572,9 +575,10 @@ krb5_dbm_db_unlock()
if (!mylock) /* lock already unlocked */
return KRB5_KDB_NOTLOCKED;
- if (flock(dblfd, LOCK_UN) < 0)
- return errno;
- mylock = 0;
+ if (--mylock) {
+ if (flock(dblfd, LOCK_UN) < 0)
+ return errno;
+ }
return 0;
}