From: Volker Lendecke Date: Tue, 21 Apr 2015 09:36:30 +0000 (+0200) Subject: smbd: Introduce reset_delete_on_close_lck X-Git-Tag: tdb-1.3.5~43 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=d75a0a589f477e4541badfc1a6ba939e281a5582;p=thirdparty%2Fsamba.git smbd: Introduce reset_delete_on_close_lck Boolean flags passed down make things more complex than necessary... Signed-off-by: Volker Lendecke Reviewed-by: Jeremy Allison --- diff --git a/source3/locking/locking.c b/source3/locking/locking.c index 221d6ee8d6e..cff9025e22d 100644 --- a/source3/locking/locking.c +++ b/source3/locking/locking.c @@ -1081,6 +1081,27 @@ static bool add_delete_on_close_token(struct share_mode_data *d, return true; } +void reset_delete_on_close_lck(files_struct *fsp, + struct share_mode_lock *lck) +{ + struct share_mode_data *d = lck->data; + uint32_t i; + + for (i=0; inum_delete_tokens; i++) { + struct delete_token *dt = &d->delete_tokens[i]; + + if (dt->name_hash == fsp->name_hash) { + d->modified = true; + + /* Delete this entry. */ + TALLOC_FREE(dt->delete_nt_token); + TALLOC_FREE(dt->delete_token); + *dt = d->delete_tokens[d->num_delete_tokens-1]; + d->num_delete_tokens -= 1; + } + } +} + /**************************************************************************** Sets the delete on close flag over all share modes on this file. Modify the share mode entry for all files open @@ -1102,44 +1123,32 @@ void set_delete_on_close_lck(files_struct *fsp, int i; bool ret; - if (delete_on_close) { - SMB_ASSERT(nt_tok != NULL); - SMB_ASSERT(tok != NULL); - } else { + if (!delete_on_close) { SMB_ASSERT(nt_tok == NULL); SMB_ASSERT(tok == NULL); + return reset_delete_on_close_lck(fsp, lck); } + SMB_ASSERT(nt_tok != NULL); + SMB_ASSERT(tok != NULL); + for (i=0; inum_delete_tokens; i++) { struct delete_token *dt = &d->delete_tokens[i]; if (dt->name_hash == fsp->name_hash) { d->modified = true; - if (delete_on_close == false) { - /* Delete this entry. */ - TALLOC_FREE(dt->delete_nt_token); - TALLOC_FREE(dt->delete_token); - *dt = d->delete_tokens[ - d->num_delete_tokens-1]; - d->num_delete_tokens -= 1; - } else { - /* Replace this token with the - given tok. */ - TALLOC_FREE(dt->delete_nt_token); - dt->delete_nt_token = dup_nt_token(dt, nt_tok); - SMB_ASSERT(dt->delete_nt_token != NULL); - TALLOC_FREE(dt->delete_token); - dt->delete_token = copy_unix_token(dt, tok); - SMB_ASSERT(dt->delete_token != NULL); - } + + /* Replace this token with the given tok. */ + TALLOC_FREE(dt->delete_nt_token); + dt->delete_nt_token = dup_nt_token(dt, nt_tok); + SMB_ASSERT(dt->delete_nt_token != NULL); + TALLOC_FREE(dt->delete_token); + dt->delete_token = copy_unix_token(dt, tok); + SMB_ASSERT(dt->delete_token != NULL); + return; } } - if (!delete_on_close) { - /* Nothing to delete - not found. */ - return; - } - ret = add_delete_on_close_token(lck->data, fsp->name_hash, nt_tok, tok); SMB_ASSERT(ret); } diff --git a/source3/locking/proto.h b/source3/locking/proto.h index c4ea198d20c..8a0e0234fc5 100644 --- a/source3/locking/proto.h +++ b/source3/locking/proto.h @@ -185,6 +185,8 @@ bool get_delete_on_close_token(struct share_mode_lock *lck, uint32_t name_hash, const struct security_token **pp_nt_tok, const struct security_unix_token **pp_tok); +void reset_delete_on_close_lck(files_struct *fsp, + struct share_mode_lock *lck); void set_delete_on_close_lck(files_struct *fsp, struct share_mode_lock *lck, bool delete_on_close,