1
0
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:
Volker Lendecke 2012-10-31 13:02:19 +01:00 committed by Stefan Metzmacher
parent c2b26a43ff
commit 032da72e2b

View File

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