nat: fix nat64 disable 48/29548/3
authorBenoît Ganne <bganne@cisco.com>
Tue, 20 Oct 2020 12:07:55 +0000 (14:07 +0200)
committerMatthew Smith <mgsmith@netgate.com>
Mon, 2 Nov 2020 13:56:16 +0000 (13:56 +0000)
 - we should not copy and iterate over the pool underlying vector, as
   slots can be freed (ie in the freelist).
 - delete interface instead of adding them again
 - fix the log message

Type: fix

Change-Id: If0a7a2f475b4f40793eb29ea80a9d29fe5d1bcb9
Signed-off-by: Benoît Ganne <bganne@cisco.com>
src/plugins/nat/nat64/nat64.c

index 30142a7..240f3ef 100644 (file)
@@ -1557,7 +1557,7 @@ nat64_plugin_disable ()
   int rv = 0;
 
   nat64_address_t *a;
-  nat64_interface_t *i, *interfaces;
+  nat64_interface_t *i, *interfaces = 0;
 
   if (plugin_enabled () == 0)
     {
@@ -1566,16 +1566,21 @@ nat64_plugin_disable ()
     }
   nm->enabled = 0;
 
-  interfaces = vec_dup (nm->interfaces);
+  /* *INDENT-OFF* */
+  pool_foreach (i, nm->interfaces,
+  ({
+    vec_add1 (interfaces, *i);
+  }));
+  /* *INDENT-ON* */
   vec_foreach (i, interfaces)
   {
-    rv = nat64_interface_add_del (i->sw_if_index, i->flags, 1);
+    rv = nat64_interface_add_del (i->sw_if_index, i->flags, 0);
     if (rv)
       {
        nat64_log_err ("%U %s interface del failed",
-                      unformat_vnet_sw_interface,
+                      format_vnet_sw_if_index_name, vnm, i->sw_if_index,
                       i->flags & NAT64_INTERFACE_FLAG_IS_INSIDE ?
-                      "inside" : "outside", vnm, i->sw_if_index);
+                      "inside" : "outside");
       }
   }
   vec_free (interfaces);