From: Yoann Desmouceaux Date: Tue, 29 May 2018 11:38:44 +0000 (+0200) Subject: Fixed vlib_buffer_clone with stale chained buffers X-Git-Tag: v18.07-rc1~263 X-Git-Url: https://gerrit.fd.io/r/gitweb?a=commitdiff_plain;h=1977a3488e91c6a4074a5538730418031515b299;p=vpp.git Fixed vlib_buffer_clone with stale chained buffers When calling vlib_buffer_clone() on a source vlib_buffer with no next buffer but whose total_length_not_including_first_buffer hadn't been properly zeroed out, the total_length_not_including_first_buffer of the clone was set to a wrong value. (see https://lists.fd.io/g/vpp-dev/topic/19869395) Change-Id: I4b503ece804e3933bb259be4c2148f84dafbea3e Signed-off-by: Yoann Desmouceaux --- diff --git a/src/vlib/buffer_funcs.h b/src/vlib/buffer_funcs.h index 6072b2ea44b..aa7526e079b 100644 --- a/src/vlib/buffer_funcs.h +++ b/src/vlib/buffer_funcs.h @@ -822,9 +822,14 @@ vlib_buffer_clone_256 (vlib_main_t * vm, u32 src_buffer, u32 * buffers, d->current_length = head_end_offset; vlib_buffer_set_free_list_index (d, vlib_buffer_get_free_list_index (s)); - d->total_length_not_including_first_buffer = - s->total_length_not_including_first_buffer + s->current_length - + + d->total_length_not_including_first_buffer = s->current_length - head_end_offset; + if (PREDICT_FALSE (s->flags & VLIB_BUFFER_NEXT_PRESENT)) + { + d->total_length_not_including_first_buffer += + s->total_length_not_including_first_buffer; + } d->flags = s->flags | VLIB_BUFFER_NEXT_PRESENT; d->flags &= ~VLIB_BUFFER_EXT_HDR_VALID; clib_memcpy (d->opaque, s->opaque, sizeof (s->opaque));