diff options
author | Stefan Metzmacher <metze@samba.org> | 2011-07-25 18:51:53 +0200 |
---|---|---|
committer | Stefan Metzmacher <metze@samba.org> | 2011-07-26 02:16:08 +0200 |
commit | 5a8635bca1b6d60a5b81c602eb4f0b7fd8902d7b (patch) | |
tree | a9a73cdf05ce487a174c9ef7ab334007348e7248 /source4/heimdal/lib/hdb/db.c | |
parent | f1a59f9d6f45987acd0304ee58e4488333faad18 (diff) | |
download | samba-5a8635bca1b6d60a5b81c602eb4f0b7fd8902d7b.tar.gz samba-5a8635bca1b6d60a5b81c602eb4f0b7fd8902d7b.tar.bz2 samba-5a8635bca1b6d60a5b81c602eb4f0b7fd8902d7b.zip |
s4:heimdal: import lorikeet-heimdal-201107241840 (commit 0fdf11fa3cdb47df9f5393ebf36d9f5742243036)
Diffstat (limited to 'source4/heimdal/lib/hdb/db.c')
-rw-r--r-- | source4/heimdal/lib/hdb/db.c | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/source4/heimdal/lib/hdb/db.c b/source4/heimdal/lib/hdb/db.c index 69940edf89..2ed054a631 100644 --- a/source4/heimdal/lib/hdb/db.c +++ b/source4/heimdal/lib/hdb/db.c @@ -65,12 +65,24 @@ DB_lock(krb5_context context, HDB *db, int operation) { DB *d = (DB*)db->hdb_db; int fd = (*d->fd)(d); + krb5_error_code ret; + + if (db->lock_count > 0) { + db->lock_count++; + if (db->lock_type == HDB_WLOCK || db->lock_type == operation) + return 0; + } + if(fd < 0) { krb5_set_error_message(context, HDB_ERR_CANT_LOCK_DB, "Can't lock database: %s", db->hdb_name); return HDB_ERR_CANT_LOCK_DB; } - return hdb_lock(fd, operation); + ret = hdb_lock(fd, operation); + if (ret) + return ret; + db->lock_count++; + return 0; } static krb5_error_code @@ -78,6 +90,14 @@ DB_unlock(krb5_context context, HDB *db) { DB *d = (DB*)db->hdb_db; int fd = (*d->fd)(d); + + if (db->lock_count > 1) { + db->lock_count--; + return 0; + } + heim_assert(db->lock_count == 1, "HDB lock/unlock sequence does not match"); + db->lock_count--; + if(fd < 0) { krb5_set_error_message(context, HDB_ERR_CANT_LOCK_DB, "Can't unlock database: %s", db->hdb_name); |