misc: check return values from vlib_buffer_copy(...)

vlib_buffer_copy(...) returns NULL if the system is temporarily out of
buffers.

This is NOT correct. Please don't be this person:

   c0 = vlib_buffer_copy (vm, p0);
   ci0 = vlib_get_buffer_index (vm, c0);

Type: fix

Signed-off-by: Dave Barach <dave@barachs.net>
Change-Id: Ic25ef58965871ea5d2b40904df9506803f69e47e
diff --git a/src/plugins/dhcp/dhcp4_proxy_error.def b/src/plugins/dhcp/dhcp4_proxy_error.def
index 83f1183..bd814e3 100644
--- a/src/plugins/dhcp/dhcp4_proxy_error.def
+++ b/src/plugins/dhcp/dhcp4_proxy_error.def
@@ -30,4 +30,4 @@
 dhcp_proxy_error (BAD_SVR_FIB_OR_ADDRESS, "DHCP packets not from DHCP server or server FIB.")
 dhcp_proxy_error (PKT_TOO_BIG, "DHCP packets which are too big.")
 dhcp_proxy_error (FOR_US, "DHCP packets for local client.")
-
+dhcp_proxy_error (ALLOC_FAIL, "DHCP buffer allocation failures.")
diff --git a/src/plugins/dhcp/dhcp4_proxy_node.c b/src/plugins/dhcp/dhcp4_proxy_node.c
index 53c95c0..28c3e62 100644
--- a/src/plugins/dhcp/dhcp4_proxy_node.c
+++ b/src/plugins/dhcp/dhcp4_proxy_node.c
@@ -364,6 +364,13 @@
 		  u32 ci0;
 
 		  c0 = vlib_buffer_copy (vm, b0);
+		  if (c0 == NULL)
+		    {
+		      vlib_node_increment_counter
+			(vm, dhcp_proxy_to_server_node.index,
+			 DHCP_PROXY_ERROR_ALLOC_FAIL, 1);
+		      continue;
+		    }
 		  VLIB_BUFFER_TRACE_TRAJECTORY_INIT (c0);
 		  ci0 = vlib_get_buffer_index (vm, c0);
 		  server = &proxy->dhcp_servers[ii];
diff --git a/src/plugins/dhcp/dhcp6_ia_na_client_dp.c b/src/plugins/dhcp/dhcp6_ia_na_client_dp.c
index 3cf2fb1..c240beb 100644
--- a/src/plugins/dhcp/dhcp6_ia_na_client_dp.c
+++ b/src/plugins/dhcp/dhcp6_ia_na_client_dp.c
@@ -258,6 +258,9 @@
   next_index = ip6_rewrite_mcast_node.index;
 
   c0 = vlib_buffer_copy (vm, p0);
+  if (c0 == NULL)
+    return client_state->keep_sending_client_message;
+
   ci0 = vlib_get_buffer_index (vm, c0);
 
   ip = (ip6_header_t *) vlib_buffer_get_current (c0);
diff --git a/src/plugins/dhcp/dhcp6_pd_client_dp.c b/src/plugins/dhcp/dhcp6_pd_client_dp.c
index 980c83c..b43e5a4 100644
--- a/src/plugins/dhcp/dhcp6_pd_client_dp.c
+++ b/src/plugins/dhcp/dhcp6_pd_client_dp.c
@@ -264,6 +264,9 @@
   next_index = ip6_rewrite_mcast_node.index;
 
   c0 = vlib_buffer_copy (vm, p0);
+  if (c0 == NULL)
+    return client_state->keep_sending_client_message;
+
   ci0 = vlib_get_buffer_index (vm, c0);
 
   ip = (ip6_header_t *) vlib_buffer_get_current (c0);
diff --git a/src/plugins/dhcp/dhcp6_proxy_error.def b/src/plugins/dhcp/dhcp6_proxy_error.def
index 55fa731..5a85c42 100644
--- a/src/plugins/dhcp/dhcp6_proxy_error.def
+++ b/src/plugins/dhcp/dhcp6_proxy_error.def
@@ -27,3 +27,4 @@
 dhcpv6_proxy_error (BAD_SVR_FIB_OR_ADDRESS, "DHCPv6 packets not from DHCPv6 server or server FIB.")
 dhcpv6_proxy_error (PKT_TOO_BIG, "DHCPv6 packets which are too big.")
 dhcpv6_proxy_error (WRONG_INTERFACE_ID_OPTION, "DHCPv6 reply to invalid interface.")
+dhcpv6_proxy_error (ALLOC_FAIL, "DHCPv6 buffer allocation failures.")
diff --git a/src/plugins/dhcp/dhcp6_proxy_node.c b/src/plugins/dhcp/dhcp6_proxy_node.c
index 272c379..95e5c92 100644
--- a/src/plugins/dhcp/dhcp6_proxy_node.c
+++ b/src/plugins/dhcp/dhcp6_proxy_node.c
@@ -437,6 +437,13 @@
 		  u32 ci0;
 
 		  c0 = vlib_buffer_copy (vm, b0);
+		  if (c0 == NULL)
+		    {
+		      vlib_node_increment_counter
+			(vm, dhcpv6_proxy_to_server_node.index,
+			 DHCPV6_PROXY_ERROR_ALLOC_FAIL, 1);
+		      continue;
+		    }
 		  VLIB_BUFFER_TRACE_TRAJECTORY_INIT (c0);
 		  ci0 = vlib_get_buffer_index (vm, c0);
 		  server = &proxy->dhcp_servers[ii];
diff --git a/src/plugins/ioam/encap/ip6_ioam_trace.c b/src/plugins/ioam/encap/ip6_ioam_trace.c
index 53fb63e..2344857 100644
--- a/src/plugins/ioam/encap/ip6_ioam_trace.c
+++ b/src/plugins/ioam/encap/ip6_ioam_trace.c
@@ -222,14 +222,16 @@
   ioam_trace_option_t *opt;
   udp_ping_t *udp;
 
+  b0 = vlib_buffer_copy (hm->vlib_main, b);
+  if (b0 == NULL)
+    return;
+
+  buf_index = vlib_get_buffer_index (hm->vlib_main, b0);
   next_node = vlib_get_node_by_name (hm->vlib_main, (u8 *) "ip6-lookup");
   nf = vlib_get_frame_to_node (hm->vlib_main, next_node->index);
   nf->n_vectors = 0;
   to_next = vlib_frame_vector_args (nf);
 
-  b0 = vlib_buffer_copy (hm->vlib_main, b);
-  buf_index = vlib_get_buffer_index (hm->vlib_main, b0);
-
   vnet_buffer (b0)->sw_if_index[VLIB_RX] = 0;
   vnet_buffer (b0)->sw_if_index[VLIB_TX] = ~0;
 
diff --git a/src/vnet/ip6-nd/ip6_ra.c b/src/vnet/ip6-nd/ip6_ra.c
index 769f9da..af82a06 100644
--- a/src/vnet/ip6-nd/ip6_ra.c
+++ b/src/vnet/ip6-nd/ip6_ra.c
@@ -1219,6 +1219,9 @@
   next_index = ip6_rewrite_mcast_node.index;
 
   c0 = vlib_buffer_copy (vm, p0);
+  if (c0 == NULL)
+    return radv_info->keep_sending_rs;
+
   ci0 = vlib_get_buffer_index (vm, c0);
 
   f = vlib_get_frame_to_node (vm, next_index);