From 4784b2a696acce9fb0713b7783048272812138b5 Mon Sep 17 00:00:00 2001 From: Klement Sekera Date: Wed, 24 Jun 2020 13:13:46 +0000 Subject: nat: avoid division by zero Return error instead of dividing by zero. Type: fix Signed-off-by: Klement Sekera Change-Id: I9f6a942e87ab87e8f1921e744ec1add45884e74a (cherry picked from commit fe77bdc1906cca6a76bd44b1aceffc971f64cec4) --- src/plugins/nat/nat_det.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/plugins/nat/nat_det.c b/src/plugins/nat/nat_det.c index cad0d2ae5af..65a669bceb9 100644 --- a/src/plugins/nat/nat_det.c +++ b/src/plugins/nat/nat_det.c @@ -82,13 +82,20 @@ snat_det_add_map (snat_main_t * sm, ip4_address_t * in_addr, u8 in_plen, num_sessions = num_sessions * 1000 - 1; } + u32 sharing_ratio = (1 << (32 - in_plen)) / (1 << (32 - out_plen)); + if (!sharing_ratio) + { + // avoid division by zero + return VNET_API_ERROR_INVALID_VALUE; + } + pool_get (sm->det_maps, det_map); clib_memset (det_map, 0, sizeof (*det_map)); det_map->in_addr.as_u32 = in_cmp.as_u32; det_map->in_plen = in_plen; det_map->out_addr.as_u32 = out_cmp.as_u32; det_map->out_plen = out_plen; - det_map->sharing_ratio = (1 << (32 - in_plen)) / (1 << (32 - out_plen)); + det_map->sharing_ratio = sharing_ratio; det_map->ports_per_host = (65535 - 1023) / det_map->sharing_ratio; vec_validate_init_empty (det_map->sessions, num_sessions, -- cgit 1.2.3-korg