1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-23 17:34:34 +03:00

s3/locking: Avoid a talloc for nonexisting fetch_share_mode_unlocked

Signed-off-by: Volker Lendecke <vl@samba.org>
Reviewed-by: Ralph Boehme <slow@samba.org>
This commit is contained in:
Volker Lendecke 2016-10-24 17:32:17 +02:00 committed by Ralph Boehme
parent 27daed8fcf
commit 66cba9939b

View File

@ -623,19 +623,28 @@ fail:
return NULL;
}
struct fetch_share_mode_unlocked_state {
TALLOC_CTX *mem_ctx;
struct share_mode_lock *lck;
};
static void fetch_share_mode_unlocked_parser(
TDB_DATA key, TDB_DATA data, void *private_data)
{
struct share_mode_lock *lck = talloc_get_type_abort(
private_data, struct share_mode_lock);
struct fetch_share_mode_unlocked_state *state = private_data;
if (data.dsize == 0) {
/* Likely a ctdb tombstone record, ignore it */
lck->data = NULL;
return;
}
lck->data = parse_share_modes(lck, key, data);
state->lck = talloc(state->mem_ctx, struct share_mode_lock);
if (state->lck == NULL) {
DEBUG(0, ("talloc failed\n"));
return;
}
state->lck->data = parse_share_modes(state->lck, key, data);
}
/*******************************************************************
@ -646,23 +655,16 @@ static void fetch_share_mode_unlocked_parser(
struct share_mode_lock *fetch_share_mode_unlocked(TALLOC_CTX *mem_ctx,
struct file_id id)
{
struct share_mode_lock *lck;
struct fetch_share_mode_unlocked_state state = { .mem_ctx = mem_ctx };
TDB_DATA key = locking_key(&id);
NTSTATUS status;
lck = talloc(mem_ctx, struct share_mode_lock);
if (lck == NULL) {
DEBUG(0, ("talloc failed\n"));
return NULL;
}
status = dbwrap_parse_record(
lock_db, key, fetch_share_mode_unlocked_parser, lck);
if (!NT_STATUS_IS_OK(status) ||
(lck->data == NULL)) {
TALLOC_FREE(lck);
lock_db, key, fetch_share_mode_unlocked_parser, &state);
if (!NT_STATUS_IS_OK(status)) {
return NULL;
}
return lck;
return state.lck;
}
struct share_mode_forall_state {