mirror of
https://github.com/samba-team/samba.git
synced 2025-01-12 09:18:10 +03:00
smbd: Avoid some talloc_realloc in notify_internal
For the nonclustered case we will only ever have one vnn in notify_index.tdb. For this case, without this patch we did talloc_realloc when collecting vnns to be able to do the memcpy instead of explicit copy with a for-loop. This new code will partition the new vnns we see when parsing a notify_index.tdb record into ourselves and all foreign vnns, only really collecting the foreign ones in an array. Signed-off-by: Volker Lendecke <vl@samba.org> Reviewed-by: Stefan Metzmacher <metze@samba.org>
This commit is contained in:
parent
c2b26a43ff
commit
032da72e2b
@ -484,7 +484,7 @@ static void notify_trigger_index_parser(TDB_DATA key, TDB_DATA data,
|
||||
struct notify_trigger_index_state *state =
|
||||
(struct notify_trigger_index_state *)private_data;
|
||||
uint32_t *new_vnns;
|
||||
size_t i, num_vnns, num_new_vnns;
|
||||
size_t i, num_vnns, num_new_vnns, num_remote_vnns;
|
||||
|
||||
if ((data.dsize % sizeof(uint32_t)) != 0) {
|
||||
DEBUG(1, ("Invalid record size in notify index db: %u\n",
|
||||
@ -493,22 +493,32 @@ static void notify_trigger_index_parser(TDB_DATA key, TDB_DATA data,
|
||||
}
|
||||
new_vnns = (uint32_t *)data.dptr;
|
||||
num_new_vnns = data.dsize / sizeof(uint32_t);
|
||||
|
||||
num_vnns = talloc_array_length(state->vnns);
|
||||
num_remote_vnns = num_new_vnns;
|
||||
|
||||
for (i=0; i<num_new_vnns; i++) {
|
||||
if (new_vnns[i] == state->my_vnn) {
|
||||
state->found_my_vnn = true;
|
||||
num_remote_vnns -= 1;
|
||||
}
|
||||
}
|
||||
if (num_remote_vnns == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
num_vnns = talloc_array_length(state->vnns);
|
||||
state->vnns = talloc_realloc(state->mem_ctx, state->vnns, uint32_t,
|
||||
num_vnns + num_new_vnns);
|
||||
if ((num_vnns + num_new_vnns != 0) && (state->vnns == NULL)) {
|
||||
num_vnns + num_remote_vnns);
|
||||
if (state->vnns == NULL) {
|
||||
DEBUG(1, ("talloc_realloc failed\n"));
|
||||
return;
|
||||
}
|
||||
memcpy(&state->vnns[num_vnns], data.dptr, data.dsize);
|
||||
|
||||
for (i=0; i<num_new_vnns; i++) {
|
||||
if (new_vnns[i] != state->my_vnn) {
|
||||
state->vnns[num_vnns] = new_vnns[i];
|
||||
num_vnns += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static int vnn_cmp(const void *p1, const void *p2)
|
||||
|
Loading…
Reference in New Issue
Block a user