summaryrefslogtreecommitdiffstats
path: root/src/vnet/dhcp
diff options
context:
space:
mode:
authorDave Barach <dave@barachs.net>2020-04-10 10:18:35 -0400
committerDave Barach <dave@barachs.net>2020-04-10 10:19:20 -0400
commite2568b5d0a5e34f02adda788e51ed0147644bec9 (patch)
tree26b8a039841cb44d7520f4eb2a64dcf1f3cc5be8 /src/vnet/dhcp
parentd212187f02c0179f2f86bb3fdbf3f51a087ea23b (diff)
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> (cherry picked from commit c25ef58965871ea5d2b40904df9506803f69e47e) Change-Id: I6cd4f289c4fadc3f36c3203b53546e9a788ef99b
Diffstat (limited to 'src/vnet/dhcp')
-rw-r--r--src/vnet/dhcp/dhcp4_proxy_error.def2
-rw-r--r--src/vnet/dhcp/dhcp4_proxy_node.c7
-rw-r--r--src/vnet/dhcp/dhcp6_ia_na_client_dp.c3
-rw-r--r--src/vnet/dhcp/dhcp6_pd_client_dp.c3
-rw-r--r--src/vnet/dhcp/dhcp6_proxy_error.def1
-rw-r--r--src/vnet/dhcp/dhcp6_proxy_node.c7
6 files changed, 22 insertions, 1 deletions
diff --git a/src/vnet/dhcp/dhcp4_proxy_error.def b/src/vnet/dhcp/dhcp4_proxy_error.def
index adf04808fa3..f0388564e17 100644
--- a/src/vnet/dhcp/dhcp4_proxy_error.def
+++ b/src/vnet/dhcp/dhcp4_proxy_error.def
@@ -29,4 +29,4 @@ dhcp_proxy_error (OPTION_82_VSS_NOT_PROCESSED, "DHCP VSS not processed by DHCP s
dhcp_proxy_error (BAD_YIADDR, "DHCP packets with bad your_ip_address fields")
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 (ALLOC_FAIL, "DHCP buffer allocation failures.")
diff --git a/src/vnet/dhcp/dhcp4_proxy_node.c b/src/vnet/dhcp/dhcp4_proxy_node.c
index 3576f0cbf35..7f03df486d2 100644
--- a/src/vnet/dhcp/dhcp4_proxy_node.c
+++ b/src/vnet/dhcp/dhcp4_proxy_node.c
@@ -358,6 +358,13 @@ dhcp_proxy_to_server_input (vlib_main_t * vm,
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/vnet/dhcp/dhcp6_ia_na_client_dp.c b/src/vnet/dhcp/dhcp6_ia_na_client_dp.c
index 5f940c33687..4b4bee77837 100644
--- a/src/vnet/dhcp/dhcp6_ia_na_client_dp.c
+++ b/src/vnet/dhcp/dhcp6_ia_na_client_dp.c
@@ -291,6 +291,9 @@ check_send_client_message (vlib_main_t * vm,
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/vnet/dhcp/dhcp6_pd_client_dp.c b/src/vnet/dhcp/dhcp6_pd_client_dp.c
index c1bf5f8844f..90ac3028107 100644
--- a/src/vnet/dhcp/dhcp6_pd_client_dp.c
+++ b/src/vnet/dhcp/dhcp6_pd_client_dp.c
@@ -292,6 +292,9 @@ check_pd_send_client_message (vlib_main_t * vm,
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/vnet/dhcp/dhcp6_proxy_error.def b/src/vnet/dhcp/dhcp6_proxy_error.def
index 55fa731766c..5a85c423c5f 100644
--- a/src/vnet/dhcp/dhcp6_proxy_error.def
+++ b/src/vnet/dhcp/dhcp6_proxy_error.def
@@ -27,3 +27,4 @@ dhcpv6_proxy_error (NO_RELAY_MESSAGE_OPTION, "DHCPv6 reply packets without relay
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/vnet/dhcp/dhcp6_proxy_node.c b/src/vnet/dhcp/dhcp6_proxy_node.c
index 174548f24eb..6006f0e23c5 100644
--- a/src/vnet/dhcp/dhcp6_proxy_node.c
+++ b/src/vnet/dhcp/dhcp6_proxy_node.c
@@ -436,6 +436,13 @@ dhcpv6_proxy_to_server_input (vlib_main_t * vm,
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];