Handle buffer alloc failure in vlib_buffer_add_data
It's not OK to crash due to a transient buffer allocation failure. Return 1 if the requested operation failed, otherwise 0. Buffer index parameter change to a value-result, so the caller can differentiate between partial and complete allocation failure: callers which request an initial allocation (inbound bi = ~0) need to check the (out) value to decide whether or not to call vlib_buffer_free(...). Change-Id: I03029d7f2714c17dca4630dfd95a1eb578b68384 Signed-off-by: Dave Barach <dave@barachs.net>
This commit is contained in:

committed by
Florin Coras

parent
9d7570ccde
commit
3a63fc5470
@ -705,16 +705,16 @@ vlib_packet_template_get_packet (vlib_main_t * vm,
|
||||
}
|
||||
|
||||
/* Append given data to end of buffer, possibly allocating new buffers. */
|
||||
u32
|
||||
int
|
||||
vlib_buffer_add_data (vlib_main_t * vm,
|
||||
vlib_buffer_free_list_index_t free_list_index,
|
||||
u32 buffer_index, void *data, u32 n_data_bytes)
|
||||
u32 * buffer_index, void *data, u32 n_data_bytes)
|
||||
{
|
||||
u32 n_buffer_bytes, n_left, n_left_this_buffer, bi;
|
||||
vlib_buffer_t *b;
|
||||
void *d;
|
||||
|
||||
bi = buffer_index;
|
||||
bi = *buffer_index;
|
||||
if (bi == ~0
|
||||
&& 1 != vlib_buffer_alloc_from_free_list (vm, &bi, 1, free_list_index))
|
||||
goto out_of_buffers;
|
||||
@ -756,11 +756,12 @@ vlib_buffer_add_data (vlib_main_t * vm,
|
||||
b = vlib_get_buffer (vm, b->next_buffer);
|
||||
}
|
||||
|
||||
return bi;
|
||||
*buffer_index = bi;
|
||||
return 0;
|
||||
|
||||
out_of_buffers:
|
||||
clib_error ("out of buffers");
|
||||
return bi;
|
||||
clib_warning ("out of buffers");
|
||||
return 1;
|
||||
}
|
||||
|
||||
u16
|
||||
|
Reference in New Issue
Block a user