summaryrefslogtreecommitdiff
path: root/source3/locking
diff options
context:
space:
mode:
authorVolker Lendecke <vl@samba.org>2016-10-24 17:32:17 +0200
committerRalph Boehme <slow@samba.org>2017-01-22 18:30:11 +0100
commit66cba9939b76fbfad91a6fe7156feb898b51b2ad (patch)
treed955468c27c52c415292b82064b25f518c512014 /source3/locking
parent27daed8fcf95eed2df112dc1c30c3a40b5c9565b (diff)
downloadsamba-66cba9939b76fbfad91a6fe7156feb898b51b2ad.tar.gz
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>
Diffstat (limited to 'source3/locking')
-rw-r--r--source3/locking/share_mode_lock.c32
1 files changed, 17 insertions, 15 deletions
diff --git a/source3/locking/share_mode_lock.c b/source3/locking/share_mode_lock.c
index 0f4028c1030..16d8ed4df95 100644
--- a/source3/locking/share_mode_lock.c
+++ b/source3/locking/share_mode_lock.c
@@ -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 {