diff options
author | Jeremy Allison <jra@samba.org> | 2003-01-16 20:08:33 +0000 |
---|---|---|
committer | Jeremy Allison <jra@samba.org> | 2003-01-16 20:08:33 +0000 |
commit | effbd70c21d49255e9cf5eae3e71a7fe93fc7950 (patch) | |
tree | 9bdc2ae7d405be443b21f3e8e40382aa9179e163 /source3/passdb | |
parent | 815dcc082ab76ba9d63baf497f59d6cbb2915357 (diff) | |
download | samba-effbd70c21d49255e9cf5eae3e71a7fe93fc7950.tar.gz samba-effbd70c21d49255e9cf5eae3e71a7fe93fc7950.tar.bz2 samba-effbd70c21d49255e9cf5eae3e71a7fe93fc7950.zip |
Fixed up mutex protection around winbindd logon code. Sync with APP-HEAD.
Jeremy.
(This used to be commit 3d04872499332ef2d8e7479b924afc8fc1ac29d7)
Diffstat (limited to 'source3/passdb')
-rw-r--r-- | source3/passdb/secrets.c | 32 |
1 files changed, 24 insertions, 8 deletions
diff --git a/source3/passdb/secrets.c b/source3/passdb/secrets.c index 5ba9f1dc1e..a52e264270 100644 --- a/source3/passdb/secrets.c +++ b/source3/passdb/secrets.c @@ -588,17 +588,24 @@ NTSTATUS secrets_get_trusted_domains(TALLOC_CTX* ctx, int* enum_ctx, int max_num between smbd instances. *******************************************************************************/ -BOOL secrets_named_mutex(const char *name, unsigned int timeout) +BOOL secrets_named_mutex(const char *name, unsigned int timeout, size_t *p_ref_count) { - int ret; + size_t ref_count = *p_ref_count; + int ret = 0; if (!message_init()) return False; - ret = tdb_lock_bystring(tdb, name, timeout); - if (ret == 0) - DEBUG(10,("secrets_named_mutex: got mutex for %s\n", name )); + if (ref_count == 0) { + ret = tdb_lock_bystring(tdb, name, timeout); + if (ret == 0) + DEBUG(10,("secrets_named_mutex: got mutex for %s\n", name )); + } + if (ret == 0) { + *p_ref_count = ++ref_count; + DEBUG(10,("secrets_named_mutex: ref_count for mutex %s = %u\n", name, (unsigned int)ref_count )); + } return (ret == 0); } @@ -606,10 +613,19 @@ BOOL secrets_named_mutex(const char *name, unsigned int timeout) Unlock a named mutex. *******************************************************************************/ -void secrets_named_mutex_release(const char *name) +void secrets_named_mutex_release(const char *name, size_t *p_ref_count) { - tdb_unlock_bystring(tdb, name); - DEBUG(10,("secrets_named_mutex: released mutex for %s\n", name )); + size_t ref_count = *p_ref_count; + + SMB_ASSERT(ref_count != 0); + + if (ref_count == 1) { + tdb_unlock_bystring(tdb, name); + DEBUG(10,("secrets_named_mutex: released mutex for %s\n", name )); + } + + *p_ref_count = --ref_count; + DEBUG(10,("secrets_named_mutex_release: ref_count for mutex %s = %u\n", name, (unsigned int)ref_count )); } /********************************************************* |