1
0
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:
Volker Lendecke 2015-04-21 11:36:30 +02:00 committed by Jeremy Allison
parent 9e7cf87a30
commit d75a0a589f
2 changed files with 37 additions and 26 deletions

View File

@ -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);
}

View File

@ -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,