mirror of
https://github.com/samba-team/samba.git
synced 2025-02-04 17:47:26 +03:00
smbd: Introduce reset_delete_on_close_lck
Boolean flags passed down make things more complex than necessary... Signed-off-by: Volker Lendecke <vl@samba.org> Reviewed-by: Jeremy Allison <jra@samba.org>
This commit is contained in:
parent
9e7cf87a30
commit
d75a0a589f
@ -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; i<d->num_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; i<d->num_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);
|
||||
}
|
||||
|
@ -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,
|
||||
|
Loading…
x
Reference in New Issue
Block a user