From: Bud Grise Date: Tue, 5 Apr 2016 00:17:36 +0000 (-0400) Subject: Propagate the VLIB_FRAME_NO_FREE_AFTER_DISPATCH flag to cloned next_frames X-Git-Tag: v16.06-rc1~174 X-Git-Url: https://gerrit.fd.io/r/gitweb?a=commitdiff_plain;h=refs%2Fchanges%2F01%2F701%2F2;p=vpp.git Propagate the VLIB_FRAME_NO_FREE_AFTER_DISPATCH flag to cloned next_frames Without this, frames can be double-freed to nodes like "error-punt", leading to buffer leaks and other problems. Change-Id: Ie28a4f504254ee439f720dbaac7f12206cea753b Signed-off-by: Todd Foggoa --- diff --git a/vlib/vlib/threads.c b/vlib/vlib/threads.c index 15eb959938e..970e4a55b34 100644 --- a/vlib/vlib/threads.c +++ b/vlib/vlib/threads.c @@ -631,10 +631,13 @@ static clib_error_t * start_workers (vlib_main_t * vm) { vlib_next_frame_t *nf = &nm_clone->next_frames[j]; u32 save_node_runtime_index; + u32 save_flags; save_node_runtime_index = nf->node_runtime_index; + save_flags = nf->flags & VLIB_FRAME_NO_FREE_AFTER_DISPATCH; vlib_next_frame_init (nf); nf->node_runtime_index = save_node_runtime_index; + nf->flags = save_flags; } /* fork the frame dispatch queue */ @@ -843,10 +846,13 @@ void vlib_worker_thread_node_runtime_update(void) { vlib_next_frame_t *nf = &nm_clone->next_frames[j]; u32 save_node_runtime_index; + u32 save_flags; save_node_runtime_index = nf->node_runtime_index; + save_flags = nf->flags & VLIB_FRAME_NO_FREE_AFTER_DISPATCH; vlib_next_frame_init (nf); nf->node_runtime_index = save_node_runtime_index; + nf->flags = save_flags; } old_nodes_clone = nm_clone->nodes;