Fix memory leak in API/CLI to create/modify SR policies 06/14806/2
authorJohn Lo <loj@cisco.com>
Thu, 13 Sep 2018 19:08:08 +0000 (15:08 -0400)
committerDamjan Marion <dmarion@me.com>
Fri, 14 Sep 2018 05:03:42 +0000 (05:03 +0000)
The segment list vector built by the API/CLI is not freed after
SR policy creation or modification.

Change-Id: If439005481cada6c6af7cb560fe7a4381dd49384
Signed-off-by: John Lo <loj@cisco.com>
src/vnet/srmpls/sr_mpls_api.c
src/vnet/srmpls/sr_mpls_policy.c
src/vnet/srv6/sr_api.c
src/vnet/srv6/sr_policy_rewrite.c

index a6294e3..2c36c0d 100644 (file)
@@ -67,6 +67,7 @@ vl_api_sr_mpls_policy_add_t_handler (vl_api_sr_mpls_policy_add_t * mp)
   int rv = 0;
   rv = sr_mpls_policy_add (ntohl (mp->bsid),
                           segments, mp->type, ntohl (mp->weight));
+  vec_free (segments);
 
   REPLY_MACRO (VL_API_SR_MPLS_POLICY_ADD_REPLY);
 }
@@ -91,6 +92,7 @@ vl_api_sr_mpls_policy_mod_t_handler (vl_api_sr_mpls_policy_mod_t * mp)
   rv = sr_mpls_policy_mod (ntohl (mp->bsid),
                           mp->operation, segments, ntohl (mp->sl_index),
                           ntohl (mp->weight));
+  vec_free (segments);
 
   REPLY_MACRO (VL_API_SR_MPLS_POLICY_MOD_REPLY);
 }
index 86cd169..8fc7e73 100755 (executable)
@@ -502,6 +502,7 @@ sr_mpls_policy_command_fn (vlib_main_t * vm, unformat_input_t * input,
       rv = sr_mpls_policy_add (bsid, segments,
                               (is_spray ? SR_POLICY_TYPE_SPRAY :
                                SR_POLICY_TYPE_DEFAULT), weight);
+      vec_free (segments);
     }
   else if (is_del)
     rv = sr_mpls_policy_del (bsid);
@@ -516,6 +517,7 @@ sr_mpls_policy_command_fn (vlib_main_t * vm, unformat_input_t * input,
       if (operation == 3 && weight == (u32) ~ 0)
        return clib_error_return (0, "No new weight for the SL specified");
       rv = sr_mpls_policy_mod (bsid, operation, segments, sl_index, weight);
+      vec_free (segments);
     }
   switch (rv)
     {
index 17d4821..c37923f 100644 (file)
@@ -114,6 +114,7 @@ vl_api_sr_policy_add_t_handler (vl_api_sr_policy_add_t * mp)
                      segments,
                      ntohl (mp->sids.weight),
                      mp->type, ntohl (mp->fib_table), mp->is_encap);
+  vec_free (segments);
 
   REPLY_MACRO (VL_API_SR_POLICY_ADD_REPLY);
 }
@@ -147,6 +148,7 @@ vl_api_sr_policy_mod_t_handler (vl_api_sr_policy_mod_t * mp)
                      mp->operation,
                      segments, ntohl (mp->sl_index),
                      ntohl (mp->sids.weight));
+  vec_free (segments);
 
   REPLY_MACRO (VL_API_SR_POLICY_MOD_REPLY);
 }
index ad73d29..62ce224 100755 (executable)
@@ -886,6 +886,7 @@ sr_policy_command_fn (vlib_main_t * vm, unformat_input_t * input,
       rv = sr_policy_add (&bsid, segments, weight,
                          (is_spray ? SR_POLICY_TYPE_SPRAY :
                           SR_POLICY_TYPE_DEFAULT), fib_table, is_encap);
+      vec_free (segments);
     }
   else if (is_del)
     rv = sr_policy_del ((sr_policy_index != (u32) ~ 0 ? NULL : &bsid),
@@ -903,6 +904,7 @@ sr_policy_command_fn (vlib_main_t * vm, unformat_input_t * input,
       rv = sr_policy_mod ((sr_policy_index != (u32) ~ 0 ? NULL : &bsid),
                          sr_policy_index, fib_table, operation, segments,
                          sl_index, weight);
+      vec_free (segments);
     }
 
   switch (rv)