diff options
author | Jeremy Allison <jra@samba.org> | 2005-12-14 00:42:40 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 11:05:49 -0500 |
commit | 762901cfb9aabb717b8312d546ab20f8bacb1e29 (patch) | |
tree | 6f2667054ff7be5a0355eb8ae70010ab016e667d /source3/locking | |
parent | 4d3152e1454ce62f3d1f864ccbf2a58234dab09d (diff) | |
download | samba-762901cfb9aabb717b8312d546ab20f8bacb1e29.tar.gz samba-762901cfb9aabb717b8312d546ab20f8bacb1e29.tar.bz2 samba-762901cfb9aabb717b8312d546ab20f8bacb1e29.zip |
r12221: Fix error code paths that can potentially leave a dangling lock.
Jeremy.
(This used to be commit 123135ed1ddd84cc0a5e8e5ca06a0703d1944e37)
Diffstat (limited to 'source3/locking')
-rw-r--r-- | source3/locking/locking.c | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/source3/locking/locking.c b/source3/locking/locking.c index d89fe931ef..b823b4712e 100644 --- a/source3/locking/locking.c +++ b/source3/locking/locking.c @@ -595,12 +595,18 @@ struct share_mode_lock *get_share_mode_lock(TALLOC_CTX *mem_ctx, return NULL; } + /* Ensure we set every field here as the destructor must be + valid even if parse_share_modes fails. */ + + lck->servicepath = NULL; + lck->filename = NULL; lck->dev = dev; lck->ino = ino; - lck->delete_on_close = False; lck->num_share_modes = 0; lck->share_modes = NULL; + lck->delete_on_close = False; lck->modified = False; + lck->fresh = False; if (tdb_chainlock(tdb, key) != 0) { DEBUG(3, ("Could not lock share entry\n")); @@ -608,6 +614,12 @@ struct share_mode_lock *get_share_mode_lock(TALLOC_CTX *mem_ctx, return NULL; } + /* We must set the destructor immediately after the chainlock + ensure the lock is cleaned up on any of the error return + paths below. */ + + talloc_set_destructor(lck, share_mode_lock_destructor); + data = tdb_fetch(tdb, key); lck->fresh = (data.dptr == NULL); @@ -634,7 +646,6 @@ struct share_mode_lock *get_share_mode_lock(TALLOC_CTX *mem_ctx, } } - talloc_set_destructor(lck, share_mode_lock_destructor); SAFE_FREE(data.dptr); return lck; |