VPP-635: CLI Memory leak with invalid parameter 48/5148/5
authorBilly McFall <bmcfall@redhat.com>
Wed, 15 Feb 2017 16:39:12 +0000 (11:39 -0500)
committerDave Barach <openvpp@barachs.net>
Wed, 22 Feb 2017 16:23:12 +0000 (16:23 +0000)
In the CLI parsing, below is a common pattern:
  /* Get a line of input. */
  if (!unformat_user (input, unformat_line_input, line_input))
    return 0;

  while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
    {
      if (unformat (line_input, "x"))
x = 1;
      :
      else
return clib_error_return (0, "unknown input `%U'",
  format_unformat_error, line_input);
    }
  unformat_free (line_input);

The 'else' returns if an unknown string is encountered. There a memory
leak because the 'unformat_free(line_input)' is not called. There is a
large number of instances of this pattern.

Replaced the previous pattern with:
  /* Get a line of input. */
  if (!unformat_user (input, unformat_line_input, line_input))
    return 0;

  while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
    {
      if (unformat (line_input, "x"))
x = 1;
      :
      else
        {
  error = clib_error_return (0, "unknown input `%U'",
     format_unformat_error, line_input);
  goto done:
        }
    }

  /* ...Remaining code... */

done:
  unformat_free (line_input);
  return error;
}

In multiple files, 'unformat_free (line_input);' was never called, so
there was a memory leak whether an invalid string was entered or not.

Also, there were multiple instance where:
  error = clib_error_return (0, "unknown input `%U'",
     format_unformat_error, line_input);
used 'input' as the last parameter instead of 'line_input'. The result
is that output did not contain the substring in error, instead just an
empty string. Fixed all of those as well.

There are a lot of file, and very mind numbing work, so tried to keep
it to a pattern to avoid mistakes.

Change-Id: I8902f0c32a47dd7fb3bb3471a89818571702f1d2
Signed-off-by: Billy McFall <bmcfall@redhat.com>
Signed-off-by: Dave Barach <dave@barachs.net>
37 files changed:
build-root/emacs-lisp/tunnel-c-skel.el
src/plugins/ila/ila.c
src/plugins/lb/cli.c
src/plugins/sixrd/sixrd.c
src/plugins/snat/snat.c
src/vlib/threads_cli.c
src/vlib/trace.c
src/vlib/unix/cli.c
src/vnet/devices/af_packet/cli.c
src/vnet/devices/dpdk/cli.c
src/vnet/devices/dpdk/ipsec/cli.c
src/vnet/devices/netmap/cli.c
src/vnet/devices/virtio/vhost-user.c
src/vnet/gre/interface.c
src/vnet/ip/ip4_source_check.c
src/vnet/ip/ip4_test.c
src/vnet/ip/ip6_neighbor.c
src/vnet/ip/lookup.c
src/vnet/ipsec-gre/interface.c
src/vnet/ipsec/ipsec_cli.c
src/vnet/l2/l2_patch.c
src/vnet/l2/l2_xcrw.c
src/vnet/l2tp/l2tp.c
src/vnet/lisp-cp/lisp_cli.c
src/vnet/lisp-gpe/interface.c
src/vnet/lisp-gpe/lisp_gpe.c
src/vnet/map/map.c
src/vnet/mpls/mpls.c
src/vnet/mpls/mpls_tunnel.c
src/vnet/pg/cli.c
src/vnet/policer/node_funcs.c
src/vnet/policer/policer.c
src/vnet/unix/tapcli.c
src/vnet/vxlan-gpe/vxlan_gpe.c
src/vnet/vxlan/vxlan.c
src/vpp/app/l2t.c
src/vpp/app/vpe_cli.c

index aa260e5..a1b1757 100644 (file)
@@ -288,6 +288,7 @@ static clib_error_t *
                                    vlib_cli_command_t * cmd)
 {
   unformat_input_t _line_input, * line_input = &_line_input;
+  clib_error_t *error = 0;
   ip4_address_t src, dst;
   u8 is_add = 1;
   u8 src_set = 0;
@@ -322,13 +323,19 @@ static clib_error_t *
       {
         encap_fib_index = fib_index_from_fib_id (tmp);
         if (encap_fib_index == ~0)
-          return clib_error_return (0, \"nonexistent encap fib id %d\", tmp);
+          {
+            unformat_free (line_input);
+            return clib_error_return (0, \"nonexistent encap fib id %d\", tmp);
+          }
       }
     else if (unformat (line_input, \"decap-vrf-id %d\", &tmp))
       {
         decap_fib_index = fib_index_from_fib_id (tmp);
         if (decap_fib_index == ~0)
-          return clib_error_return (0, \"nonexistent decap fib id %d\", tmp);
+          {
+            unformat_free (line_input);
+            return clib_error_return (0, \"nonexistent decap fib id %d\", tmp);
+          }
       }
     else if (unformat (line_input, \"decap-next %U\", unformat_decap_next, 
                        &decap_next_index))
@@ -346,8 +353,12 @@ static clib_error_t *
      * in the " ENCAP_STACK " header
      */
     else 
-      return clib_error_return (0, \"parse error: '%U'\", 
-                                format_unformat_error, line_input);
+      {
+        error = clib_error_return (0, \"parse error: '%U'\",
+                                   format_unformat_error, line_input);
+        unformat_free (line_input);
+        return error;
+      }
   }
 
   unformat_free (line_input);
index e0f3907..52c7ea5 100644 (file)
@@ -949,6 +949,7 @@ ila_entry_command_fn (vlib_main_t * vm,
   ila_add_del_entry_args_t args = { 0 };
   u8 next_hop_set = 0;
   int ret;
+  clib_error_t *error = 0;
 
   args.type = ILA_TYPE_IID;
   args.csum_mode = ILA_CSUM_MODE_NO_ACTION;
@@ -986,19 +987,29 @@ ila_entry_command_fn (vlib_main_t * vm,
       else if (unformat (line_input, "del"))
        args.is_del = 1;
       else
-       return clib_error_return (0, "parse error: '%U'",
-                                 format_unformat_error, line_input);
+       {
+         error = clib_error_return (0, "parse error: '%U'",
+                                    format_unformat_error, line_input);
+         goto done;
+       }
     }
 
-  unformat_free (line_input);
-
   if (!next_hop_set)
-      return clib_error_return (0, "Specified a next hop");
+    {
+      error = clib_error_return (0, "Specified a next hop");
+      goto done;
+    }
 
   if ((ret = ila_add_del_entry (&args)))
-    return clib_error_return (0, "ila_add_del_entry returned error %d", ret);
+    {
+      error = clib_error_return (0, "ila_add_del_entry returned error %d", ret);
+      goto done;
+    }
 
-  return NULL;
+done:
+  unformat_free (line_input);
+
+  return error;
 }
 
 VLIB_CLI_COMMAND (ila_entry_command, static) =
index b59c642..6452a87 100644 (file)
@@ -28,13 +28,16 @@ lb_vip_command_fn (vlib_main_t * vm,
   int ret;
   u32 gre4 = 0;
   lb_vip_type_t type;
+  clib_error_t *error = 0;
 
   if (!unformat_user (input, unformat_line_input, line_input))
     return 0;
 
-  if (!unformat(line_input, "%U", unformat_ip46_prefix, &prefix, &plen, IP46_TYPE_ANY, &plen))
-    return clib_error_return (0, "invalid vip prefix: '%U'",
-                                  format_unformat_error, line_input);
+  if (!unformat(line_input, "%U", unformat_ip46_prefix, &prefix, &plen, IP46_TYPE_ANY, &plen)) {
+    error = clib_error_return (0, "invalid vip prefix: '%U'",
+                               format_unformat_error, line_input);
+    goto done;
+  }
 
   while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
   {
@@ -46,13 +49,13 @@ lb_vip_command_fn (vlib_main_t * vm,
       gre4 = 1;
     else if (unformat(line_input, "encap gre6"))
       gre4 = 0;
-    else
-      return clib_error_return (0, "parse error: '%U'",
-                              format_unformat_error, line_input);
+    else {
+      error = clib_error_return (0, "parse error: '%U'",
+                                format_unformat_error, line_input);
+      goto done;
+    }
   }
 
-  unformat_free (line_input);
-
 
   if (ip46_prefix_is_ip4(&prefix, plen)) {
     type = (gre4)?LB_VIP_TYPE_IP4_GRE4:LB_VIP_TYPE_IP4_GRE6;
@@ -65,17 +68,25 @@ lb_vip_command_fn (vlib_main_t * vm,
   u32 index;
   if (!del) {
     if ((ret = lb_vip_add(&prefix, plen, type, new_len, &index))) {
-      return clib_error_return (0, "lb_vip_add error %d", ret);
+      error = clib_error_return (0, "lb_vip_add error %d", ret);
+      goto done;
     } else {
       vlib_cli_output(vm, "lb_vip_add ok %d", index);
     }
   } else {
-    if ((ret = lb_vip_find_index(&prefix, plen, &index)))
-      return clib_error_return (0, "lb_vip_find_index error %d", ret);
-    else if ((ret = lb_vip_del(index)))
-      return clib_error_return (0, "lb_vip_del error %d", ret);
+    if ((ret = lb_vip_find_index(&prefix, plen, &index))) {
+      error = clib_error_return (0, "lb_vip_find_index error %d", ret);
+      goto done;
+    } else if ((ret = lb_vip_del(index))) {
+      error = clib_error_return (0, "lb_vip_del error %d", ret);
+      goto done;
+    }
   }
-  return NULL;
+
+done:
+  unformat_free (line_input);
+
+  return error;
 }
 
 VLIB_CLI_COMMAND (lb_vip_command, static) =
@@ -96,16 +107,21 @@ lb_as_command_fn (vlib_main_t * vm,
   u32 vip_index;
   u8 del = 0;
   int ret;
+  clib_error_t *error = 0;
 
   if (!unformat_user (input, unformat_line_input, line_input))
     return 0;
 
-  if (!unformat(line_input, "%U", unformat_ip46_prefix, &vip_prefix, &vip_plen, IP46_TYPE_ANY))
-    return clib_error_return (0, "invalid as address: '%U'",
-                              format_unformat_error, line_input);
+  if (!unformat(line_input, "%U", unformat_ip46_prefix, &vip_prefix, &vip_plen, IP46_TYPE_ANY)) {
+    error = clib_error_return (0, "invalid as address: '%U'",
+                               format_unformat_error, line_input);
+    goto done;
+  }
 
-  if ((ret = lb_vip_find_index(&vip_prefix, vip_plen, &vip_index)))
-    return clib_error_return (0, "lb_vip_find_index error %d", ret);
+  if ((ret = lb_vip_find_index(&vip_prefix, vip_plen, &vip_index))) {
+    error = clib_error_return (0, "lb_vip_find_index error %d", ret);
+    goto done;
+  }
 
   while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
   {
@@ -114,15 +130,15 @@ lb_as_command_fn (vlib_main_t * vm,
     } else if (unformat(line_input, "del")) {
       del = 1;
     } else {
-      vec_free(as_array);
-      return clib_error_return (0, "parse error: '%U'",
-                                format_unformat_error, line_input);
+      error = clib_error_return (0, "parse error: '%U'",
+                                 format_unformat_error, line_input);
+      goto done;
     }
   }
 
   if (!vec_len(as_array)) {
-    vec_free(as_array);
-    return clib_error_return (0, "No AS address provided");
+    error = clib_error_return (0, "No AS address provided");
+    goto done;
   }
 
   lb_garbage_collection();
@@ -130,18 +146,21 @@ lb_as_command_fn (vlib_main_t * vm,
 
   if (del) {
     if ((ret = lb_vip_del_ass(vip_index, as_array, vec_len(as_array)))) {
-      vec_free(as_array);
-      return clib_error_return (0, "lb_vip_del_ass error %d", ret);
+      error = clib_error_return (0, "lb_vip_del_ass error %d", ret);
+      goto done;
     }
   } else {
     if ((ret = lb_vip_add_ass(vip_index, as_array, vec_len(as_array)))) {
-      vec_free(as_array);
-      return clib_error_return (0, "lb_vip_add_ass error %d", ret);
+      error = clib_error_return (0, "lb_vip_add_ass error %d", ret);
+      goto done;
     }
   }
 
+done:
+  unformat_free (line_input);
   vec_free(as_array);
-  return 0;
+
+  return error;
 }
 
 VLIB_CLI_COMMAND (lb_as_command, static) =
@@ -163,6 +182,7 @@ lb_conf_command_fn (vlib_main_t * vm,
   u32 per_cpu_sticky_buckets_log2 = 0;
   u32 flow_timeout = lbm->flow_timeout;
   int ret;
+  clib_error_t *error = 0;
 
   if (!unformat_user (input, unformat_line_input, line_input))
     return 0;
@@ -181,19 +201,24 @@ lb_conf_command_fn (vlib_main_t * vm,
       per_cpu_sticky_buckets = 1 << per_cpu_sticky_buckets_log2;
     } else if (unformat(line_input, "timeout %d", &flow_timeout))
       ;
-    else
-      return clib_error_return (0, "parse error: '%U'",
-                                format_unformat_error, line_input);
+    else {
+      error = clib_error_return (0, "parse error: '%U'",
+                                 format_unformat_error, line_input);
+      goto done;
+    }
   }
 
-  unformat_free (line_input);
-
   lb_garbage_collection();
 
-  if ((ret = lb_conf(&ip4, &ip6, per_cpu_sticky_buckets, flow_timeout)))
-    return clib_error_return (0, "lb_conf error %d", ret);
+  if ((ret = lb_conf(&ip4, &ip6, per_cpu_sticky_buckets, flow_timeout))) {
+    error = clib_error_return (0, "lb_conf error %d", ret);
+    goto done;
+  }
 
-  return NULL;
+done:
+  unformat_free (line_input);
+
+  return error;
 }
 
 VLIB_CLI_COMMAND (lb_conf_command, static) =
index 71fc181..67a9a3a 100644 (file)
@@ -192,6 +192,7 @@ sixrd_add_domain_command_fn (vlib_main_t *vm,
   u32 num_m_args = 0;
   /* Optional arguments */
   u32 mtu = 0;
+  clib_error_t *error = 0;
 
   /* Get a line of input. */
   if (!unformat_user(input, unformat_line_input, line_input))
@@ -205,19 +206,25 @@ sixrd_add_domain_command_fn (vlib_main_t *vm,
       num_m_args++;
     else if (unformat(line_input, "mtu %d", &mtu))
       num_m_args++;
-    else
-      return clib_error_return(0, "unknown input `%U'",
-                               format_unformat_error, input);
+    else {
+      error = clib_error_return(0, "unknown input `%U'",
+                                format_unformat_error, line_input);
+      goto done;
+    }
   }
-  unformat_free(line_input);
 
-  if (num_m_args < 3)
-    return clib_error_return(0, "mandatory argument(s) missing");
+  if (num_m_args < 3) {
+    error = clib_error_return(0, "mandatory argument(s) missing");
+    goto done;
+  }
 
   sixrd_create_domain(&ip6_prefix, ip6_prefix_len, &ip4_prefix, ip4_prefix_len,
                      &ip4_src, &sixrd_domain_index, mtu);
 
-  return 0;
+done:
+  unformat_free (line_input);
+
+  return error;
 }
 
 static clib_error_t *
@@ -228,6 +235,7 @@ sixrd_del_domain_command_fn (vlib_main_t *vm,
   unformat_input_t _line_input, *line_input = &_line_input;
   u32 num_m_args = 0;
   u32 sixrd_domain_index;
+  clib_error_t *error = 0;
 
   /* Get a line of input. */
   if (! unformat_user(input, unformat_line_input, line_input))
@@ -236,18 +244,24 @@ sixrd_del_domain_command_fn (vlib_main_t *vm,
   while (unformat_check_input(line_input) != UNFORMAT_END_OF_INPUT) {
     if (unformat(line_input, "index %d", &sixrd_domain_index))
       num_m_args++;
-    else
-      return clib_error_return(0, "unknown input `%U'",
-                               format_unformat_error, input);
+    else {
+      error = clib_error_return(0, "unknown input `%U'",
+                               format_unformat_error, line_input);
+      goto done;
+    }
   }
-  unformat_free(line_input);
 
-  if (num_m_args != 1)
-    return clib_error_return(0, "mandatory argument(s) missing");
+  if (num_m_args != 1) {
+    error = clib_error_return(0, "mandatory argument(s) missing");
+    goto done;
+  }
 
   sixrd_delete_domain(sixrd_domain_index);
 
-  return 0;
+done:
+  unformat_free (line_input);
+
+  return error;
 }
 
 static u8 *
index 73854a7..8c2bacd 100644 (file)
@@ -1705,6 +1705,7 @@ add_address_command_fn (vlib_main_t * vm,
   int i, count;
   int is_add = 1;
   int rv = 0;
+  clib_error_t *error = 0;
 
   /* Get a line of input. */
   if (!unformat_user (input, unformat_line_input, line_input))
@@ -1721,19 +1722,27 @@ add_address_command_fn (vlib_main_t * vm,
       else if (unformat (line_input, "del"))
         is_add = 0;
       else
-        return clib_error_return (0, "unknown input '%U'",
-          format_unformat_error, input);
+        {
+          error = clib_error_return (0, "unknown input '%U'",
+            format_unformat_error, line_input);
+          goto done;
+        }
      }
-  unformat_free (line_input);
 
   if (sm->static_mapping_only)
-    return clib_error_return (0, "static mapping only mode");
+    {
+      error = clib_error_return (0, "static mapping only mode");
+      goto done;
+    }
 
   start_host_order = clib_host_to_net_u32 (start_addr.as_u32);
   end_host_order = clib_host_to_net_u32 (end_addr.as_u32);
   
   if (end_host_order < start_host_order)
-    return clib_error_return (0, "end address less than start address");
+    {
+      error = clib_error_return (0, "end address less than start address");
+      goto done;
+    }
 
   count = (end_host_order - start_host_order) + 1;
 
@@ -1755,11 +1764,11 @@ add_address_command_fn (vlib_main_t * vm,
       switch (rv)
         {
         case VNET_API_ERROR_NO_SUCH_ENTRY:
-          return clib_error_return (0, "S-NAT address not exist.");
-          break;
+          error = clib_error_return (0, "S-NAT address not exist.");
+          goto done;
         case VNET_API_ERROR_UNSPECIFIED:
-          return clib_error_return (0, "S-NAT address used in static mapping.");
-          break;
+          error = clib_error_return (0, "S-NAT address used in static mapping.");
+          goto done;
         default:
           break;
         }
@@ -1767,7 +1776,10 @@ add_address_command_fn (vlib_main_t * vm,
       increment_v4_address (&this_addr);
     }
 
-  return 0;
+done:
+  unformat_free (line_input);
+
+  return error;
 }
 
 VLIB_CLI_COMMAND (add_address_command, static) = {
@@ -1807,10 +1819,12 @@ snat_feature_command_fn (vlib_main_t * vm,
       else if (unformat (line_input, "del"))
         is_del = 1;
       else
-        return clib_error_return (0, "unknown input '%U'",
-          format_unformat_error, input);
+        {
+          error = clib_error_return (0, "unknown input '%U'",
+            format_unformat_error, line_input);
+          goto done;
+        }
     }
-  unformat_free (line_input);
 
   if (vec_len (inside_sw_if_indices))
     {
@@ -1830,6 +1844,8 @@ snat_feature_command_fn (vlib_main_t * vm,
         }
     }
 
+done:
+  unformat_free (line_input);
   vec_free (inside_sw_if_indices);
   vec_free (outside_sw_if_indices);
 
@@ -1923,13 +1939,18 @@ add_static_mapping_command_fn (vlib_main_t * vm,
       else if (unformat (line_input, "del"))
         is_add = 0;
       else
-        return clib_error_return (0, "unknown input: '%U'",
-          format_unformat_error, line_input);
+        {
+          error = clib_error_return (0, "unknown input: '%U'",
+            format_unformat_error, line_input);
+          goto done;
+        }
     }
-  unformat_free (line_input);
 
   if (!addr_only && !proto_set)
-    return clib_error_return (0, "missing protocol");
+    {
+      error = clib_error_return (0, "missing protocol");
+      goto done;
+    }
 
   rv = snat_add_static_mapping(l_addr, e_addr, (u16) l_port, (u16) e_port,
                                vrf_id, addr_only, sw_if_index, proto, is_add);
@@ -1937,22 +1958,27 @@ add_static_mapping_command_fn (vlib_main_t * vm,
   switch (rv)
     {
     case VNET_API_ERROR_INVALID_VALUE:
-      return clib_error_return (0, "External port already in use.");
-      break;
+      error = clib_error_return (0, "External port already in use.");
+      goto done;
     case VNET_API_ERROR_NO_SUCH_ENTRY:
       if (is_add)
-        return clib_error_return (0, "External addres must be allocated.");
+        error = clib_error_return (0, "External addres must be allocated.");
       else
-        return clib_error_return (0, "Mapping not exist.");
-      break;
+        error = clib_error_return (0, "Mapping not exist.");
+      goto done;
     case VNET_API_ERROR_NO_SUCH_FIB:
-      return clib_error_return (0, "No such VRF id.");
+      error = clib_error_return (0, "No such VRF id.");
+      goto done;
     case VNET_API_ERROR_VALUE_EXIST:
-      return clib_error_return (0, "Mapping already exist.");
+      error = clib_error_return (0, "Mapping already exist.");
+      goto done;
     default:
       break;
     }
 
+done:
+  unformat_free (line_input);
+
   return error;
 }
 
@@ -1985,6 +2011,7 @@ set_workers_command_fn (vlib_main_t * vm,
   unformat_input_t _line_input, *line_input = &_line_input;
   uword *bitmap = 0;
   int rv = 0;
+  clib_error_t *error = 0;
 
   /* Get a line of input. */
   if (!unformat_user (input, unformat_line_input, line_input))
@@ -1995,13 +2022,18 @@ set_workers_command_fn (vlib_main_t * vm,
       if (unformat (line_input, "%U", unformat_bitmap_list, &bitmap))
         ;
       else
-        return clib_error_return (0, "unknown input '%U'",
-          format_unformat_error, input);
+        {
+          error = clib_error_return (0, "unknown input '%U'",
+            format_unformat_error, line_input);
+          goto done;
+        }
      }
-  unformat_free (line_input);
 
   if (bitmap == 0)
-    return clib_error_return (0, "List of workers must be specified.");
+    {
+      error = clib_error_return (0, "List of workers must be specified.");
+      goto done;
+    }
 
   rv = snat_set_workers(bitmap);
 
@@ -2010,17 +2042,20 @@ set_workers_command_fn (vlib_main_t * vm,
   switch (rv)
     {
     case VNET_API_ERROR_INVALID_WORKER:
-      return clib_error_return (0, "Invalid worker(s).");
-      break;
+      error = clib_error_return (0, "Invalid worker(s).");
+      goto done;
     case VNET_API_ERROR_FEATURE_DISABLED:
-      return clib_error_return (0,
+      error = clib_error_return (0,
         "Supported only if 2 or more workes available.");
-      break;
+      goto done;
     default:
       break;
     }
 
-  return 0;
+done:
+  unformat_free (line_input);
+
+  return error;
 }
 
 /*?
@@ -2047,6 +2082,7 @@ snat_ipfix_logging_enable_disable_command_fn (vlib_main_t * vm,
   u32 src_port = 0;
   u8 enable = 1;
   int rv = 0;
+  clib_error_t *error = 0;
 
   /* Get a line of input. */
   if (!unformat_user (input, unformat_line_input, line_input))
@@ -2061,17 +2097,25 @@ snat_ipfix_logging_enable_disable_command_fn (vlib_main_t * vm,
       else if (unformat (line_input, "disable"))
         enable = 0;
       else
-        return clib_error_return (0, "unknown input '%U'",
-          format_unformat_error, input);
+        {
+          error = clib_error_return (0, "unknown input '%U'",
+            format_unformat_error, line_input);
+          goto done;
+        }
      }
-  unformat_free (line_input);
 
   rv = snat_ipfix_logging_enable_disable (enable, domain_id, (u16) src_port);
 
   if (rv)
-    return clib_error_return (0, "ipfix logging enable failed");
+    {
+      error = clib_error_return (0, "ipfix logging enable failed");
+      goto done;
+    }
 
-  return 0;
+done:
+  unformat_free (line_input);
+
+  return error;
 }
 
 /*?
@@ -2604,6 +2648,7 @@ snat_add_interface_address_command_fn (vlib_main_t * vm,
   u32 sw_if_index;
   int rv;
   int is_del = 0;
+  clib_error_t *error = 0;
 
   /* Get a line of input. */
   if (!unformat_user (input, unformat_line_input, line_input))
@@ -2617,8 +2662,11 @@ snat_add_interface_address_command_fn (vlib_main_t * vm,
       else if (unformat (line_input, "del"))
         is_del = 1;
       else
-        return clib_error_return (0, "unknown input '%U'",
-                                 format_unformat_error, line_input);
+        {
+          error = clib_error_return (0, "unknown input '%U'",
+                                    format_unformat_error, line_input);
+          goto done;
+        }
     }
 
   rv = snat_add_interface_address (sm, sw_if_index, is_del);
@@ -2629,10 +2677,15 @@ snat_add_interface_address_command_fn (vlib_main_t * vm,
       break;
 
     default:
-      return clib_error_return (0, "snat_add_interface_address returned %d",
-                                rv);
+      error = clib_error_return (0, "snat_add_interface_address returned %d",
+                                 rv);
+      goto done;
     }
-  return 0;
+
+done:
+  unformat_free (line_input);
+
+  return error;
 }
 
 VLIB_CLI_COMMAND (snat_add_interface_address_command, static) = {
index 54cc1ae..36f8109 100644 (file)
@@ -163,21 +163,31 @@ trace_frame_queue (vlib_main_t * vm, unformat_input_t * input,
       else if (unformat (line_input, "index %u", &index))
        ;
       else
-       return clib_error_return (0, "parse error: '%U'",
-                                 format_unformat_error, line_input);
+       {
+         error = clib_error_return (0, "parse error: '%U'",
+                                    format_unformat_error, line_input);
+         goto done;
+       }
     }
 
-  unformat_free (line_input);
-
   if (enable > 1)
-    return clib_error_return (0, "expecting on or off");
+    {
+      error = clib_error_return (0, "expecting on or off");
+      goto done;
+    }
 
   if (vec_len (tm->frame_queue_mains) == 0)
-    return clib_error_return (0, "no worker handoffs exist");
+    {
+      error = clib_error_return (0, "no worker handoffs exist");
+      goto done;
+    }
 
   if (index > vec_len (tm->frame_queue_mains) - 1)
-    return clib_error_return (0,
-                             "expecting valid worker handoff queue index");
+    {
+      error = clib_error_return (0,
+                                "expecting valid worker handoff queue index");
+      goto done;
+    }
 
   fqm = vec_elt_at_index (tm->frame_queue_mains, index);
 
@@ -185,7 +195,7 @@ trace_frame_queue (vlib_main_t * vm, unformat_input_t * input,
   if (num_fq == 0)
     {
       vlib_cli_output (vm, "No frame queues exist\n");
-      return error;
+      goto done;
     }
 
   // Allocate storage for trace if necessary
@@ -204,6 +214,10 @@ trace_frame_queue (vlib_main_t * vm, unformat_input_t * input,
       memset (fqh, 0, sizeof (*fqh));
       fqm->vlib_frame_queues[fqix]->trace = enable;
     }
+
+done:
+  unformat_free (line_input);
+
   return error;
 }
 
@@ -432,28 +446,33 @@ test_frame_queue_nelts (vlib_main_t * vm, unformat_input_t * input,
       else if (unformat (line_input, "index %u", &index))
        ;
       else
-       return clib_error_return (0, "parse error: '%U'",
-                                 format_unformat_error, line_input);
+       {
+         error = clib_error_return (0, "parse error: '%U'",
+                                    format_unformat_error, line_input);
+         goto done;
+       }
     }
 
-  unformat_free (line_input);
-
   if (index > vec_len (tm->frame_queue_mains) - 1)
-    return clib_error_return (0,
-                             "expecting valid worker handoff queue index");
+    {
+      error = clib_error_return (0,
+                                "expecting valid worker handoff queue index");
+      goto done;
+    }
 
   fqm = vec_elt_at_index (tm->frame_queue_mains, index);
 
   if ((nelts != 4) && (nelts != 8) && (nelts != 16) && (nelts != 32))
     {
-      return clib_error_return (0, "expecting 4,8,16,32");
+      error = clib_error_return (0, "expecting 4,8,16,32");
+      goto done;
     }
 
   num_fq = vec_len (fqm->vlib_frame_queues);
   if (num_fq == 0)
     {
       vlib_cli_output (vm, "No frame queues exist\n");
-      return error;
+      goto done;
     }
 
   for (fqix = 0; fqix < num_fq; fqix++)
@@ -461,6 +480,9 @@ test_frame_queue_nelts (vlib_main_t * vm, unformat_input_t * input,
       fqm->vlib_frame_queues[fqix]->nelts = nelts;
     }
 
+done:
+  unformat_free (line_input);
+
   return error;
 }
 
@@ -499,15 +521,19 @@ test_frame_queue_threshold (vlib_main_t * vm, unformat_input_t * input,
       else if (unformat (line_input, "index %u", &index))
        ;
       else
-       return clib_error_return (0, "parse error: '%U'",
-                                 format_unformat_error, line_input);
+       {
+         error = clib_error_return (0, "parse error: '%U'",
+                                    format_unformat_error, line_input);
+         goto done;
+       }
     }
 
-  unformat_free (line_input);
-
   if (index > vec_len (tm->frame_queue_mains) - 1)
-    return clib_error_return (0,
-                             "expecting valid worker handoff queue index");
+    {
+      error = clib_error_return (0,
+                                "expecting valid worker handoff queue index");
+      goto done;
+    }
 
   fqm = vec_elt_at_index (tm->frame_queue_mains, index);
 
@@ -515,7 +541,7 @@ test_frame_queue_threshold (vlib_main_t * vm, unformat_input_t * input,
   if (threshold == ~(u32) 0)
     {
       vlib_cli_output (vm, "expecting threshold value\n");
-      return error;
+      goto done;
     }
 
   if (threshold == 0)
@@ -525,7 +551,7 @@ test_frame_queue_threshold (vlib_main_t * vm, unformat_input_t * input,
   if (num_fq == 0)
     {
       vlib_cli_output (vm, "No frame queues exist\n");
-      return error;
+      goto done;
     }
 
   for (fqix = 0; fqix < num_fq; fqix++)
@@ -533,6 +559,9 @@ test_frame_queue_threshold (vlib_main_t * vm, unformat_input_t * input,
       fqm->vlib_frame_queues[fqix]->vector_threshold = threshold;
     }
 
+done:
+  unformat_free (line_input);
+
   return error;
 }
 
index dcdb837..6d487ae 100644 (file)
@@ -372,6 +372,7 @@ cli_add_trace_buffer (vlib_main_t * vm,
   vlib_trace_node_t *tn;
   u32 node_index, add;
   u8 verbose = 0;
+  clib_error_t *error = 0;
 
   if (!unformat_user (input, unformat_line_input, line_input))
     return 0;
@@ -384,8 +385,11 @@ cli_add_trace_buffer (vlib_main_t * vm,
       else if (unformat (line_input, "verbose"))
        verbose = 1;
       else
-       return clib_error_create ("expected NODE COUNT, got `%U'",
-                                 format_unformat_error, line_input);
+       {
+         error = clib_error_create ("expected NODE COUNT, got `%U'",
+                                    format_unformat_error, line_input);
+         goto done;
+       }
     }
 
   /* *INDENT-OFF* */
@@ -403,7 +407,10 @@ cli_add_trace_buffer (vlib_main_t * vm,
     }));
   /* *INDENT-ON* */
 
-  return 0;
+done:
+  unformat_free (line_input);
+
+  return error;
 }
 
 /* *INDENT-OFF* */
index 69fca6e..88e2453 100644 (file)
@@ -2835,6 +2835,7 @@ unix_cli_set_terminal_pager (vlib_main_t * vm,
   unix_cli_main_t *cm = &unix_cli_main;
   unix_cli_file_t *cf;
   unformat_input_t _line_input, *line_input = &_line_input;
+  clib_error_t *error = 0;
 
   if (!unformat_user (input, unformat_line_input, line_input))
     return 0;
@@ -2852,13 +2853,17 @@ unix_cli_set_terminal_pager (vlib_main_t * vm,
                         "Pager limit set to %u lines; note, this is global.\n",
                         um->cli_pager_buffer_limit);
       else
-       return clib_error_return (0, "unknown parameter: `%U`",
-                                 format_unformat_error, line_input);
+       {
+         error = clib_error_return (0, "unknown parameter: `%U`",
+                                    format_unformat_error, line_input);
+         goto done;
+       }
     }
 
+done:
   unformat_free (line_input);
 
-  return 0;
+  return error;
 }
 
 /*?
@@ -2886,6 +2891,7 @@ unix_cli_set_terminal_history (vlib_main_t * vm,
   unix_cli_file_t *cf;
   unformat_input_t _line_input, *line_input = &_line_input;
   u32 limit;
+  clib_error_t *error = 0;
 
   if (!unformat_user (input, unformat_line_input, line_input))
     return 0;
@@ -2901,8 +2907,11 @@ unix_cli_set_terminal_history (vlib_main_t * vm,
       else if (unformat (line_input, "limit %u", &cf->history_limit))
        ;
       else
-       return clib_error_return (0, "unknown parameter: `%U`",
-                                 format_unformat_error, line_input);
+       {
+         error = clib_error_return (0, "unknown parameter: `%U`",
+                                    format_unformat_error, line_input);
+         goto done;
+       }
 
       /* If we reduced history size, or turned it off, purge the history */
       limit = cf->has_history ? cf->history_limit : 0;
@@ -2914,9 +2923,10 @@ unix_cli_set_terminal_history (vlib_main_t * vm,
        }
     }
 
+done:
   unformat_free (line_input);
 
-  return 0;
+  return error;
 }
 
 /*?
index 6baa26e..d4aa701 100644 (file)
@@ -49,6 +49,7 @@ af_packet_create_command_fn (vlib_main_t * vm, unformat_input_t * input,
   u8 *hw_addr_ptr = 0;
   u32 sw_if_index;
   int r;
+  clib_error_t *error = NULL;
 
   /* Get a line of input. */
   if (!unformat_user (input, unformat_line_input, line_input))
@@ -63,29 +64,47 @@ af_packet_create_command_fn (vlib_main_t * vm, unformat_input_t * input,
            (line_input, "hw-addr %U", unformat_ethernet_address, hwaddr))
        hw_addr_ptr = hwaddr;
       else
-       return clib_error_return (0, "unknown input `%U'",
-                                 format_unformat_error, input);
+       {
+         error = clib_error_return (0, "unknown input `%U'",
+                                    format_unformat_error, line_input);
+         goto done;
+       }
     }
-  unformat_free (line_input);
 
   if (host_if_name == NULL)
-    return clib_error_return (0, "missing host interface name");
+    {
+      error = clib_error_return (0, "missing host interface name");
+      goto done;
+    }
 
   r = af_packet_create_if (vm, host_if_name, hw_addr_ptr, &sw_if_index);
-  vec_free (host_if_name);
 
   if (r == VNET_API_ERROR_SYSCALL_ERROR_1)
-    return clib_error_return (0, "%s (errno %d)", strerror (errno), errno);
+    {
+      error = clib_error_return (0, "%s (errno %d)", strerror (errno), errno);
+      goto done;
+    }
 
   if (r == VNET_API_ERROR_INVALID_INTERFACE)
-    return clib_error_return (0, "Invalid interface name");
+    {
+      error = clib_error_return (0, "Invalid interface name");
+      goto done;
+    }
 
   if (r == VNET_API_ERROR_SUBIF_ALREADY_EXISTS)
-    return clib_error_return (0, "Interface elready exists");
+    {
+      error = clib_error_return (0, "Interface elready exists");
+      goto done;
+    }
 
   vlib_cli_output (vm, "%U\n", format_vnet_sw_if_index_name, vnet_get_main (),
                   sw_if_index);
-  return 0;
+
+done:
+  vec_free (host_if_name);
+  unformat_free (line_input);
+
+  return error;
 }
 
 /*?
@@ -124,6 +143,7 @@ af_packet_delete_command_fn (vlib_main_t * vm, unformat_input_t * input,
 {
   unformat_input_t _line_input, *line_input = &_line_input;
   u8 *host_if_name = NULL;
+  clib_error_t *error = NULL;
 
   /* Get a line of input. */
   if (!unformat_user (input, unformat_line_input, line_input))
@@ -134,18 +154,26 @@ af_packet_delete_command_fn (vlib_main_t * vm, unformat_input_t * input,
       if (unformat (line_input, "name %s", &host_if_name))
        ;
       else
-       return clib_error_return (0, "unknown input `%U'",
-                                 format_unformat_error, input);
+       {
+         error = clib_error_return (0, "unknown input `%U'",
+                                    format_unformat_error, line_input);
+         goto done;
+       }
     }
-  unformat_free (line_input);
 
   if (host_if_name == NULL)
-    return clib_error_return (0, "missing host interface name");
+    {
+      error = clib_error_return (0, "missing host interface name");
+      goto done;
+    }
 
   af_packet_delete_if (vm, host_if_name);
+
+done:
   vec_free (host_if_name);
+  unformat_free (line_input);
 
-  return 0;
+  return error;
 }
 
 /*?
index d133cfd..1fc665a 100644 (file)
@@ -398,7 +398,7 @@ set_dpdk_if_desc (vlib_main_t * vm, unformat_input_t * input,
   u32 hw_if_index = (u32) ~ 0;
   u32 nb_rx_desc = (u32) ~ 0;
   u32 nb_tx_desc = (u32) ~ 0;
-  clib_error_t *rv;
+  clib_error_t *error = NULL;
 
   if (!unformat_user (input, unformat_line_input, line_input))
     return 0;
@@ -414,25 +414,37 @@ set_dpdk_if_desc (vlib_main_t * vm, unformat_input_t * input,
       else if (unformat (line_input, "rx %d", &nb_rx_desc))
        ;
       else
-       return clib_error_return (0, "parse error: '%U'",
-                                 format_unformat_error, line_input);
+       {
+         error = clib_error_return (0, "parse error: '%U'",
+                                    format_unformat_error, line_input);
+         goto done;
+       }
     }
 
-  unformat_free (line_input);
-
   if (hw_if_index == (u32) ~ 0)
-    return clib_error_return (0, "please specify valid interface name");
+    {
+      error = clib_error_return (0, "please specify valid interface name");
+      goto done;
+    }
 
   hw = vnet_get_hw_interface (dm->vnet_main, hw_if_index);
   xd = vec_elt_at_index (dm->devices, hw->dev_instance);
 
   if ((xd->flags & DPDK_DEVICE_FLAG_PMD) == 0)
-    return clib_error_return (0, "number of descriptors can be set only for "
-                             "physical devices");
+    {
+      error =
+       clib_error_return (0,
+                          "number of descriptors can be set only for "
+                          "physical devices");
+      goto done;
+    }
 
   if ((nb_rx_desc == (u32) ~ 0 || nb_rx_desc == xd->nb_rx_desc) &&
       (nb_tx_desc == (u32) ~ 0 || nb_tx_desc == xd->nb_tx_desc))
-    return clib_error_return (0, "nothing changed");
+    {
+      error = clib_error_return (0, "nothing changed");
+      goto done;
+    }
 
   if (nb_rx_desc != (u32) ~ 0)
     xd->nb_rx_desc = nb_rx_desc;
@@ -440,9 +452,12 @@ set_dpdk_if_desc (vlib_main_t * vm, unformat_input_t * input,
   if (nb_tx_desc != (u32) ~ 0)
     xd->nb_tx_desc = nb_tx_desc;
 
-  rv = dpdk_port_setup (dm, xd);
+  error = dpdk_port_setup (dm, xd);
+
+done:
+  unformat_free (line_input);
 
-  return rv;
+  return error;
 }
 
 /* *INDENT-OFF* */
@@ -523,6 +538,7 @@ set_dpdk_if_placement (vlib_main_t * vm, unformat_input_t * input,
   u32 queue = (u32) 0;
   u32 cpu = (u32) ~ 0;
   int i;
+  clib_error_t *error = NULL;
 
   if (!unformat_user (input, unformat_line_input, line_input))
     return 0;
@@ -538,18 +554,25 @@ set_dpdk_if_placement (vlib_main_t * vm, unformat_input_t * input,
       else if (unformat (line_input, "thread %d", &cpu))
        ;
       else
-       return clib_error_return (0, "parse error: '%U'",
-                                 format_unformat_error, line_input);
+       {
+         error = clib_error_return (0, "parse error: '%U'",
+                                    format_unformat_error, line_input);
+         goto done;
+       }
     }
 
-  unformat_free (line_input);
-
   if (hw_if_index == (u32) ~ 0)
-    return clib_error_return (0, "please specify valid interface name");
+    {
+      error = clib_error_return (0, "please specify valid interface name");
+      goto done;
+    }
 
   if (cpu < dm->input_cpu_first_index ||
       cpu >= (dm->input_cpu_first_index + dm->input_cpu_count))
-    return clib_error_return (0, "please specify valid thread id");
+    {
+      error = clib_error_return (0, "please specify valid thread id");
+      goto done;
+    }
 
   hw = vnet_get_hw_interface (dm->vnet_main, hw_if_index);
   xd = vec_elt_at_index (dm->devices, hw->dev_instance);
@@ -563,7 +586,7 @@ set_dpdk_if_placement (vlib_main_t * vm, unformat_input_t * input,
               queue == dq->queue_id)
             {
               if (cpu == i) /* nothing to do */
-                return 0;
+                goto done;
 
               vec_del1(dm->devices_by_cpu[i], dq - dm->devices_by_cpu[i]);
               vec_add2(dm->devices_by_cpu[cpu], dq, 1);
@@ -586,13 +609,18 @@ set_dpdk_if_placement (vlib_main_t * vm, unformat_input_t * input,
                 vlib_node_set_state (vlib_mains[cpu], dpdk_input_node.index,
                                      VLIB_NODE_STATE_POLLING);
 
-              return 0;
+              goto done;
             }
         }
       /* *INDENT-ON* */
     }
 
-  return clib_error_return (0, "not found");
+  error = clib_error_return (0, "not found");
+
+done:
+  unformat_free (line_input);
+
+  return error;
 }
 
 /* *INDENT-OFF* */
@@ -653,6 +681,7 @@ set_dpdk_if_hqos_placement (vlib_main_t * vm, unformat_input_t * input,
   u32 hw_if_index = (u32) ~ 0;
   u32 cpu = (u32) ~ 0;
   int i;
+  clib_error_t *error = NULL;
 
   if (!unformat_user (input, unformat_line_input, line_input))
     return 0;
@@ -666,18 +695,22 @@ set_dpdk_if_hqos_placement (vlib_main_t * vm, unformat_input_t * input,
       else if (unformat (line_input, "thread %d", &cpu))
        ;
       else
-       return clib_error_return (0, "parse error: '%U'",
-                                 format_unformat_error, line_input);
+       {
+         error = clib_error_return (0, "parse error: '%U'",
+                                    format_unformat_error, line_input);
+         goto done;
+       }
     }
 
-  unformat_free (line_input);
-
   if (hw_if_index == (u32) ~ 0)
     return clib_error_return (0, "please specify valid interface name");
 
   if (cpu < dm->hqos_cpu_first_index ||
       cpu >= (dm->hqos_cpu_first_index + dm->hqos_cpu_count))
-    return clib_error_return (0, "please specify valid thread id");
+    {
+      error = clib_error_return (0, "please specify valid thread id");
+      goto done;
+    }
 
   hw = vnet_get_hw_interface (dm->vnet_main, hw_if_index);
   xd = vec_elt_at_index (dm->devices, hw->dev_instance);
@@ -689,7 +722,7 @@ set_dpdk_if_hqos_placement (vlib_main_t * vm, unformat_input_t * input,
        if (hw_if_index == dm->devices[dq->device].vlib_hw_if_index)
          {
            if (cpu == i)       /* nothing to do */
-             return 0;
+             goto done;
 
            vec_del1 (dm->devices_by_hqos_cpu[i],
                      dq - dm->devices_by_hqos_cpu[i]);
@@ -703,12 +736,17 @@ set_dpdk_if_hqos_placement (vlib_main_t * vm, unformat_input_t * input,
            vec_sort_with_function (dm->devices_by_hqos_cpu[cpu],
                                    dpdk_device_queue_sort);
 
-           return 0;
+           goto done;
          }
       }
     }
 
-  return clib_error_return (0, "not found");
+  error = clib_error_return (0, "not found");
+
+done:
+  unformat_free (line_input);
+
+  return error;
 }
 
 /* *INDENT-OFF* */
@@ -732,6 +770,7 @@ set_dpdk_if_hqos_pipe (vlib_main_t * vm, unformat_input_t * input,
   u32 pipe_id = (u32) ~ 0;
   u32 profile_id = (u32) ~ 0;
   int rv;
+  clib_error_t *error = NULL;
 
   if (!unformat_user (input, unformat_line_input, line_input))
     return 0;
@@ -749,14 +788,18 @@ set_dpdk_if_hqos_pipe (vlib_main_t * vm, unformat_input_t * input,
       else if (unformat (line_input, "profile %d", &profile_id))
        ;
       else
-       return clib_error_return (0, "parse error: '%U'",
-                                 format_unformat_error, line_input);
+       {
+         error = clib_error_return (0, "parse error: '%U'",
+                                    format_unformat_error, line_input);
+         goto done;
+       }
     }
 
-  unformat_free (line_input);
-
   if (hw_if_index == (u32) ~ 0)
-    return clib_error_return (0, "please specify valid interface name");
+    {
+      error = clib_error_return (0, "please specify valid interface name");
+      goto done;
+    }
 
   hw = vnet_get_hw_interface (dm->vnet_main, hw_if_index);
   xd = vec_elt_at_index (dm->devices, hw->dev_instance);
@@ -765,9 +808,15 @@ set_dpdk_if_hqos_pipe (vlib_main_t * vm, unformat_input_t * input,
     rte_sched_pipe_config (xd->hqos_ht->hqos, subport_id, pipe_id,
                           profile_id);
   if (rv)
-    return clib_error_return (0, "pipe configuration failed");
+    {
+      error = clib_error_return (0, "pipe configuration failed");
+      goto done;
+    }
 
-  return 0;
+done:
+  unformat_free (line_input);
+
+  return error;
 }
 
 /* *INDENT-OFF* */
@@ -797,6 +846,7 @@ set_dpdk_if_hqos_subport (vlib_main_t * vm, unformat_input_t * input,
     .tc_period = 10,
   };
   int rv;
+  clib_error_t *error = NULL;
 
   if (!unformat_user (input, unformat_line_input, line_input))
     return 0;
@@ -829,23 +879,33 @@ set_dpdk_if_hqos_subport (vlib_main_t * vm, unformat_input_t * input,
       else if (unformat (line_input, "period %d", &p.tc_period))
        ;
       else
-       return clib_error_return (0, "parse error: '%U'",
-                                 format_unformat_error, line_input);
+       {
+         error = clib_error_return (0, "parse error: '%U'",
+                                    format_unformat_error, line_input);
+         goto done;
+       }
     }
 
-  unformat_free (line_input);
-
   if (hw_if_index == (u32) ~ 0)
-    return clib_error_return (0, "please specify valid interface name");
+    {
+      error = clib_error_return (0, "please specify valid interface name");
+      goto done;
+    }
 
   hw = vnet_get_hw_interface (dm->vnet_main, hw_if_index);
   xd = vec_elt_at_index (dm->devices, hw->dev_instance);
 
   rv = rte_sched_subport_config (xd->hqos_ht->hqos, subport_id, &p);
   if (rv)
-    return clib_error_return (0, "subport configuration failed");
+    {
+      error = clib_error_return (0, "subport configuration failed");
+      goto done;
+    }
 
-  return 0;
+done:
+  unformat_free (line_input);
+
+  return error;
 }
 
 /* *INDENT-OFF* */
@@ -872,6 +932,7 @@ set_dpdk_if_hqos_tctbl (vlib_main_t * vm, unformat_input_t * input,
   u32 queue = (u32) ~ 0;
   u32 entry = (u32) ~ 0;
   u32 val, i;
+  clib_error_t *error = NULL;
 
   if (!unformat_user (input, unformat_line_input, line_input))
     return 0;
@@ -889,20 +950,33 @@ set_dpdk_if_hqos_tctbl (vlib_main_t * vm, unformat_input_t * input,
       else if (unformat (line_input, "queue %d", &queue))
        ;
       else
-       return clib_error_return (0, "parse error: '%U'",
-                                 format_unformat_error, line_input);
+       {
+         error = clib_error_return (0, "parse error: '%U'",
+                                    format_unformat_error, line_input);
+         goto done;
+       }
     }
 
-  unformat_free (line_input);
-
   if (hw_if_index == (u32) ~ 0)
-    return clib_error_return (0, "please specify valid interface name");
+    {
+      error = clib_error_return (0, "please specify valid interface name");
+      goto done;
+    }
   if (entry >= 64)
-    return clib_error_return (0, "invalid entry");
+    {
+      error = clib_error_return (0, "invalid entry");
+      goto done;
+    }
   if (tc >= RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE)
-    return clib_error_return (0, "invalid traffic class");
+    {
+      error = clib_error_return (0, "invalid traffic class");
+      goto done;
+    }
   if (queue >= RTE_SCHED_QUEUES_PER_TRAFFIC_CLASS)
-    return clib_error_return (0, "invalid traffic class");
+    {
+      error = clib_error_return (0, "invalid traffic class");
+      goto done;
+    }
 
   hw = vnet_get_hw_interface (dm->vnet_main, hw_if_index);
   xd = vec_elt_at_index (dm->devices, hw->dev_instance);
@@ -911,7 +985,10 @@ set_dpdk_if_hqos_tctbl (vlib_main_t * vm, unformat_input_t * input,
   uword *p = hash_get_mem (tm->thread_registrations_by_name, "workers");
   /* Should never happen, shut up Coverity warning */
   if (p == 0)
-    return clib_error_return (0, "no worker registrations?");
+    {
+      error = clib_error_return (0, "no worker registrations?");
+      goto done;
+    }
 
   vlib_thread_registration_t *tr = (vlib_thread_registration_t *) p[0];
   int worker_thread_first = tr->first_index;
@@ -921,7 +998,10 @@ set_dpdk_if_hqos_tctbl (vlib_main_t * vm, unformat_input_t * input,
   for (i = 0; i < worker_thread_count; i++)
     xd->hqos_wt[worker_thread_first + i].hqos_tc_table[entry] = val;
 
-  return 0;
+done:
+  unformat_free (line_input);
+
+  return error;
 }
 
 /* *INDENT-OFF* */
@@ -939,6 +1019,7 @@ set_dpdk_if_hqos_pktfield (vlib_main_t * vm, unformat_input_t * input,
   unformat_input_t _line_input, *line_input = &_line_input;
   vlib_thread_main_t *tm = vlib_get_thread_main ();
   dpdk_main_t *dm = &dpdk_main;
+  clib_error_t *error = NULL;
 
   /* Device specific data */
   struct rte_eth_dev_info dev_info;
@@ -984,15 +1065,19 @@ set_dpdk_if_hqos_pktfield (vlib_main_t * vm, unformat_input_t * input,
       else if (unformat (line_input, "mask %llx", &mask))
        ;
       else
-       return clib_error_return (0, "parse error: '%U'",
-                                 format_unformat_error, line_input);
+       {
+         error = clib_error_return (0, "parse error: '%U'",
+                                    format_unformat_error, line_input);
+         goto done;
+       }
     }
 
-  unformat_free (line_input);
-
   /* Get interface */
   if (hw_if_index == (u32) ~ 0)
-    return clib_error_return (0, "please specify valid interface name");
+    {
+      error = clib_error_return (0, "please specify valid interface name");
+      goto done;
+    }
 
   hw = vnet_get_hw_interface (dm->vnet_main, hw_if_index);
   xd = vec_elt_at_index (dm->devices, hw->dev_instance);
@@ -1019,7 +1104,7 @@ set_dpdk_if_hqos_pktfield (vlib_main_t * vm, unformat_input_t * input,
   if (devconf->hqos_enabled == 0)
     {
       vlib_cli_output (vm, "HQoS disabled for this interface");
-      return 0;
+      goto done;
     }
 
   n_subports_per_port = devconf->hqos.port.n_subports_per_port;
@@ -1028,27 +1113,39 @@ set_dpdk_if_hqos_pktfield (vlib_main_t * vm, unformat_input_t * input,
 
   /* Validate packet field configuration: id, offset and mask */
   if (id >= 3)
-    return clib_error_return (0, "invalid packet field id");
+    {
+      error = clib_error_return (0, "invalid packet field id");
+      goto done;
+    }
 
   switch (id)
     {
     case 0:
       if (dpdk_hqos_validate_mask (mask, n_subports_per_port) != 0)
-       return clib_error_return (0, "invalid subport ID mask "
-                                 "(n_subports_per_port = %u)",
-                                 n_subports_per_port);
+       {
+         error = clib_error_return (0, "invalid subport ID mask "
+                                    "(n_subports_per_port = %u)",
+                                    n_subports_per_port);
+         goto done;
+       }
       break;
     case 1:
       if (dpdk_hqos_validate_mask (mask, n_pipes_per_subport) != 0)
-       return clib_error_return (0, "invalid pipe ID mask "
-                                 "(n_pipes_per_subport = %u)",
-                                 n_pipes_per_subport);
+       {
+         error = clib_error_return (0, "invalid pipe ID mask "
+                                    "(n_pipes_per_subport = %u)",
+                                    n_pipes_per_subport);
+         goto done;
+       }
       break;
     case 2:
     default:
       if (dpdk_hqos_validate_mask (mask, tctbl_size) != 0)
-       return clib_error_return (0, "invalid TC table index mask "
-                                 "(TC table size = %u)", tctbl_size);
+       {
+         error = clib_error_return (0, "invalid TC table index mask "
+                                    "(TC table size = %u)", tctbl_size);
+         goto done;
+       }
     }
 
   /* Propagate packet field configuration to all workers */
@@ -1075,7 +1172,10 @@ set_dpdk_if_hqos_pktfield (vlib_main_t * vm, unformat_input_t * input,
          __builtin_ctzll (mask);
       }
 
-  return 0;
+done:
+  unformat_free (line_input);
+
+  return error;
 }
 
 /* *INDENT-OFF* */
@@ -1106,6 +1206,7 @@ show_dpdk_if_hqos (vlib_main_t * vm, unformat_input_t * input,
   dpdk_device_config_t *devconf = 0;
   vlib_thread_registration_t *tr;
   uword *p = 0;
+  clib_error_t *error = NULL;
 
   if (!unformat_user (input, unformat_line_input, line_input))
     return 0;
@@ -1117,14 +1218,18 @@ show_dpdk_if_hqos (vlib_main_t * vm, unformat_input_t * input,
           &hw_if_index))
        ;
       else
-       return clib_error_return (0, "parse error: '%U'",
-                                 format_unformat_error, line_input);
+       {
+         error = clib_error_return (0, "parse error: '%U'",
+                                    format_unformat_error, line_input);
+         goto done;
+       }
     }
 
-  unformat_free (line_input);
-
   if (hw_if_index == (u32) ~ 0)
-    return clib_error_return (0, "please specify interface name!!");
+    {
+      error = clib_error_return (0, "please specify interface name!!");
+      goto done;
+    }
 
   hw = vnet_get_hw_interface (dm->vnet_main, hw_if_index);
   xd = vec_elt_at_index (dm->devices, hw->dev_instance);
@@ -1151,7 +1256,7 @@ show_dpdk_if_hqos (vlib_main_t * vm, unformat_input_t * input,
   if (devconf->hqos_enabled == 0)
     {
       vlib_cli_output (vm, "HQoS disabled for this interface");
-      return 0;
+      goto done;
     }
 
   /* Detect the set of worker threads */
@@ -1159,7 +1264,10 @@ show_dpdk_if_hqos (vlib_main_t * vm, unformat_input_t * input,
 
   /* Should never happen, shut up Coverity warning */
   if (p == 0)
-    return clib_error_return (0, "no worker registrations?");
+    {
+      error = clib_error_return (0, "no worker registrations?");
+      goto done;
+    }
 
   tr = (vlib_thread_registration_t *) p[0];
 
@@ -1284,7 +1392,10 @@ show_dpdk_if_hqos (vlib_main_t * vm, unformat_input_t * input,
     }
 #endif
 
-  return 0;
+done:
+  unformat_free (line_input);
+
+  return error;
 }
 
 /* *INDENT-OFF* */
@@ -1315,6 +1426,7 @@ show_dpdk_hqos_queue_stats (vlib_main_t * vm, unformat_input_t * input,
   u32 qindex;
   struct rte_sched_queue_stats stats;
   u16 qlen;
+  clib_error_t *error = NULL;
 
   if (!unformat_user (input, unformat_line_input, line_input))
     return 0;
@@ -1339,14 +1451,18 @@ show_dpdk_hqos_queue_stats (vlib_main_t * vm, unformat_input_t * input,
        ;
 
       else
-       return clib_error_return (0, "parse error: '%U'",
-                                 format_unformat_error, line_input);
+       {
+         error = clib_error_return (0, "parse error: '%U'",
+                                    format_unformat_error, line_input);
+         goto done;
+       }
     }
 
-  unformat_free (line_input);
-
   if (hw_if_index == (u32) ~ 0)
-    return clib_error_return (0, "please specify interface name!!");
+    {
+      error = clib_error_return (0, "please specify interface name!!");
+      goto done;
+    }
 
   hw = vnet_get_hw_interface (dm->vnet_main, hw_if_index);
   xd = vec_elt_at_index (dm->devices, hw->dev_instance);
@@ -1373,7 +1489,7 @@ show_dpdk_hqos_queue_stats (vlib_main_t * vm, unformat_input_t * input,
   if (devconf->hqos_enabled == 0)
     {
       vlib_cli_output (vm, "HQoS disabled for this interface");
-      return 0;
+      goto done;
     }
 
   /*
@@ -1386,7 +1502,10 @@ show_dpdk_hqos_queue_stats (vlib_main_t * vm, unformat_input_t * input,
 
   if (rte_sched_queue_read_stats (xd->hqos_ht->hqos, qindex, &stats, &qlen) !=
       0)
-    return clib_error_return (0, "failed to read stats");
+    {
+      error = clib_error_return (0, "failed to read stats");
+      goto done;
+    }
 
   vlib_cli_output (vm, "%=24s%=16s", "Stats Parameter", "Value");
   vlib_cli_output (vm, "%=24s%=16d", "Packets", stats.n_pkts);
@@ -1399,7 +1518,10 @@ show_dpdk_hqos_queue_stats (vlib_main_t * vm, unformat_input_t * input,
   vlib_cli_output (vm, "%=24s%=16d", "Bytes dropped", stats.n_bytes_dropped);
 
 
-  return 0;
+done:
+  unformat_free (line_input);
+
+  return error;
 }
 
 /* *INDENT-OFF* */
index 93df4a6..f9d3a5d 100644 (file)
@@ -111,6 +111,7 @@ lcore_cryptodev_map_fn (vlib_main_t * vm, unformat_input_t * input,
 {
   unformat_input_t _line_input, *line_input = &_line_input;
   u16 detail = 0;
+  clib_error_t *error = NULL;
 
   if (!unformat_user (input, unformat_line_input, line_input))
     return 0;
@@ -120,15 +121,19 @@ lcore_cryptodev_map_fn (vlib_main_t * vm, unformat_input_t * input,
       if (unformat (line_input, "verbose"))
        detail = 1;
       else
-       return clib_error_return (0, "parse error: '%U'",
-                                 format_unformat_error, line_input);
+       {
+         error = clib_error_return (0, "parse error: '%U'",
+                                    format_unformat_error, line_input);
+         goto done;
+       }
     }
 
-  unformat_free (line_input);
-
   dpdk_ipsec_show_mapping (vm, detail);
 
-  return 0;
+done:
+  unformat_free (line_input);
+
+  return error;
 }
 
 /* *INDENT-OFF* */
index 6157f27..7136329 100644 (file)
@@ -37,6 +37,7 @@ netmap_create_command_fn (vlib_main_t * vm, unformat_input_t * input,
   u8 is_pipe = 0;
   u8 is_master = 0;
   u32 sw_if_index = ~0;
+  clib_error_t *error = NULL;
 
   /* Get a line of input. */
   if (!unformat_user (input, unformat_line_input, line_input))
@@ -57,30 +58,48 @@ netmap_create_command_fn (vlib_main_t * vm, unformat_input_t * input,
       else if (unformat (line_input, "slave"))
        is_master = 0;
       else
-       return clib_error_return (0, "unknown input `%U'",
-                                 format_unformat_error, input);
+       {
+         error = clib_error_return (0, "unknown input `%U'",
+                                    format_unformat_error, line_input);
+         goto done;
+       }
     }
-  unformat_free (line_input);
 
   if (host_if_name == NULL)
-    return clib_error_return (0, "missing host interface name");
+    {
+      error = clib_error_return (0, "missing host interface name");
+      goto done;
+    }
 
   r =
     netmap_create_if (vm, host_if_name, hw_addr_ptr, is_pipe, is_master,
                      &sw_if_index);
 
   if (r == VNET_API_ERROR_SYSCALL_ERROR_1)
-    return clib_error_return (0, "%s (errno %d)", strerror (errno), errno);
+    {
+      error = clib_error_return (0, "%s (errno %d)", strerror (errno), errno);
+      goto done;
+    }
 
   if (r == VNET_API_ERROR_INVALID_INTERFACE)
-    return clib_error_return (0, "Invalid interface name");
+    {
+      error = clib_error_return (0, "Invalid interface name");
+      goto done;
+    }
 
   if (r == VNET_API_ERROR_SUBIF_ALREADY_EXISTS)
-    return clib_error_return (0, "Interface already exists");
+    {
+      error = clib_error_return (0, "Interface already exists");
+      goto done;
+    }
 
   vlib_cli_output (vm, "%U\n", format_vnet_sw_if_index_name, vnet_get_main (),
                   sw_if_index);
-  return 0;
+
+done:
+  unformat_free (line_input);
+
+  return error;
 }
 
 /*?
@@ -144,6 +163,7 @@ netmap_delete_command_fn (vlib_main_t * vm, unformat_input_t * input,
 {
   unformat_input_t _line_input, *line_input = &_line_input;
   u8 *host_if_name = NULL;
+  clib_error_t *error = NULL;
 
   /* Get a line of input. */
   if (!unformat_user (input, unformat_line_input, line_input))
@@ -154,17 +174,25 @@ netmap_delete_command_fn (vlib_main_t * vm, unformat_input_t * input,
       if (unformat (line_input, "name %s", &host_if_name))
        ;
       else
-       return clib_error_return (0, "unknown input `%U'",
-                                 format_unformat_error, input);
+       {
+         error = clib_error_return (0, "unknown input `%U'",
+                                    format_unformat_error, line_input);
+         goto done;
+       }
     }
-  unformat_free (line_input);
 
   if (host_if_name == NULL)
-    return clib_error_return (0, "missing host interface name");
+    {
+      error = clib_error_return (0, "missing host interface name");
+      goto done;
+    }
 
   netmap_delete_if (vm, host_if_name);
 
-  return 0;
+done:
+  unformat_free (line_input);
+
+  return error;
 }
 
 /*?
index 315daa7..c43f6e6 100644 (file)
@@ -2682,6 +2682,7 @@ vhost_user_connect_command_fn (vlib_main_t * vm,
   u32 custom_dev_instance = ~0;
   u8 hwaddr[6];
   u8 *hw = NULL;
+  clib_error_t *error = NULL;
 
   /* Get a line of input. */
   if (!unformat_user (input, unformat_line_input, line_input))
@@ -2704,10 +2705,12 @@ vhost_user_connect_command_fn (vlib_main_t * vm,
          renumber = 1;
        }
       else
-       return clib_error_return (0, "unknown input `%U'",
-                                 format_unformat_error, input);
+       {
+         error = clib_error_return (0, "unknown input `%U'",
+                                    format_unformat_error, line_input);
+         goto done;
+       }
     }
-  unformat_free (line_input);
 
   vnet_main_t *vnm = vnet_get_main ();
 
@@ -2716,14 +2719,18 @@ vhost_user_connect_command_fn (vlib_main_t * vm,
                                  is_server, &sw_if_index, feature_mask,
                                  renumber, custom_dev_instance, hw)))
     {
-      vec_free (sock_filename);
-      return clib_error_return (0, "vhost_user_create_if returned %d", rv);
+      error = clib_error_return (0, "vhost_user_create_if returned %d", rv);
+      goto done;
     }
 
-  vec_free (sock_filename);
   vlib_cli_output (vm, "%U\n", format_vnet_sw_if_index_name, vnet_get_main (),
                   sw_if_index);
-  return 0;
+
+done:
+  vec_free (sock_filename);
+  unformat_free (line_input);
+
+  return error;
 }
 
 clib_error_t *
@@ -2734,6 +2741,7 @@ vhost_user_delete_command_fn (vlib_main_t * vm,
   unformat_input_t _line_input, *line_input = &_line_input;
   u32 sw_if_index = ~0;
   vnet_main_t *vnm = vnet_get_main ();
+  clib_error_t *error = NULL;
 
   /* Get a line of input. */
   if (!unformat_user (input, unformat_line_input, line_input))
@@ -2751,15 +2759,25 @@ vhost_user_delete_command_fn (vlib_main_t * vm,
            vnet_get_sup_hw_interface (vnm, sw_if_index);
          if (hwif == NULL ||
              vhost_user_dev_class.index != hwif->dev_class_index)
-           return clib_error_return (0, "Not a vhost interface");
+           {
+             error = clib_error_return (0, "Not a vhost interface");
+             goto done;
+           }
        }
       else
-       return clib_error_return (0, "unknown input `%U'",
-                                 format_unformat_error, input);
+       {
+         error = clib_error_return (0, "unknown input `%U'",
+                                    format_unformat_error, line_input);
+         goto done;
+       }
     }
-  unformat_free (line_input);
+
   vhost_user_delete_if (vnm, vm, sw_if_index);
-  return 0;
+
+done:
+  unformat_free (line_input);
+
+  return error;
 }
 
 int
@@ -3286,6 +3304,7 @@ vhost_thread_command_fn (vlib_main_t * vm,
   u32 sw_if_index;
   u8 del = 0;
   int rv;
+  clib_error_t *error = NULL;
 
   /* Get a line of input. */
   if (!unformat_user (input, unformat_line_input, line_input))
@@ -3295,9 +3314,9 @@ vhost_thread_command_fn (vlib_main_t * vm,
       (line_input, "%U %d", unformat_vnet_sw_interface, vnet_get_main (),
        &sw_if_index, &worker_thread_index))
     {
-      unformat_free (line_input);
-      return clib_error_return (0, "unknown input `%U'",
-                               format_unformat_error, input);
+      error = clib_error_return (0, "unknown input `%U'",
+                                format_unformat_error, line_input);
+      goto done;
     }
 
   if (unformat (line_input, "del"))
@@ -3305,9 +3324,16 @@ vhost_thread_command_fn (vlib_main_t * vm,
 
   if ((rv =
        vhost_user_thread_placement (sw_if_index, worker_thread_index, del)))
-    return clib_error_return (0, "vhost_user_thread_placement returned %d",
-                             rv);
-  return 0;
+    {
+      error = clib_error_return (0, "vhost_user_thread_placement returned %d",
+                                rv);
+      goto done;
+    }
+
+done:
+  unformat_free (line_input);
+
+  return error;
 }
 
 
index d624587..d4476ac 100644 (file)
@@ -491,6 +491,7 @@ create_gre_tunnel_command_fn (vlib_main_t * vm,
   u32 num_m_args = 0;
   u8 is_add = 1;
   u32 sw_if_index;
+  clib_error_t *error = NULL;
 
   /* Get a line of input. */
   if (! unformat_user (input, unformat_line_input, line_input))
@@ -508,16 +509,24 @@ create_gre_tunnel_command_fn (vlib_main_t * vm,
     else if (unformat (line_input, "teb"))
       teb = 1;
     else
-      return clib_error_return (0, "unknown input `%U'",
-                                format_unformat_error, input);
+      {
+        error = clib_error_return (0, "unknown input `%U'",
+                                   format_unformat_error, line_input);
+        goto done;
+      }
   }
-  unformat_free (line_input);
 
   if (num_m_args < 2)
-      return clib_error_return (0, "mandatory argument(s) missing");
+    {
+      error = clib_error_return (0, "mandatory argument(s) missing");
+      goto done;
+    }
 
   if (memcmp (&src, &dst, sizeof(src)) == 0)
-      return clib_error_return (0, "src and dst are identical");
+    {
+      error = clib_error_return (0, "src and dst are identical");
+      goto done;
+    }
 
   memset (a, 0, sizeof (*a));
   a->outer_fib_id = outer_fib_id;
@@ -536,15 +545,21 @@ create_gre_tunnel_command_fn (vlib_main_t * vm,
       vlib_cli_output(vm, "%U\n", format_vnet_sw_if_index_name, vnet_get_main(), sw_if_index);
       break;
     case VNET_API_ERROR_INVALID_VALUE:
-      return clib_error_return (0, "GRE tunnel already exists...");
+      error = clib_error_return (0, "GRE tunnel already exists...");
+      goto done;
     case VNET_API_ERROR_NO_SUCH_FIB:
-      return clib_error_return (0, "outer fib ID %d doesn't exist\n",
-                                outer_fib_id);
+      error = clib_error_return (0, "outer fib ID %d doesn't exist\n",
+                                 outer_fib_id);
+      goto done;
     default:
-      return clib_error_return (0, "vnet_gre_add_del_tunnel returned %d", rv);
+      error = clib_error_return (0, "vnet_gre_add_del_tunnel returned %d", rv);
+      goto done;
     }
 
-  return 0;
+done:
+  unformat_free (line_input);
+
+  return error;
 }
 
 VLIB_CLI_COMMAND (create_gre_tunnel_command, static) = {
index d461cc8..3af32f2 100644 (file)
@@ -399,6 +399,8 @@ set_ip_source_check (vlib_main_t * vm,
   vnet_feature_enable_disable ("ip4-unicast", feature_name, sw_if_index,
                               is_del == 0, &config, sizeof (config));
 done:
+  unformat_free (line_input);
+
   return error;
 }
 
@@ -531,7 +533,9 @@ ip_source_check_accept (vlib_main_t * vm,
     }
 
 done:
-  return (error);
+  unformat_free (line_input);
+
+  return error;
 }
 
 /*?
index 45d1711..73dabfd 100644 (file)
@@ -143,8 +143,11 @@ thrash (vlib_main_t * vm,
          else if (unformat (line_input, "verbose"))
            verbose = 1;
          else
-           return clib_error_return (0, "unknown input `%U'",
-                                     format_unformat_error, line_input);
+           {
+             error = clib_error_return (0, "unknown input `%U'",
+                                        format_unformat_error, line_input);
+             goto done;
+           }
        }
     }
 
@@ -178,7 +181,7 @@ thrash (vlib_main_t * vm,
   if (p == 0)
     {
       vlib_cli_output (vm, "Couldn't map fib id %d to fib index\n", table_id);
-      return 0;
+      goto done;
     }
   table_index = p[0];
 
@@ -294,7 +297,11 @@ thrash (vlib_main_t * vm,
 
       pool_free (tm->route_pool);
     }
-  return 0;
+
+done:
+  unformat_free (line_input);
+
+  return error;
 }
 
 /*?
index 7229591..6b53137 100644 (file)
@@ -2923,7 +2923,10 @@ ip6_neighbor_cmd (vlib_main_t * vm, unformat_input_t * main_input,
       else if (unformat (line_input, "ra-lifetime"))
        {
          if (!unformat (line_input, "%d", &ra_lifetime))
-           return (error = unformat_parse_error (line_input));
+           {
+             error = unformat_parse_error (line_input);
+             goto done;
+           }
          use_lifetime = 1;
          break;
        }
@@ -2931,13 +2934,19 @@ ip6_neighbor_cmd (vlib_main_t * vm, unformat_input_t * main_input,
        {
          if (!unformat
              (line_input, "%d %d", &ra_initial_count, &ra_initial_interval))
-           return (error = unformat_parse_error (line_input));
+           {
+             error = unformat_parse_error (line_input);
+             goto done;
+           }
          break;
        }
       else if (unformat (line_input, "ra-interval"))
        {
          if (!unformat (line_input, "%d", &ra_max_interval))
-           return (error = unformat_parse_error (line_input));
+           {
+             error = unformat_parse_error (line_input);
+             goto done;
+           }
 
          if (!unformat (line_input, "%d", &ra_min_interval))
            ra_min_interval = 0;
@@ -2949,7 +2958,10 @@ ip6_neighbor_cmd (vlib_main_t * vm, unformat_input_t * main_input,
          break;
        }
       else
-       return (unformat_parse_error (line_input));
+       {
+         error = unformat_parse_error (line_input);
+         goto done;
+       }
     }
 
   if (add_radv_info)
@@ -3006,7 +3018,10 @@ ip6_neighbor_cmd (vlib_main_t * vm, unformat_input_t * main_input,
          else if (unformat (line_input, "no-onlink"))
            no_onlink = 1;
          else
-           return (unformat_parse_error (line_input));
+           {
+             error = unformat_parse_error (line_input);
+             goto done;
+           }
        }
 
       ip6_neighbor_ra_prefix (vm, sw_if_index,
@@ -3018,9 +3033,9 @@ ip6_neighbor_cmd (vlib_main_t * vm, unformat_input_t * main_input,
                              off_link, no_autoconfig, no_onlink, is_no);
     }
 
+done:
   unformat_free (line_input);
 
-done:
   return error;
 }
 
index 0ef0e7a..807b87b 100644 (file)
@@ -568,8 +568,6 @@ vnet_ip_route_cmd (vlib_main_t * vm,
        }
     }
 
-  unformat_free (line_input);
-
   if (vec_len (prefixs) == 0)
     {
       error =
@@ -704,6 +702,7 @@ done:
   vec_free (dpos);
   vec_free (prefixs);
   vec_free (rpaths);
+  unformat_free (line_input);
   return error;
 }
 
@@ -872,8 +871,6 @@ vnet_ip_mroute_cmd (vlib_main_t * vm,
        }
     }
 
-  unformat_free (line_input);
-
   if (~0 == table_id)
     {
       /*
@@ -970,6 +967,8 @@ vnet_ip_mroute_cmd (vlib_main_t * vm,
                     (scount * gcount) / (timet[1] - timet[0]));
 
 done:
+  unformat_free (line_input);
+
   return error;
 }
 
@@ -1149,24 +1148,37 @@ probe_neighbor_address (vlib_main_t * vm,
          is_ip4 = 0;
        }
       else
-       return clib_error_return (0, "unknown input '%U'",
-                                 format_unformat_error, line_input);
+       {
+         error = clib_error_return (0, "unknown input '%U'",
+                                    format_unformat_error, line_input);
+         goto done;
+       }
     }
 
-  unformat_free (line_input);
-
   if (sw_if_index == ~0)
-    return clib_error_return (0, "Interface required, not set.");
+    {
+      error = clib_error_return (0, "Interface required, not set.");
+      goto done;
+    }
   if (address_set == 0)
-    return clib_error_return (0, "ip address required, not set.");
+    {
+      error = clib_error_return (0, "ip address required, not set.");
+      goto done;
+    }
   if (address_set > 1)
-    return clib_error_return (0, "Multiple ip addresses not supported.");
+    {
+      error = clib_error_return (0, "Multiple ip addresses not supported.");
+      goto done;
+    }
 
   if (is_ip4)
     error = ip4_probe_neighbor_wait (vm, &a4, sw_if_index, retry_count);
   else
     error = ip6_probe_neighbor_wait (vm, &a6, sw_if_index, retry_count);
 
+done:
+  unformat_free (line_input);
+
   return error;
 }
 
index 3b6e4ac..0772ce7 100644 (file)
@@ -232,6 +232,7 @@ create_ipsec_gre_tunnel_command_fn (vlib_main_t * vm,
   vnet_ipsec_gre_add_del_tunnel_args_t _a, *a = &_a;
   int rv;
   u32 sw_if_index;
+  clib_error_t *error = NULL;
 
   /* Get a line of input. */
   if (!unformat_user (input, unformat_line_input, line_input))
@@ -250,16 +251,24 @@ create_ipsec_gre_tunnel_command_fn (vlib_main_t * vm,
       else if (unformat (line_input, "remote-sa %d", &rsa))
        num_m_args++;
       else
-       return clib_error_return (0, "unknown input `%U'",
-                                 format_unformat_error, input);
+       {
+         error = clib_error_return (0, "unknown input `%U'",
+                                    format_unformat_error, line_input);
+         goto done;
+       }
     }
-  unformat_free (line_input);
 
   if (num_m_args < 4)
-    return clib_error_return (0, "mandatory argument(s) missing");
+    {
+      error = clib_error_return (0, "mandatory argument(s) missing");
+      goto done;
+    }
 
   if (memcmp (&src, &dst, sizeof (src)) == 0)
-    return clib_error_return (0, "src and dst are identical");
+    {
+      error = clib_error_return (0, "src and dst are identical");
+      goto done;
+    }
 
   memset (a, 0, sizeof (*a));
   a->is_add = is_add;
@@ -277,14 +286,19 @@ create_ipsec_gre_tunnel_command_fn (vlib_main_t * vm,
                       vnet_get_main (), sw_if_index);
       break;
     case VNET_API_ERROR_INVALID_VALUE:
-      return clib_error_return (0, "GRE tunnel already exists...");
+      error = clib_error_return (0, "GRE tunnel already exists...");
+      goto done;
     default:
-      return clib_error_return (0,
-                               "vnet_ipsec_gre_add_del_tunnel returned %d",
-                               rv);
+      error = clib_error_return (0,
+                                "vnet_ipsec_gre_add_del_tunnel returned %d",
+                                rv);
+      goto done;
     }
 
-  return 0;
+done:
+  unformat_free (line_input);
+
+  return error;
 }
 
 /* *INDENT-OFF* */
index 3c1e26f..0e03440 100644 (file)
@@ -32,6 +32,7 @@ set_interface_spd_command_fn (vlib_main_t * vm,
   u32 sw_if_index = (u32) ~ 0;
   u32 spd_id;
   int is_add = 1;
+  clib_error_t *error = NULL;
 
   if (!unformat_user (input, unformat_line_input, line_input))
     return 0;
@@ -43,14 +44,18 @@ set_interface_spd_command_fn (vlib_main_t * vm,
   else if (unformat (line_input, "del"))
     is_add = 0;
   else
-    return clib_error_return (0, "parse error: '%U'",
-                             format_unformat_error, line_input);
-
-  unformat_free (line_input);
+    {
+      error = clib_error_return (0, "parse error: '%U'",
+                                format_unformat_error, line_input);
+      goto done;
+    }
 
   ipsec_set_interface_spd (vm, sw_if_index, spd_id, is_add);
 
-  return 0;
+done:
+  unformat_free (line_input);
+
+  return error;
 }
 
 /* *INDENT-OFF* */
@@ -72,7 +77,7 @@ ipsec_sa_add_del_command_fn (vlib_main_t * vm,
   ipsec_sa_t sa;
   int is_add = ~0;
   u8 *ck = 0, *ik = 0;
-  clib_error_t *err = 0;
+  clib_error_t *error = NULL;
 
   memset (&sa, 0, sizeof (sa));
 
@@ -90,8 +95,11 @@ ipsec_sa_add_del_command_fn (vlib_main_t * vm,
       else if (unformat (line_input, "esp"))
        sa.protocol = IPSEC_PROTOCOL_ESP;
       else if (unformat (line_input, "ah"))
-       //sa.protocol = IPSEC_PROTOCOL_AH;
-       return clib_error_return (0, "unsupported security protocol 'AH'");
+       {
+         //sa.protocol = IPSEC_PROTOCOL_AH;
+         error = clib_error_return (0, "unsupported security protocol 'AH'");
+         goto done;
+       }
       else
        if (unformat (line_input, "crypto-key %U", unformat_hex_string, &ck))
        sa.crypto_key_len = vec_len (ck);
@@ -102,8 +110,12 @@ ipsec_sa_add_del_command_fn (vlib_main_t * vm,
        {
          if (sa.crypto_alg < IPSEC_CRYPTO_ALG_AES_CBC_128 ||
              sa.crypto_alg >= IPSEC_CRYPTO_N_ALG)
-           return clib_error_return (0, "unsupported crypto-alg: '%U'",
-                                     format_ipsec_crypto_alg, sa.crypto_alg);
+           {
+             error = clib_error_return (0, "unsupported crypto-alg: '%U'",
+                                        format_ipsec_crypto_alg,
+                                        sa.crypto_alg);
+             goto done;
+           }
        }
       else
        if (unformat (line_input, "integ-key %U", unformat_hex_string, &ik))
@@ -113,8 +125,12 @@ ipsec_sa_add_del_command_fn (vlib_main_t * vm,
        {
          if (sa.integ_alg < IPSEC_INTEG_ALG_SHA1_96 ||
              sa.integ_alg >= IPSEC_INTEG_N_ALG)
-           return clib_error_return (0, "unsupported integ-alg: '%U'",
-                                     format_ipsec_integ_alg, sa.integ_alg);
+           {
+             error = clib_error_return (0, "unsupported integ-alg: '%U'",
+                                        format_ipsec_integ_alg,
+                                        sa.integ_alg);
+             goto done;
+           }
        }
       else if (unformat (line_input, "tunnel-src %U",
                         unformat_ip4_address, &sa.tunnel_src_addr.ip4))
@@ -135,12 +151,13 @@ ipsec_sa_add_del_command_fn (vlib_main_t * vm,
          sa.is_tunnel_ip6 = 1;
        }
       else
-       return clib_error_return (0, "parse error: '%U'",
-                                 format_unformat_error, line_input);
+       {
+         error = clib_error_return (0, "parse error: '%U'",
+                                    format_unformat_error, line_input);
+         goto done;
+       }
     }
 
-  unformat_free (line_input);
-
   if (sa.crypto_key_len > sizeof (sa.crypto_key))
     sa.crypto_key_len = sizeof (sa.crypto_key);
 
@@ -156,14 +173,17 @@ ipsec_sa_add_del_command_fn (vlib_main_t * vm,
   if (is_add)
     {
       ASSERT (im->cb.check_support_cb);
-      err = im->cb.check_support_cb (&sa);
-      if (err)
-       return err;
+      error = im->cb.check_support_cb (&sa);
+      if (error)
+       goto done;
     }
 
   ipsec_add_del_sa (vm, &sa, is_add);
 
-  return 0;
+done:
+  unformat_free (line_input);
+
+  return error;
 }
 
 /* *INDENT-OFF* */
@@ -183,6 +203,7 @@ ipsec_spd_add_del_command_fn (vlib_main_t * vm,
   unformat_input_t _line_input, *line_input = &_line_input;
   u32 spd_id = ~0;
   int is_add = ~0;
+  clib_error_t *error = NULL;
 
   if (!unformat_user (input, unformat_line_input, line_input))
     return 0;
@@ -196,18 +217,25 @@ ipsec_spd_add_del_command_fn (vlib_main_t * vm,
       else if (unformat (line_input, "%u", &spd_id))
        ;
       else
-       return clib_error_return (0, "parse error: '%U'",
-                                 format_unformat_error, line_input);
+       {
+         error = clib_error_return (0, "parse error: '%U'",
+                                    format_unformat_error, line_input);
+         goto done;
+       }
     }
 
-  unformat_free (line_input);
-
   if (spd_id == ~0)
-    return clib_error_return (0, "please specify SPD ID");
+    {
+      error = clib_error_return (0, "please specify SPD ID");
+      goto done;
+    }
 
   ipsec_add_del_spd (vm, spd_id, is_add);
 
-  return 0;
+done:
+  unformat_free (line_input);
+
+  return error;
 }
 
 /* *INDENT-OFF* */
@@ -230,6 +258,7 @@ ipsec_policy_add_del_command_fn (vlib_main_t * vm,
   int is_add = 0;
   int is_ip_any = 1;
   u32 tmp, tmp2;
+  clib_error_t *error = NULL;
 
   memset (&p, 0, sizeof (p));
   p.lport.stop = p.rport.stop = ~0;
@@ -262,7 +291,10 @@ ipsec_policy_add_del_command_fn (vlib_main_t * vm,
             &p.policy))
        {
          if (p.policy == IPSEC_POLICY_ACTION_RESOLVE)
-           return clib_error_return (0, "unsupported action: 'resolve'");
+           {
+             error = clib_error_return (0, "unsupported action: 'resolve'");
+             goto done;
+           }
        }
       else if (unformat (line_input, "sa %u", &p.sa_id))
        ;
@@ -300,19 +332,24 @@ ipsec_policy_add_del_command_fn (vlib_main_t * vm,
          p.rport.stop = tmp2;
        }
       else
-       return clib_error_return (0, "parse error: '%U'",
-                                 format_unformat_error, line_input);
+       {
+         error = clib_error_return (0, "parse error: '%U'",
+                                    format_unformat_error, line_input);
+         goto done;
+       }
     }
 
-  unformat_free (line_input);
-
   ipsec_add_del_policy (vm, &p, is_add);
   if (is_ip_any)
     {
       p.is_ipv6 = 1;
       ipsec_add_del_policy (vm, &p, is_add);
     }
-  return 0;
+
+done:
+  unformat_free (line_input);
+
+  return error;
 }
 
 /* *INDENT-OFF* */
@@ -332,6 +369,7 @@ set_ipsec_sa_key_command_fn (vlib_main_t * vm,
   unformat_input_t _line_input, *line_input = &_line_input;
   ipsec_sa_t sa;
   u8 *ck = 0, *ik = 0;
+  clib_error_t *error = NULL;
 
   memset (&sa, 0, sizeof (sa));
 
@@ -349,12 +387,13 @@ set_ipsec_sa_key_command_fn (vlib_main_t * vm,
        if (unformat (line_input, "integ-key %U", unformat_hex_string, &ik))
        sa.integ_key_len = vec_len (ik);
       else
-       return clib_error_return (0, "parse error: '%U'",
-                                 format_unformat_error, line_input);
+       {
+         error = clib_error_return (0, "parse error: '%U'",
+                                    format_unformat_error, line_input);
+         goto done;
+       }
     }
 
-  unformat_free (line_input);
-
   if (sa.crypto_key_len > sizeof (sa.crypto_key))
     sa.crypto_key_len = sizeof (sa.crypto_key);
 
@@ -369,7 +408,10 @@ set_ipsec_sa_key_command_fn (vlib_main_t * vm,
 
   ipsec_set_sa_key (vm, &sa);
 
-  return 0;
+done:
+  unformat_free (line_input);
+
+  return error;
 }
 
 /* *INDENT-OFF* */
@@ -649,6 +691,7 @@ create_ipsec_tunnel_command_fn (vlib_main_t * vm,
   ipsec_add_del_tunnel_args_t a;
   int rv;
   u32 num_m_args = 0;
+  clib_error_t *error = NULL;
 
   memset (&a, 0, sizeof (a));
   a.is_add = 1;
@@ -673,13 +716,18 @@ create_ipsec_tunnel_command_fn (vlib_main_t * vm,
       else if (unformat (line_input, "del"))
        a.is_add = 0;
       else
-       return clib_error_return (0, "unknown input `%U'",
-                                 format_unformat_error, input);
+       {
+         error = clib_error_return (0, "unknown input `%U'",
+                                    format_unformat_error, line_input);
+         goto done;
+       }
     }
-  unformat_free (line_input);
 
   if (num_m_args < 4)
-    return clib_error_return (0, "mandatory argument(s) missing");
+    {
+      error = clib_error_return (0, "mandatory argument(s) missing");
+      goto done;
+    }
 
   rv = ipsec_add_del_tunnel_if (&a);
 
@@ -689,16 +737,21 @@ create_ipsec_tunnel_command_fn (vlib_main_t * vm,
       break;
     case VNET_API_ERROR_INVALID_VALUE:
       if (a.is_add)
-       return clib_error_return (0,
-                                 "IPSec tunnel interface already exists...");
+       error = clib_error_return (0,
+                                  "IPSec tunnel interface already exists...");
       else
-       return clib_error_return (0, "IPSec tunnel interface not exists...");
+       error = clib_error_return (0, "IPSec tunnel interface not exists...");
+      goto done;
     default:
-      return clib_error_return (0, "ipsec_register_interface returned %d",
-                               rv);
+      error = clib_error_return (0, "ipsec_register_interface returned %d",
+                                rv);
+      goto done;
     }
 
-  return 0;
+done:
+  unformat_free (line_input);
+
+  return error;
 }
 
 /* *INDENT-OFF* */
@@ -720,6 +773,7 @@ set_interface_key_command_fn (vlib_main_t * vm,
   u32 hw_if_index = (u32) ~ 0;
   u32 alg;
   u8 *key = 0;
+  clib_error_t *error = NULL;
 
   if (!unformat_user (input, unformat_line_input, line_input))
     return 0;
@@ -748,25 +802,38 @@ set_interface_key_command_fn (vlib_main_t * vm,
       else if (unformat (line_input, "%U", unformat_hex_string, &key))
        ;
       else
-       return clib_error_return (0, "parse error: '%U'",
-                                 format_unformat_error, line_input);
+       {
+         error = clib_error_return (0, "parse error: '%U'",
+                                    format_unformat_error, line_input);
+         goto done;
+       }
     }
 
-  unformat_free (line_input);
-
   if (type == IPSEC_IF_SET_KEY_TYPE_NONE)
-    return clib_error_return (0, "unknown key type");
+    {
+      error = clib_error_return (0, "unknown key type");
+      goto done;
+    }
 
   if (alg > 0 && vec_len (key) == 0)
-    return clib_error_return (0, "key is not specified");
+    {
+      error = clib_error_return (0, "key is not specified");
+      goto done;
+    }
 
   if (hw_if_index == (u32) ~ 0)
-    return clib_error_return (0, "interface not specified");
+    {
+      error = clib_error_return (0, "interface not specified");
+      goto done;
+    }
 
   ipsec_set_interface_key (im->vnet_main, hw_if_index, type, alg, key);
+
+done:
   vec_free (key);
+  unformat_free (line_input);
 
-  return 0;
+  return error;
 }
 
 /* *INDENT-OFF* */
index 5e4691f..ff3d2f3 100644 (file)
@@ -315,6 +315,7 @@ test_patch_command_fn (vlib_main_t * vm,
   int rx_set = 0;
   int tx_set = 0;
   int is_add = 1;
+  clib_error_t *error = NULL;
 
   /* Get a line of input. */
   if (!unformat_user (input, unformat_line_input, line_input))
@@ -335,10 +336,16 @@ test_patch_command_fn (vlib_main_t * vm,
     }
 
   if (rx_set == 0)
-    return clib_error_return (0, "rx interface not set");
+    {
+      error = clib_error_return (0, "rx interface not set");
+      goto done;
+    }
 
   if (tx_set == 0)
-    return clib_error_return (0, "tx interface not set");
+    {
+      error = clib_error_return (0, "tx interface not set");
+      goto done;
+    }
 
   rv = vnet_l2_patch_add_del (rx_sw_if_index, tx_sw_if_index, is_add);
 
@@ -348,17 +355,24 @@ test_patch_command_fn (vlib_main_t * vm,
       break;
 
     case VNET_API_ERROR_INVALID_SW_IF_INDEX:
-      return clib_error_return (0, "rx interface not a physical port");
+      error = clib_error_return (0, "rx interface not a physical port");
+      goto done;
 
     case VNET_API_ERROR_INVALID_SW_IF_INDEX_2:
-      return clib_error_return (0, "tx interface not a physical port");
+      error = clib_error_return (0, "tx interface not a physical port");
+      goto done;
 
     default:
-      return clib_error_return
+      error = clib_error_return
        (0, "WARNING: vnet_l2_patch_add_del returned %d", rv);
+      goto done;
     }
 
-  return 0;
+
+done:
+  unformat_free (line_input);
+
+  return error;
 }
 
 /*?
index 70610a8..d08a5d8 100644 (file)
@@ -409,6 +409,7 @@ set_l2_xcrw_command_fn (vlib_main_t * vm,
   u8 *rw = 0;
   vnet_main_t *vnm = vnet_get_main ();
   int rv;
+  clib_error_t *error = NULL;
 
 
   if (!unformat_user (input, unformat_line_input, line_input))
@@ -416,8 +417,11 @@ set_l2_xcrw_command_fn (vlib_main_t * vm,
 
   if (!unformat (line_input, "%U",
                 unformat_vnet_sw_interface, vnm, &l2_sw_if_index))
-    return clib_error_return (0, "unknown input '%U'",
-                             format_unformat_error, line_input);
+    {
+      error = clib_error_return (0, "unknown input '%U'",
+                                format_unformat_error, line_input);
+      goto done;
+    }
 
   while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
     {
@@ -436,7 +440,10 @@ set_l2_xcrw_command_fn (vlib_main_t * vm,
     }
 
   if (next_node_index == ~0)
-    return clib_error_return (0, "next node not specified");
+    {
+      error = clib_error_return (0, "next node not specified");
+      goto done;
+    }
 
   if (tx_fib_id != ~0)
     {
@@ -448,7 +455,11 @@ set_l2_xcrw_command_fn (vlib_main_t * vm,
        p = hash_get (ip4_main.fib_index_by_table_id, tx_fib_id);
 
       if (p == 0)
-       return clib_error_return (0, "nonexistent tx_fib_id %d", tx_fib_id);
+       {
+         error =
+           clib_error_return (0, "nonexistent tx_fib_id %d", tx_fib_id);
+         goto done;
+       }
 
       tx_fib_index = p[0];
     }
@@ -463,16 +474,21 @@ set_l2_xcrw_command_fn (vlib_main_t * vm,
       break;
 
     case VNET_API_ERROR_INVALID_SW_IF_INDEX:
-      return clib_error_return (0, "%U not cross-connected",
-                               format_vnet_sw_if_index_name,
-                               vnm, l2_sw_if_index);
+      error = clib_error_return (0, "%U not cross-connected",
+                                format_vnet_sw_if_index_name,
+                                vnm, l2_sw_if_index);
+      goto done;
+
     default:
-      return clib_error_return (0, "vnet_configure_l2_xcrw returned %d", rv);
+      error = clib_error_return (0, "vnet_configure_l2_xcrw returned %d", rv);
+      goto done;
     }
 
+done:
   vec_free (rw);
+  unformat_free (line_input);
 
-  return 0;
+  return error;
 }
 
 /*?
index a4531da..2d32339 100644 (file)
@@ -427,6 +427,7 @@ create_l2tpv3_tunnel_command_fn (vlib_main_t * vm,
   u32 sw_if_index;
   u32 encap_fib_id = ~0;
   u32 encap_fib_index = ~0;
+  clib_error_t *error = NULL;
 
   /* Get a line of input. */
   if (!unformat_user (input, unformat_line_input, line_input))
@@ -455,18 +456,22 @@ create_l2tpv3_tunnel_command_fn (vlib_main_t * vm,
       else if (unformat (line_input, "l2-sublayer-present"))
        l2_sublayer_present = 1;
       else
-       return clib_error_return (0, "parse error: '%U'",
-                                 format_unformat_error, line_input);
+       {
+         error = clib_error_return (0, "parse error: '%U'",
+                                    format_unformat_error, line_input);
+         goto done;
+       }
     }
 
-  unformat_free (line_input);
-
   if (encap_fib_id != ~0)
     {
       uword *p;
       ip6_main_t *im = &ip6_main;
       if (!(p = hash_get (im->fib_index_by_table_id, encap_fib_id)))
-       return clib_error_return (0, "No fib with id %d", encap_fib_id);
+       {
+         error = clib_error_return (0, "No fib with id %d", encap_fib_id);
+         goto done;
+       }
       encap_fib_index = p[0];
     }
   else
@@ -475,9 +480,15 @@ create_l2tpv3_tunnel_command_fn (vlib_main_t * vm,
     }
 
   if (our_address_set == 0)
-    return clib_error_return (0, "our address not specified");
+    {
+      error = clib_error_return (0, "our address not specified");
+      goto done;
+    }
   if (client_address_set == 0)
-    return clib_error_return (0, "client address not specified");
+    {
+      error = clib_error_return (0, "client address not specified");
+      goto done;
+    }
 
   rv = create_l2tpv3_ipv6_tunnel (lm, &client_address, &our_address,
                                  local_session_id, remote_session_id,
@@ -491,16 +502,22 @@ create_l2tpv3_tunnel_command_fn (vlib_main_t * vm,
                       vnet_get_main (), sw_if_index);
       break;
     case VNET_API_ERROR_INVALID_VALUE:
-      return clib_error_return (0, "session already exists...");
+      error = clib_error_return (0, "session already exists...");
+      goto done;
 
     case VNET_API_ERROR_NO_SUCH_ENTRY:
-      return clib_error_return (0, "session does not exist...");
+      error = clib_error_return (0, "session does not exist...");
+      goto done;
 
     default:
-      return clib_error_return (0, "l2tp_session_add_del returned %d", rv);
+      error = clib_error_return (0, "l2tp_session_add_del returned %d", rv);
+      goto done;
     }
 
-  return 0;
+done:
+  unformat_free (line_input);
+
+  return error;
 }
 
 /* *INDENT-OFF* */
index 25d11c6..05df9fb 100644 (file)
@@ -25,6 +25,7 @@ lisp_show_adjacencies_command_fn (vlib_main_t * vm,
   vlib_cli_output (vm, "%s %40s\n", "leid", "reid");
   unformat_input_t _line_input, *line_input = &_line_input;
   u32 vni = ~0;
+  clib_error_t *error = NULL;
 
   /* Get a line of input. */
   if (!unformat_user (input, unformat_line_input, line_input))
@@ -38,14 +39,14 @@ lisp_show_adjacencies_command_fn (vlib_main_t * vm,
        {
          vlib_cli_output (vm, "parse error: '%U'",
                           format_unformat_error, line_input);
-         return 0;
+         goto done;
        }
     }
 
   if (~0 == vni)
     {
       vlib_cli_output (vm, "error: no vni specified!");
-      return 0;
+      goto done;
     }
 
   adjs = vnet_lisp_adjacencies_get_by_vni (vni);
@@ -57,7 +58,10 @@ lisp_show_adjacencies_command_fn (vlib_main_t * vm,
   }
   vec_free (adjs);
 
-  return 0;
+done:
+  unformat_free (line_input);
+
+  return error;
 }
 
 /* *INDENT-OFF* */
@@ -77,6 +81,7 @@ lisp_add_del_map_server_command_fn (vlib_main_t * vm,
   u8 is_add = 1, ip_set = 0;
   ip_address_t ip;
   unformat_input_t _line_input, *line_input = &_line_input;
+  clib_error_t *error = NULL;
 
   /* Get a line of input. */
   if (!unformat_user (input, unformat_line_input, line_input))
@@ -94,14 +99,14 @@ lisp_add_del_map_server_command_fn (vlib_main_t * vm,
        {
          vlib_cli_output (vm, "parse error: '%U'",
                           format_unformat_error, line_input);
-         return 0;
+         goto done;
        }
     }
 
   if (!ip_set)
     {
       vlib_cli_output (vm, "map-server ip address not set!");
-      return 0;
+      goto done;
     }
 
   rv = vnet_lisp_add_del_map_server (&ip, is_add);
@@ -109,7 +114,10 @@ lisp_add_del_map_server_command_fn (vlib_main_t * vm,
     vlib_cli_output (vm, "failed to %s map-server!",
                     is_add ? "add" : "delete");
 
-  return 0;
+done:
+  unformat_free (line_input);
+
+  return error;
 }
 
 /* *INDENT-OFF* */
@@ -191,7 +199,7 @@ lisp_add_del_local_eid_command_fn (vlib_main_t * vm, unformat_input_t * input,
   if (key && (0 == key_id))
     {
       vlib_cli_output (vm, "invalid key_id!");
-      return 0;
+      goto done;;
     }
 
   gid_address_copy (&a->eid, &eid);
@@ -213,6 +221,8 @@ done:
     vec_free (locator_set_name);
   gid_address_free (&a->eid);
   vec_free (a->key);
+  unformat_free (line_input);
+
   return error;
 }
 
@@ -233,6 +243,7 @@ lisp_eid_table_map_command_fn (vlib_main_t * vm,
   u8 is_add = 1, is_l2 = 0;
   u32 vni = 0, dp_id = 0;
   unformat_input_t _line_input, *line_input = &_line_input;
+  clib_error_t *error = NULL;
 
   /* Get a line of input. */
   if (!unformat_user (input, unformat_line_input, line_input))
@@ -250,11 +261,16 @@ lisp_eid_table_map_command_fn (vlib_main_t * vm,
        is_l2 = 1;
       else
        {
-         return unformat_parse_error (line_input);
+         error = unformat_parse_error (line_input);
+         goto done;
        }
     }
   vnet_lisp_eid_table_map (vni, dp_id, is_l2, is_add);
-  return 0;
+
+done:
+  unformat_free (line_input);
+
+  return error;
 }
 
 /* *INDENT-OFF* */
@@ -479,7 +495,7 @@ lisp_add_del_adjacency_command_fn (vlib_main_t * vm, unformat_input_t * input,
          != ip_prefix_version (leid_ippref)))
     {
       clib_warning ("remote and local EIDs are of different types!");
-      return error;
+      goto done;
     }
 
   memset (a, 0, sizeof (a[0]));
@@ -512,6 +528,7 @@ lisp_map_request_mode_command_fn (vlib_main_t * vm,
 {
   unformat_input_t _i, *i = &_i;
   map_request_mode_t mr_mode = _MR_MODE_MAX;
+  clib_error_t *error = NULL;
 
   /* Get a line of input. */
   if (!unformat_user (input, unformat_line_input, i))
@@ -533,12 +550,15 @@ lisp_map_request_mode_command_fn (vlib_main_t * vm,
   if (_MR_MODE_MAX == mr_mode)
     {
       clib_warning ("No LISP map request mode entered!");
-      return 0;
+      goto done;
     }
 
   vnet_lisp_set_map_request_mode (mr_mode);
+
 done:
-  return 0;
+  unformat_free (i);
+
+  return error;
 }
 
 /* *INDENT-OFF* */
@@ -630,7 +650,10 @@ lisp_pitr_set_locator_set_command_fn (vlib_main_t * vm,
       else if (unformat (line_input, "disable"))
        is_add = 0;
       else
-       return clib_error_return (0, "parse error");
+       {
+         error = clib_error_return (0, "parse error");
+         goto done;
+       }
     }
 
   if (!locator_name_set)
@@ -648,6 +671,8 @@ lisp_pitr_set_locator_set_command_fn (vlib_main_t * vm,
 done:
   if (locator_set_name)
     vec_free (locator_set_name);
+  unformat_free (line_input);
+
   return error;
 }
 
@@ -771,6 +796,7 @@ lisp_show_eid_table_command_fn (vlib_main_t * vm,
   gid_address_t eid;
   u8 print_all = 1;
   u8 filter = 0;
+  clib_error_t *error = NULL;
 
   memset (&eid, 0, sizeof (eid));
 
@@ -787,8 +813,11 @@ lisp_show_eid_table_command_fn (vlib_main_t * vm,
       else if (unformat (line_input, "remote"))
        filter = 2;
       else
-       return clib_error_return (0, "parse error: '%U'",
-                                 format_unformat_error, line_input);
+       {
+         error = clib_error_return (0, "parse error: '%U'",
+                                    format_unformat_error, line_input);
+         goto done;
+       }
     }
 
   vlib_cli_output (vm, "%-35s%-20s%-30s%-20s%-s",
@@ -818,7 +847,7 @@ lisp_show_eid_table_command_fn (vlib_main_t * vm,
     {
       mi = gid_dictionary_lookup (&lcm->mapping_index_by_gid, &eid);
       if ((u32) ~ 0 == mi)
-       return 0;
+       goto done;
 
       mapit = pool_elt_at_index (lcm->mapping_pool, mi);
       locator_set_t *ls = pool_elt_at_index (lcm->locator_set_pool,
@@ -827,14 +856,17 @@ lisp_show_eid_table_command_fn (vlib_main_t * vm,
       if (filter && !((1 == filter && ls->local) ||
                      (2 == filter && !ls->local)))
        {
-         return 0;
+         goto done;
        }
 
       vlib_cli_output (vm, "%U,", format_eid_entry, lcm->vnet_main,
                       lcm, mapit, ls);
     }
 
-  return 0;
+done:
+  unformat_free (line_input);
+
+  return error;
 }
 
 /* *INDENT-OFF* */
@@ -853,6 +885,7 @@ lisp_enable_disable_command_fn (vlib_main_t * vm, unformat_input_t * input,
   unformat_input_t _line_input, *line_input = &_line_input;
   u8 is_enabled = 0;
   u8 is_set = 0;
+  clib_error_t *error = NULL;
 
   /* Get a line of input. */
   if (!unformat_user (input, unformat_line_input, line_input))
@@ -869,16 +902,24 @@ lisp_enable_disable_command_fn (vlib_main_t * vm, unformat_input_t * input,
        is_set = 1;
       else
        {
-         return clib_error_return (0, "parse error: '%U'",
-                                   format_unformat_error, line_input);
+         error = clib_error_return (0, "parse error: '%U'",
+                                    format_unformat_error, line_input);
+         goto done;
        }
     }
 
   if (!is_set)
-    return clib_error_return (0, "state not set");
+    {
+      error = clib_error_return (0, "state not set");
+      goto done;
+    }
 
   vnet_lisp_enable_disable (is_enabled);
-  return 0;
+
+done:
+  unformat_free (line_input);
+
+  return error;
 }
 
 /* *INDENT-OFF* */
@@ -897,6 +938,7 @@ lisp_map_register_enable_disable_command_fn (vlib_main_t * vm,
   unformat_input_t _line_input, *line_input = &_line_input;
   u8 is_enabled = 0;
   u8 is_set = 0;
+  clib_error_t *error = NULL;
 
   /* Get a line of input. */
   if (!unformat_user (input, unformat_line_input, line_input))
@@ -915,18 +957,22 @@ lisp_map_register_enable_disable_command_fn (vlib_main_t * vm,
        {
          vlib_cli_output (vm, "parse error: '%U'", format_unformat_error,
                           line_input);
-         return 0;
+         goto done;
        }
     }
 
   if (!is_set)
     {
       vlib_cli_output (vm, "state not set!");
-      return 0;
+      goto done;
     }
 
   vnet_lisp_map_register_enable_disable (is_enabled);
-  return 0;
+
+done:
+  unformat_free (line_input);
+
+  return error;
 }
 
 /* *INDENT-OFF* */
@@ -945,6 +991,7 @@ lisp_rloc_probe_enable_disable_command_fn (vlib_main_t * vm,
   unformat_input_t _line_input, *line_input = &_line_input;
   u8 is_enabled = 0;
   u8 is_set = 0;
+  clib_error_t *error = NULL;
 
   /* Get a line of input. */
   if (!unformat_user (input, unformat_line_input, line_input))
@@ -963,18 +1010,22 @@ lisp_rloc_probe_enable_disable_command_fn (vlib_main_t * vm,
        {
          vlib_cli_output (vm, "parse error: '%U'", format_unformat_error,
                           line_input);
-         return 0;
+         goto done;
        }
     }
 
   if (!is_set)
     {
       vlib_cli_output (vm, "state not set!");
-      return 0;
+      goto done;
     }
 
   vnet_lisp_rloc_probe_enable_disable (is_enabled);
-  return 0;
+
+done:
+  unformat_free (line_input);
+
+  return error;
 }
 
 /* *INDENT-OFF* */
@@ -1022,6 +1073,7 @@ lisp_show_eid_table_map_command_fn (vlib_main_t * vm,
   lisp_cp_main_t *lcm = vnet_lisp_cp_get_main ();
   uword *vni_table = 0;
   u8 is_l2 = 0;
+  clib_error_t *error = NULL;
 
   /* Get a line of input. */
   if (!unformat_user (input, unformat_line_input, line_input))
@@ -1040,14 +1092,17 @@ lisp_show_eid_table_map_command_fn (vlib_main_t * vm,
          is_l2 = 0;
        }
       else
-       return clib_error_return (0, "parse error: '%U'",
-                                 format_unformat_error, line_input);
+       {
+         error = clib_error_return (0, "parse error: '%U'",
+                                    format_unformat_error, line_input);
+         goto done;
+       }
     }
 
   if (!vni_table)
     {
       vlib_cli_output (vm, "Error: expected l2|l3 param!\n");
-      return 0;
+      goto done;
     }
 
   vlib_cli_output (vm, "%=10s%=10s", "VNI", is_l2 ? "BD" : "VRF");
@@ -1059,7 +1114,10 @@ lisp_show_eid_table_map_command_fn (vlib_main_t * vm,
   }));
   /* *INDENT-ON* */
 
-  return 0;
+done:
+  unformat_free (line_input);
+
+  return error;
 }
 
 /* *INDENT-OFF* */
@@ -1131,6 +1189,8 @@ done:
   vec_free (locators);
   if (locator_set_name)
     vec_free (locator_set_name);
+  unformat_free (line_input);
+
   return error;
 }
 
@@ -1205,6 +1265,8 @@ lisp_add_del_locator_in_set_command_fn (vlib_main_t * vm,
 done:
   vec_free (locators);
   vec_free (locator_set_name);
+  unformat_free (line_input);
+
   return error;
 }
 
@@ -1322,6 +1384,8 @@ lisp_add_del_map_resolver_command_fn (vlib_main_t * vm,
     }
 
 done:
+  unformat_free (line_input);
+
   return error;
 }
 
@@ -1372,11 +1436,11 @@ lisp_add_del_mreq_itr_rlocs_command_fn (vlib_main_t * vm,
                                 is_add ? "add" : "delete");
     }
 
+done:
   vec_free (locator_set_name);
+  unformat_free (line_input);
 
-done:
   return error;
-
 }
 
 /* *INDENT-OFF* */
@@ -1438,7 +1502,10 @@ lisp_use_petr_set_locator_set_command_fn (vlib_main_t * vm,
       else if (unformat (line_input, "disable"))
        is_add = 0;
       else
-       return clib_error_return (0, "parse error");
+       {
+         error = clib_error_return (0, "parse error");
+         goto done;
+       }
     }
 
   if (!ip_set)
@@ -1454,6 +1521,8 @@ lisp_use_petr_set_locator_set_command_fn (vlib_main_t * vm,
     }
 
 done:
+  unformat_free (line_input);
+
   return error;
 }
 
index 2142e09..19ac22e 100644 (file)
@@ -794,6 +794,7 @@ lisp_gpe_add_del_iface_command_fn (vlib_main_t * vm, unformat_input_t * input,
   u32 table_id, vni, bd_id;
   u8 vni_is_set = 0, vrf_is_set = 0, bd_index_is_set = 0;
   u8 nsh_iface = 0;
+  clib_error_t *error = NULL;
 
   if (vnet_lisp_gpe_enable_disable_status () == 0)
     {
@@ -828,8 +829,9 @@ lisp_gpe_add_del_iface_command_fn (vlib_main_t * vm, unformat_input_t * input,
        }
       else
        {
-         return clib_error_return (0, "parse error: '%U'",
-                                   format_unformat_error, line_input);
+         error = clib_error_return (0, "parse error: '%U'",
+                                    format_unformat_error, line_input);
+         goto done;
        }
     }
 
@@ -839,7 +841,8 @@ lisp_gpe_add_del_iface_command_fn (vlib_main_t * vm, unformat_input_t * input,
        {
          if (~0 == lisp_gpe_add_nsh_iface (&lisp_gpe_main))
            {
-             return clib_error_return (0, "NSH interface not created");
+             error = clib_error_return (0, "NSH interface not created");
+             goto done;
            }
        }
       else
@@ -850,21 +853,34 @@ lisp_gpe_add_del_iface_command_fn (vlib_main_t * vm, unformat_input_t * input,
     }
 
   if (vrf_is_set && bd_index_is_set)
-    return clib_error_return (0,
-                             "Cannot set both vrf and brdige domain index!");
+    {
+      error = clib_error_return
+       (0, "Cannot set both vrf and brdige domain index!");
+      goto done;
+    }
 
   if (!vni_is_set)
-    return clib_error_return (0, "vni must be set!");
+    {
+      error = clib_error_return (0, "vni must be set!");
+      goto done;
+    }
 
   if (!vrf_is_set && !bd_index_is_set)
-    return clib_error_return (0, "vrf or bridge domain index must be set!");
+    {
+      error =
+       clib_error_return (0, "vrf or bridge domain index must be set!");
+      goto done;
+    }
 
   if (bd_index_is_set)
     {
       if (is_add)
        {
          if (~0 == lisp_gpe_tenant_l2_iface_add_or_lock (vni, bd_id))
-           return clib_error_return (0, "L2 interface not created");
+           {
+             error = clib_error_return (0, "L2 interface not created");
+             goto done;
+           }
        }
       else
        lisp_gpe_tenant_l2_iface_unlock (vni);
@@ -874,13 +890,35 @@ lisp_gpe_add_del_iface_command_fn (vlib_main_t * vm, unformat_input_t * input,
       if (is_add)
        {
          if (~0 == lisp_gpe_tenant_l3_iface_add_or_lock (vni, table_id))
-           return clib_error_return (0, "L3 interface not created");
+           {
+             error = clib_error_return (0, "L3 interface not created");
+             goto done;
+           }
        }
       else
        lisp_gpe_tenant_l3_iface_unlock (vni);
     }
 
-  return (NULL);
+  if (nsh_iface)
+    {
+      if (is_add)
+       {
+         if (~0 == lisp_gpe_add_nsh_iface (&lisp_gpe_main))
+           {
+             error = clib_error_return (0, "NSH interface not created");
+             goto done;
+           }
+         else
+           {
+             lisp_gpe_del_nsh_iface (&lisp_gpe_main);
+           }
+       }
+    }
+
+done:
+  unformat_free (line_input);
+
+  return error;
 }
 
 /* *INDENT-OFF* */
index 1f8afda..f2fbcbd 100644 (file)
@@ -218,6 +218,7 @@ lisp_gpe_enable_disable_command_fn (vlib_main_t * vm,
   unformat_input_t _line_input, *line_input = &_line_input;
   u8 is_en = 1;
   vnet_lisp_gpe_enable_disable_args_t _a, *a = &_a;
+  clib_error_t *error = NULL;
 
   /* Get a line of input. */
   if (!unformat_user (input, unformat_line_input, line_input))
@@ -231,12 +232,18 @@ lisp_gpe_enable_disable_command_fn (vlib_main_t * vm,
        is_en = 0;
       else
        {
-         return clib_error_return (0, "parse error: '%U'",
-                                   format_unformat_error, line_input);
+         error = clib_error_return (0, "parse error: '%U'",
+                                    format_unformat_error, line_input);
+         goto done;
        }
     }
   a->is_en = is_en;
-  return vnet_lisp_gpe_enable_disable (a);
+  error = vnet_lisp_gpe_enable_disable (a);
+
+done:
+  unformat_free (line_input);
+
+  return error;
 }
 
 /* *INDENT-OFF* */
index aeec6a9..a2d2811 100644 (file)
@@ -465,6 +465,8 @@ map_security_check_command_fn (vlib_main_t * vm,
 {
   unformat_input_t _line_input, *line_input = &_line_input;
   map_main_t *mm = &map_main;
+  clib_error_t *error = NULL;
+
   /* Get a line of input. */
   if (!unformat_user (input, unformat_line_input, line_input))
     return 0;
@@ -476,11 +478,17 @@ map_security_check_command_fn (vlib_main_t * vm,
       else if (unformat (line_input, "on"))
        mm->sec_check = true;
       else
-       return clib_error_return (0, "unknown input `%U'",
-                                 format_unformat_error, input);
+       {
+         error = clib_error_return (0, "unknown input `%U'",
+                                    format_unformat_error, line_input);
+         goto done;
+       }
     }
+
+done:
   unformat_free (line_input);
-  return 0;
+
+  return error;
 }
 
 static clib_error_t *
@@ -490,6 +498,8 @@ map_security_check_frag_command_fn (vlib_main_t * vm,
 {
   unformat_input_t _line_input, *line_input = &_line_input;
   map_main_t *mm = &map_main;
+  clib_error_t *error = NULL;
+
   /* Get a line of input. */
   if (!unformat_user (input, unformat_line_input, line_input))
     return 0;
@@ -501,11 +511,17 @@ map_security_check_frag_command_fn (vlib_main_t * vm,
       else if (unformat (line_input, "on"))
        mm->sec_check_frag = true;
       else
-       return clib_error_return (0, "unknown input `%U'",
-                                 format_unformat_error, input);
+       {
+         error = clib_error_return (0, "unknown input `%U'",
+                                    format_unformat_error, line_input);
+         goto done;
+       }
     }
+
+done:
   unformat_free (line_input);
-  return 0;
+
+  return error;
 }
 
 static clib_error_t *
@@ -523,6 +539,7 @@ map_add_domain_command_fn (vlib_main_t * vm,
   u32 mtu = 0;
   u8 flags = 0;
   ip6_src_len = 128;
+  clib_error_t *error = NULL;
 
   /* Get a line of input. */
   if (!unformat_user (input, unformat_line_input, line_input))
@@ -559,20 +576,28 @@ map_add_domain_command_fn (vlib_main_t * vm,
       else if (unformat (line_input, "map-t"))
        flags |= MAP_DOMAIN_TRANSLATION;
       else
-       return clib_error_return (0, "unknown input `%U'",
-                                 format_unformat_error, input);
+       {
+         error = clib_error_return (0, "unknown input `%U'",
+                                    format_unformat_error, line_input);
+         goto done;
+       }
     }
-  unformat_free (line_input);
 
   if (num_m_args < 3)
-    return clib_error_return (0, "mandatory argument(s) missing");
+    {
+      error = clib_error_return (0, "mandatory argument(s) missing");
+      goto done;
+    }
 
   map_create_domain (&ip4_prefix, ip4_prefix_len,
                     &ip6_prefix, ip6_prefix_len, &ip6_src, ip6_src_len,
                     ea_bits_len, psid_offset, psid_length, &map_domain_index,
                     mtu, flags);
 
-  return 0;
+done:
+  unformat_free (line_input);
+
+  return error;
 }
 
 static clib_error_t *
@@ -582,6 +607,7 @@ map_del_domain_command_fn (vlib_main_t * vm,
   unformat_input_t _line_input, *line_input = &_line_input;
   u32 num_m_args = 0;
   u32 map_domain_index;
+  clib_error_t *error = NULL;
 
   /* Get a line of input. */
   if (!unformat_user (input, unformat_line_input, line_input))
@@ -592,17 +618,25 @@ map_del_domain_command_fn (vlib_main_t * vm,
       if (unformat (line_input, "index %d", &map_domain_index))
        num_m_args++;
       else
-       return clib_error_return (0, "unknown input `%U'",
-                                 format_unformat_error, input);
+       {
+         error = clib_error_return (0, "unknown input `%U'",
+                                    format_unformat_error, line_input);
+         goto done;
+       }
     }
-  unformat_free (line_input);
 
   if (num_m_args != 1)
-    return clib_error_return (0, "mandatory argument(s) missing");
+    {
+      error = clib_error_return (0, "mandatory argument(s) missing");
+      goto done;
+    }
 
   map_delete_domain (map_domain_index);
 
-  return 0;
+done:
+  unformat_free (line_input);
+
+  return error;
 }
 
 static clib_error_t *
@@ -613,6 +647,7 @@ map_add_rule_command_fn (vlib_main_t * vm,
   ip6_address_t tep;
   u32 num_m_args = 0;
   u32 psid = 0, map_domain_index;
+  clib_error_t *error = NULL;
 
   /* Get a line of input. */
   if (!unformat_user (input, unformat_line_input, line_input))
@@ -628,19 +663,29 @@ map_add_rule_command_fn (vlib_main_t * vm,
        if (unformat (line_input, "ip6-dst %U", unformat_ip6_address, &tep))
        num_m_args++;
       else
-       return clib_error_return (0, "unknown input `%U'",
-                                 format_unformat_error, input);
+       {
+         error = clib_error_return (0, "unknown input `%U'",
+                                    format_unformat_error, line_input);
+         goto done;
+       }
     }
-  unformat_free (line_input);
 
   if (num_m_args != 3)
-    return clib_error_return (0, "mandatory argument(s) missing");
+    {
+      error = clib_error_return (0, "mandatory argument(s) missing");
+      goto done;
+    }
 
   if (map_add_del_psid (map_domain_index, psid, &tep, 1) != 0)
     {
-      return clib_error_return (0, "Failing to add Mapping Rule");
+      error = clib_error_return (0, "Failing to add Mapping Rule");
+      goto done;
     }
-  return 0;
+
+done:
+  unformat_free (line_input);
+
+  return error;
 }
 
 #if MAP_SKIP_IP6_LOOKUP
@@ -653,6 +698,7 @@ map_pre_resolve_command_fn (vlib_main_t * vm,
   ip4_address_t ip4nh;
   ip6_address_t ip6nh;
   map_main_t *mm = &map_main;
+  clib_error_t *error = NULL;
 
   memset (&ip4nh, 0, sizeof (ip4nh));
   memset (&ip6nh, 0, sizeof (ip6nh));
@@ -669,14 +715,19 @@ map_pre_resolve_command_fn (vlib_main_t * vm,
        if (unformat (line_input, "ip6-nh %U", unformat_ip6_address, &ip6nh))
        mm->preresolve_ip6 = ip6nh;
       else
-       return clib_error_return (0, "unknown input `%U'",
-                                 format_unformat_error, input);
+       {
+         error = clib_error_return (0, "unknown input `%U'",
+                                    format_unformat_error, line_input);
+         goto done;
+       }
     }
-  unformat_free (line_input);
 
   map_pre_resolve (&ip4nh, &ip6nh);
 
-  return 0;
+done:
+  unformat_free (line_input);
+
+  return error;
 }
 #endif
 
@@ -688,6 +739,7 @@ map_icmp_relay_source_address_command_fn (vlib_main_t * vm,
   unformat_input_t _line_input, *line_input = &_line_input;
   ip4_address_t icmp_src_address;
   map_main_t *mm = &map_main;
+  clib_error_t *error = NULL;
 
   mm->icmp4_src_address.as_u32 = 0;
 
@@ -701,12 +753,17 @@ map_icmp_relay_source_address_command_fn (vlib_main_t * vm,
          (line_input, "%U", unformat_ip4_address, &icmp_src_address))
        mm->icmp4_src_address = icmp_src_address;
       else
-       return clib_error_return (0, "unknown input `%U'",
-                                 format_unformat_error, input);
+       {
+         error = clib_error_return (0, "unknown input `%U'",
+                                    format_unformat_error, line_input);
+         goto done;
+       }
     }
+
+done:
   unformat_free (line_input);
 
-  return 0;
+  return error;
 }
 
 static clib_error_t *
@@ -717,6 +774,7 @@ map_icmp_unreachables_command_fn (vlib_main_t * vm,
   unformat_input_t _line_input, *line_input = &_line_input;
   map_main_t *mm = &map_main;
   int num_m_args = 0;
+  clib_error_t *error = NULL;
 
   /* Get a line of input. */
   if (!unformat_user (input, unformat_line_input, line_input))
@@ -730,16 +788,21 @@ map_icmp_unreachables_command_fn (vlib_main_t * vm,
       else if (unformat (line_input, "off"))
        mm->icmp6_enabled = false;
       else
-       return clib_error_return (0, "unknown input `%U'",
-                                 format_unformat_error, input);
+       {
+         error = clib_error_return (0, "unknown input `%U'",
+                                    format_unformat_error, line_input);
+         goto done;
+       }
     }
-  unformat_free (line_input);
 
 
   if (num_m_args != 1)
-    return clib_error_return (0, "mandatory argument(s) missing");
+    error = clib_error_return (0, "mandatory argument(s) missing");
 
-  return 0;
+done:
+  unformat_free (line_input);
+
+  return error;
 }
 
 static clib_error_t *
@@ -748,6 +811,7 @@ map_fragment_command_fn (vlib_main_t * vm,
 {
   unformat_input_t _line_input, *line_input = &_line_input;
   map_main_t *mm = &map_main;
+  clib_error_t *error = NULL;
 
   /* Get a line of input. */
   if (!unformat_user (input, unformat_line_input, line_input))
@@ -760,12 +824,17 @@ map_fragment_command_fn (vlib_main_t * vm,
       else if (unformat (line_input, "outer"))
        mm->frag_inner = false;
       else
-       return clib_error_return (0, "unknown input `%U'",
-                                 format_unformat_error, input);
+       {
+         error = clib_error_return (0, "unknown input `%U'",
+                                    format_unformat_error, line_input);
+         goto done;
+       }
     }
+
+done:
   unformat_free (line_input);
 
-  return 0;
+  return error;
 }
 
 static clib_error_t *
@@ -775,6 +844,7 @@ map_fragment_df_command_fn (vlib_main_t * vm,
 {
   unformat_input_t _line_input, *line_input = &_line_input;
   map_main_t *mm = &map_main;
+  clib_error_t *error = NULL;
 
   /* Get a line of input. */
   if (!unformat_user (input, unformat_line_input, line_input))
@@ -787,12 +857,17 @@ map_fragment_df_command_fn (vlib_main_t * vm,
       else if (unformat (line_input, "off"))
        mm->frag_ignore_df = false;
       else
-       return clib_error_return (0, "unknown input `%U'",
-                                 format_unformat_error, input);
+       {
+         error = clib_error_return (0, "unknown input `%U'",
+                                    format_unformat_error, line_input);
+         goto done;
+       }
     }
+
+done:
   unformat_free (line_input);
 
-  return 0;
+  return error;
 }
 
 static clib_error_t *
@@ -803,6 +878,7 @@ map_traffic_class_command_fn (vlib_main_t * vm,
   unformat_input_t _line_input, *line_input = &_line_input;
   map_main_t *mm = &map_main;
   u32 tc = 0;
+  clib_error_t *error = NULL;
 
   mm->tc_copy = false;
 
@@ -817,12 +893,17 @@ map_traffic_class_command_fn (vlib_main_t * vm,
       else if (unformat (line_input, "%x", &tc))
        mm->tc = tc & 0xff;
       else
-       return clib_error_return (0, "unknown input `%U'",
-                                 format_unformat_error, input);
+       {
+         error = clib_error_return (0, "unknown input `%U'",
+                                    format_unformat_error, line_input);
+         goto done;
+       }
     }
+
+done:
   unformat_free (line_input);
 
-  return 0;
+  return error;
 }
 
 static u8 *
@@ -922,6 +1003,7 @@ show_map_domain_command_fn (vlib_main_t * vm, unformat_input_t * input,
   map_domain_t *d;
   bool counters = false;
   u32 map_domain_index = ~0;
+  clib_error_t *error = NULL;
 
   /* Get a line of input. */
   if (!unformat_user (input, unformat_line_input, line_input))
@@ -934,10 +1016,12 @@ show_map_domain_command_fn (vlib_main_t * vm, unformat_input_t * input,
       else if (unformat (line_input, "index %d", &map_domain_index))
        ;
       else
-       return clib_error_return (0, "unknown input `%U'",
-                                 format_unformat_error, input);
+       {
+         error = clib_error_return (0, "unknown input `%U'",
+                                    format_unformat_error, line_input);
+         goto done;
+       }
     }
-  unformat_free (line_input);
 
   if (pool_elts (mm->domains) == 0)
     vlib_cli_output (vm, "No MAP domains are configured...");
@@ -952,15 +1036,19 @@ show_map_domain_command_fn (vlib_main_t * vm, unformat_input_t * input,
     {
       if (pool_is_free_index (mm->domains, map_domain_index))
        {
-         return clib_error_return (0, "MAP domain does not exists %d",
-                                   map_domain_index);
+         error = clib_error_return (0, "MAP domain does not exists %d",
+                                    map_domain_index);
+         goto done;
        }
 
       d = pool_elt_at_index (mm->domains, map_domain_index);
       vlib_cli_output (vm, "%U", format_map_domain, d, counters);
     }
 
-  return 0;
+done:
+  unformat_free (line_input);
+
+  return error;
 }
 
 static clib_error_t *
index 0e610e1..7ae4aa0 100644 (file)
@@ -470,6 +470,8 @@ vnet_mpls_local_label (vlib_main_t * vm,
   }
 
 done:
+  unformat_free (line_input);
+
   return error;
 }
 
index 8d1e30a..e488271 100644 (file)
@@ -535,6 +535,7 @@ vnet_create_mpls_tunnel_command_fn (vlib_main_t * vm,
     fib_route_path_t rpath, *rpaths = NULL;
     mpls_label_t out_label = MPLS_LABEL_INVALID, *labels = NULL;
     u32 sw_if_index;
+    clib_error_t *error = NULL;
 
     memset(&rpath, 0, sizeof(rpath));
 
@@ -595,8 +596,11 @@ vnet_create_mpls_tunnel_command_fn (vlib_main_t * vm,
        else if (unformat (line_input, "l2-only"))
            l2_only = 1;
        else
-           return clib_error_return (0, "unknown input '%U'",
-                                     format_unformat_error, line_input);
+       {
+           error = clib_error_return (0, "unknown input '%U'",
+                                      format_unformat_error, line_input);
+           goto done;
+       }
     }
 
     if (is_del)
@@ -606,17 +610,22 @@ vnet_create_mpls_tunnel_command_fn (vlib_main_t * vm,
     else
     {
        if (0 == vec_len(labels))
-           return clib_error_return (0, "No Output Labels '%U'",
-                                     format_unformat_error, line_input);
+       {
+           error = clib_error_return (0, "No Output Labels '%U'",
+                                      format_unformat_error, line_input);
+           goto done;
+       }
 
        vec_add1(rpaths, rpath);
        vnet_mpls_tunnel_add(rpaths, labels, l2_only, &sw_if_index);
     }
 
+done:
     vec_free(labels);
     vec_free(rpaths);
+    unformat_free (line_input);
 
-    return (NULL);
+    return error;
 }
 
 /*?
index f5896b4..3c249a7 100644 (file)
@@ -547,21 +547,30 @@ pg_capture_cmd_fn (vlib_main_t * vm,
       else
        {
          error = clib_error_create ("unknown input `%U'",
-                                    format_unformat_error, input);
-         return error;
+                                    format_unformat_error, line_input);
+         goto done;
        }
     }
 
   if (!hi)
-    return clib_error_return (0, "Please specify interface name");
+    {
+      error = clib_error_return (0, "Please specify interface name");
+      goto done;
+    }
 
   if (hi->dev_class_index != pg_dev_class.index)
-    return clib_error_return (0, "Please specify packet-generator interface");
+    {
+      error =
+       clib_error_return (0, "Please specify packet-generator interface");
+      goto done;
+    }
 
   if (!pcap_file_name && is_disable == 0)
-    return clib_error_return (0, "Please specify pcap file name");
+    {
+      error = clib_error_return (0, "Please specify pcap file name");
+      goto done;
+    }
 
-  unformat_free (line_input);
 
   pg_capture_args_t _a, *a = &_a;
 
@@ -572,6 +581,10 @@ pg_capture_cmd_fn (vlib_main_t * vm,
   a->count = count;
 
   error = pg_capture (a);
+
+done:
+  unformat_free (line_input);
+
   return error;
 }
 
@@ -590,6 +603,7 @@ create_pg_if_cmd_fn (vlib_main_t * vm,
   pg_main_t *pg = &pg_main;
   unformat_input_t _line_input, *line_input = &_line_input;
   u32 if_id;
+  clib_error_t *error = NULL;
 
   if (!unformat_user (input, unformat_line_input, line_input))
     return 0;
@@ -600,14 +614,19 @@ create_pg_if_cmd_fn (vlib_main_t * vm,
        ;
 
       else
-       return clib_error_create ("unknown input `%U'",
-                                 format_unformat_error, input);
+       {
+         error = clib_error_create ("unknown input `%U'",
+                                    format_unformat_error, line_input);
+         goto done;
+       }
     }
 
+  pg_interface_add_or_get (pg, if_id);
+
+done:
   unformat_free (line_input);
 
-  pg_interface_add_or_get (pg, if_id);
-  return 0;
+  return error;
 }
 
 /* *INDENT-OFF* */
index 1f4997f..457dd09 100644 (file)
@@ -447,6 +447,7 @@ test_policer_command_fn (vlib_main_t * vm,
   int rx_set = 0;
   int is_add = 1;
   int is_show = 0;
+  clib_error_t *error = NULL;
 
   /* Get a line of input. */
   if (!unformat_user (input, unformat_line_input, line_input))
@@ -468,7 +469,10 @@ test_policer_command_fn (vlib_main_t * vm,
     }
 
   if (rx_set == 0)
-    return clib_error_return (0, "interface not set");
+    {
+      error = clib_error_return (0, "interface not set");
+      goto done;
+    }
 
   if (is_show)
     {
@@ -477,12 +481,13 @@ test_policer_command_fn (vlib_main_t * vm,
       policer = pool_elt_at_index (pm->policers, pi);
 
       vlib_cli_output (vm, "%U", format_policer_instance, policer);
-      return 0;
+      goto done;
     }
 
   if (is_add && config_name == 0)
     {
-      return clib_error_return (0, "policer config name required");
+      error = clib_error_return (0, "policer config name required");
+      goto done;
     }
 
   rv = test_policer_add_del (rx_sw_if_index, config_name, is_add);
@@ -493,11 +498,15 @@ test_policer_command_fn (vlib_main_t * vm,
       break;
 
     default:
-      return clib_error_return
+      error = clib_error_return
        (0, "WARNING: vnet_vnet_policer_add_del returned %d", rv);
+      goto done;
     }
 
-  return 0;
+done:
+  unformat_free (line_input);
+
+  return error;
 }
 
 /* *INDENT-OFF* */
index 290a6af..cd754e2 100644 (file)
@@ -413,6 +413,7 @@ configure_policer_command_fn (vlib_main_t * vm,
   u8 is_add = 1;
   u8 *name = 0;
   u32 pi;
+  clib_error_t *error = NULL;
 
   /* Get a line of input. */
   if (!unformat_user (input, unformat_line_input, line_input))
@@ -433,13 +434,19 @@ configure_policer_command_fn (vlib_main_t * vm,
       foreach_config_param
 #undef _
        else
-       return clib_error_return (0, "unknown input `%U'",
-                                 format_unformat_error, line_input);
+       {
+         error = clib_error_return (0, "unknown input `%U'",
+                                    format_unformat_error, line_input);
+         goto done;
+       }
     }
 
+  error = policer_add_del (vm, name, &c, &pi, is_add);
+
+done:
   unformat_free (line_input);
 
-  return policer_add_del (vm, name, &c, &pi, is_add);
+  return error;
 }
 
 /* *INDENT-OFF* */
index 48e81b5..25c930c 100644 (file)
@@ -1308,6 +1308,7 @@ tap_connect_command_fn (vlib_main_t * vm,
   int ip6_address_set = 0;
   u32 ip4_mask_width = 0;
   u32 ip6_mask_width = 0;
+  clib_error_t *error = NULL;
 
   if (tm->is_disabled)
     return clib_error_return (0, "device disabled...");
@@ -1336,12 +1337,18 @@ tap_connect_command_fn (vlib_main_t * vm,
       else if (unformat (line_input, "%s", &intfc_name))
         ;
       else
-        return clib_error_return (0, "unknown input `%U'",
-                                  format_unformat_error, line_input);
+        {
+          error = clib_error_return (0, "unknown input `%U'",
+                                     format_unformat_error, line_input);
+          goto done;
+        }
     }
   
   if (intfc_name == 0)
-      return clib_error_return (0, "interface name must be specified");
+    {
+      error = clib_error_return (0, "interface name must be specified");
+      goto done;
+    }
 
   memset (ap, 0, sizeof (*ap));
 
@@ -1367,48 +1374,64 @@ tap_connect_command_fn (vlib_main_t * vm,
   switch (rv) 
     {
     case VNET_API_ERROR_SYSCALL_ERROR_1:
-      return clib_error_return (0, "Couldn't open /dev/net/tun");
+      error = clib_error_return (0, "Couldn't open /dev/net/tun");
+      goto done;
       
     case VNET_API_ERROR_SYSCALL_ERROR_2:
-      return clib_error_return (0, "Error setting flags on '%s'", intfc_name);
-  
+      error = clib_error_return (0, "Error setting flags on '%s'", intfc_name);
+      goto done;
+
     case VNET_API_ERROR_SYSCALL_ERROR_3:
-      return clib_error_return (0,  "Couldn't open provisioning socket");
+      error = clib_error_return (0,  "Couldn't open provisioning socket");
+      goto done;
 
     case VNET_API_ERROR_SYSCALL_ERROR_4:
-      return clib_error_return (0,  "Couldn't get if_index");
+      error = clib_error_return (0,  "Couldn't get if_index");
+      goto done;
     
     case VNET_API_ERROR_SYSCALL_ERROR_5:
-      return clib_error_return (0,  "Couldn't bind provisioning socket");
+      error = clib_error_return (0,  "Couldn't bind provisioning socket");
+      goto done;
 
     case VNET_API_ERROR_SYSCALL_ERROR_6:
-      return clib_error_return (0,  "Couldn't set device non-blocking flag");
+      error = clib_error_return (0,  "Couldn't set device non-blocking flag");
+      goto done;
 
     case VNET_API_ERROR_SYSCALL_ERROR_7:
-      return clib_error_return (0,  "Couldn't set device MTU");
+      error = clib_error_return (0,  "Couldn't set device MTU");
+      goto done;
 
     case VNET_API_ERROR_SYSCALL_ERROR_8:
-      return clib_error_return (0,  "Couldn't get interface flags");
+      error = clib_error_return (0,  "Couldn't get interface flags");
+      goto done;
 
     case VNET_API_ERROR_SYSCALL_ERROR_9:
-      return clib_error_return (0,  "Couldn't set intfc admin state up");
+      error = clib_error_return (0,  "Couldn't set intfc admin state up");
+      goto done;
 
     case VNET_API_ERROR_SYSCALL_ERROR_10:
-      return clib_error_return (0,  "Couldn't set intfc address/mask");
+      error = clib_error_return (0,  "Couldn't set intfc address/mask");
+      goto done;
 
     case VNET_API_ERROR_INVALID_REGISTRATION:
-      return clib_error_return (0,  "Invalid registration");
+      error = clib_error_return (0,  "Invalid registration");
+      goto done;
 
     case 0:
       break;
 
     default:
-      return clib_error_return (0,  "Unknown error: %d", rv);
+      error = clib_error_return (0,  "Unknown error: %d", rv);
+      goto done;
     }
 
   vlib_cli_output(vm, "%U\n", format_vnet_sw_if_index_name, 
                   vnet_get_main(), sw_if_index);
-  return 0;
+
+done:
+  unformat_free (line_input);
+
+  return error;
 }
 
 VLIB_CLI_COMMAND (tap_connect_command, static) = {
index b97510c..2cba596 100644 (file)
@@ -454,6 +454,7 @@ vxlan_gpe_add_del_tunnel_command_fn (vlib_main_t * vm,
   u32 tmp;
   vnet_vxlan_gpe_add_del_tunnel_args_t _a, * a = &_a;
   u32 sw_if_index;
+  clib_error_t *error = NULL;
 
   /* Get a line of input. */
   if (! unformat_user (input, unformat_line_input, line_input))
@@ -494,7 +495,10 @@ vxlan_gpe_add_del_tunnel_command_fn (vlib_main_t * vm,
           encap_fib_index =  ip4_fib_index_from_table_id (tmp);
 
         if (encap_fib_index == ~0)
-          return clib_error_return (0, "nonexistent encap fib id %d", tmp);
+          {
+            error = clib_error_return (0, "nonexistent encap fib id %d", tmp);
+            goto done;
+          }
       }
     else if (unformat (line_input, "decap-vrf-id %d", &tmp))
       {
@@ -504,7 +508,10 @@ vxlan_gpe_add_del_tunnel_command_fn (vlib_main_t * vm,
           decap_fib_index = ip4_fib_index_from_table_id (tmp);
 
         if (decap_fib_index == ~0)
-          return clib_error_return (0, "nonexistent decap fib id %d", tmp);
+          {
+            error = clib_error_return (0, "nonexistent decap fib id %d", tmp);
+            goto done;
+          }
       }
     else if (unformat (line_input, "vni %d", &vni))
       vni_set = 1;
@@ -517,27 +524,43 @@ vxlan_gpe_add_del_tunnel_command_fn (vlib_main_t * vm,
     else if (unformat(line_input, "next-nsh"))
       protocol = VXLAN_GPE_PROTOCOL_NSH;
     else
-      return clib_error_return (0, "parse error: '%U'",
-                                format_unformat_error, line_input);
+      {
+        error = clib_error_return (0, "parse error: '%U'",
+                                   format_unformat_error, line_input);
+        goto done;
+      }
   }
 
-  unformat_free (line_input);
-
   if (local_set == 0)
-    return clib_error_return (0, "tunnel local address not specified");
+    {
+      error = clib_error_return (0, "tunnel local address not specified");
+      goto done;
+    }
 
   if (remote_set == 0)
-    return clib_error_return (0, "tunnel remote address not specified");
+    {
+      error = clib_error_return (0, "tunnel remote address not specified");
+      goto done;
+    }
 
   if (ipv4_set && ipv6_set)
-    return clib_error_return (0, "both IPv4 and IPv6 addresses specified");
+    {
+      error = clib_error_return (0, "both IPv4 and IPv6 addresses specified");
+      goto done;
+    }
 
   if ((ipv4_set && memcmp(&local.ip4, &remote.ip4, sizeof(local.ip4)) == 0) ||
       (ipv6_set && memcmp(&local.ip6, &remote.ip6, sizeof(local.ip6)) == 0))
-    return clib_error_return (0, "src and dst addresses are identical");
+    {
+      error = clib_error_return (0, "src and dst addresses are identical");
+      goto done;
+    }
 
   if (vni_set == 0)
-    return clib_error_return (0, "vni not specified");
+    {
+      error = clib_error_return (0, "vni not specified");
+      goto done;
+    }
 
   memset (a, 0, sizeof (*a));
 
@@ -558,20 +581,27 @@ vxlan_gpe_add_del_tunnel_command_fn (vlib_main_t * vm,
       vlib_cli_output(vm, "%U\n", format_vnet_sw_if_index_name, vnet_get_main(), sw_if_index);
       break;
     case VNET_API_ERROR_INVALID_DECAP_NEXT:
-      return clib_error_return (0, "invalid decap-next...");
+      error = clib_error_return (0, "invalid decap-next...");
+      goto done;
 
     case VNET_API_ERROR_TUNNEL_EXIST:
-      return clib_error_return (0, "tunnel already exists...");
+      error = clib_error_return (0, "tunnel already exists...");
+      goto done;
 
     case VNET_API_ERROR_NO_SUCH_ENTRY:
-      return clib_error_return (0, "tunnel does not exist...");
+      error = clib_error_return (0, "tunnel does not exist...");
+      goto done;
 
     default:
-      return clib_error_return
+      error = clib_error_return
         (0, "vnet_vxlan_gpe_add_del_tunnel returned %d", rv);
+      goto done;
     }
 
-  return 0;
+done:
+  unformat_free (line_input);
+
+  return error;
 }
 
 VLIB_CLI_COMMAND (create_vxlan_gpe_tunnel_command, static) = {
index 849fc25..eedc16f 100644 (file)
@@ -657,6 +657,7 @@ vxlan_add_del_tunnel_command_fn (vlib_main_t * vm,
   int rv;
   vnet_vxlan_add_del_tunnel_args_t _a, * a = &_a;
   u32 tunnel_sw_if_index;
+  clib_error_t *error = NULL;
 
   /* Cant "universally zero init" (={0}) due to GCC bug 53119 */
   memset(&src, 0, sizeof src);
@@ -715,7 +716,10 @@ vxlan_add_del_tunnel_command_fn (vlib_main_t * vm,
       {
         encap_fib_index = fib_table_find (fib_ip_proto (ipv6_set), tmp);
         if (encap_fib_index == ~0)
-          return clib_error_return (0, "nonexistent encap-vrf-id %d", tmp);
+          {
+            error = clib_error_return (0, "nonexistent encap-vrf-id %d", tmp);
+            goto done;
+          }
       }
     else if (unformat (line_input, "decap-next %U", unformat_decap_next, 
                        &decap_next_index, ipv4_set))
@@ -723,41 +727,72 @@ vxlan_add_del_tunnel_command_fn (vlib_main_t * vm,
     else if (unformat (line_input, "vni %d", &vni))
       {
         if (vni >> 24)  
-          return clib_error_return (0, "vni %d out of range", vni);
+          {
+            error = clib_error_return (0, "vni %d out of range", vni);
+            goto done;
+          }
       }
     else 
-      return clib_error_return (0, "parse error: '%U'", 
-                                format_unformat_error, line_input);
+      {
+        error = clib_error_return (0, "parse error: '%U'",
+                                   format_unformat_error, line_input);
+        goto done;
+      }
   }
 
-  unformat_free (line_input);
-
   if (src_set == 0)
-    return clib_error_return (0, "tunnel src address not specified");
+    {
+      error = clib_error_return (0, "tunnel src address not specified");
+      goto done;
+    }
 
   if (dst_set == 0)
-    return clib_error_return (0, "tunnel dst address not specified");
+    {
+      error = clib_error_return (0, "tunnel dst address not specified");
+      goto done;
+    }
 
   if (grp_set && !ip46_address_is_multicast(&dst))
-    return clib_error_return (0, "tunnel group address not multicast");
+    {
+      error = clib_error_return (0, "tunnel group address not multicast");
+      goto done;
+    }
 
   if (grp_set == 0 && ip46_address_is_multicast(&dst))
-    return clib_error_return (0, "dst address must be unicast");
+    {
+      error = clib_error_return (0, "dst address must be unicast");
+      goto done;
+    }
 
   if (grp_set && mcast_sw_if_index == ~0)
-    return clib_error_return (0, "tunnel nonexistent multicast device");
+    {
+      error = clib_error_return (0, "tunnel nonexistent multicast device");
+      goto done;
+    }
 
   if (ipv4_set && ipv6_set)
-    return clib_error_return (0, "both IPv4 and IPv6 addresses specified");
+    {
+      error = clib_error_return (0, "both IPv4 and IPv6 addresses specified");
+      goto done;
+    }
 
   if (ip46_address_cmp(&src, &dst) == 0)
-    return clib_error_return (0, "src and dst addresses are identical");
+    {
+      error = clib_error_return (0, "src and dst addresses are identical");
+      goto done;
+    }
 
   if (decap_next_index == ~0)
-    return clib_error_return (0, "next node not found");
+    {
+      error = clib_error_return (0, "next node not found");
+      goto done;
+    }
 
   if (vni == 0)
-    return clib_error_return (0, "vni not specified");
+    {
+      error = clib_error_return (0, "vni not specified");
+      goto done;
+    }
 
   memset (a, 0, sizeof (*a));
 
@@ -779,17 +814,23 @@ vxlan_add_del_tunnel_command_fn (vlib_main_t * vm,
       break;
 
     case VNET_API_ERROR_TUNNEL_EXIST:
-      return clib_error_return (0, "tunnel already exists...");
+      error = clib_error_return (0, "tunnel already exists...");
+      goto done;
 
     case VNET_API_ERROR_NO_SUCH_ENTRY:
-      return clib_error_return (0, "tunnel does not exist...");
+      error = clib_error_return (0, "tunnel does not exist...");
+      goto done;
 
     default:
-      return clib_error_return 
+      error = clib_error_return
         (0, "vnet_vxlan_add_del_tunnel returned %d", rv);
+      goto done;
     }
 
-  return 0;
+done:
+  unformat_free (line_input);
+
+  return error;
 }
 
 /*?
@@ -912,6 +953,8 @@ set_ip_vxlan_bypass (u32 is_ip6,
   vnet_int_vxlan_bypass_mode (sw_if_index, is_ip6, is_enable);
 
  done:
+  unformat_free (line_input);
+
   return error;
 }
 
index 45dd280..e1eda15 100644 (file)
@@ -254,6 +254,7 @@ l2tp_session_add_command_fn (vlib_main_t * vm,
   u32 local_session_id = 1, remote_session_id = 1;
   int our_address_set = 0, client_address_set = 0;
   int l2_sublayer_present = 0;
+  clib_error_t *error = NULL;
 
   /* Get a line of input. */
   if (!unformat_user (input, unformat_line_input, line_input))
@@ -290,8 +291,12 @@ l2tp_session_add_command_fn (vlib_main_t * vm,
       else if (unformat (line_input, "l2-sublayer-present"))
        l2_sublayer_present = 1;
       else
-       return clib_error_return (0, "parse error: '%U'",
-                                 format_unformat_error, line_input);
+       {
+         error = clib_error_return (0, "parse error: '%U'",
+                                    format_unformat_error, line_input);
+         unformat_free (line_input);
+         return error;
+       }
     }
 
   unformat_free (line_input);
index a26bf71..94bdc84 100644 (file)
@@ -36,6 +36,7 @@ virtual_ip_cmd_fn_command_fn (vlib_main_t * vm,
   mac_addr_t *mac_addrs = 0;
   u32 sw_if_index;
   u32 i;
+  clib_error_t *error = NULL;
 
   next_hops = NULL;
   rpaths = NULL;
@@ -49,7 +50,11 @@ virtual_ip_cmd_fn_command_fn (vlib_main_t * vm,
   if (!unformat (line_input, "%U %U",
                 unformat_ip4_address, &prefix.fp_addr.ip4,
                 unformat_vnet_sw_interface, vnm, &sw_if_index))
-    goto barf;
+    {
+      error = clib_error_return (0, "unknown input `%U'",
+                                format_unformat_error, line_input);
+      goto done;
+    }
 
   while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
     {
@@ -67,13 +72,18 @@ virtual_ip_cmd_fn_command_fn (vlib_main_t * vm,
        }
       else
        {
-       barf:
-         return clib_error_return (0, "unknown input `%U'",
-                                   format_unformat_error, input);
+         error = clib_error_return (0, "unknown input `%U'",
+                                    format_unformat_error, line_input);
+         goto done;
        }
     }
+
   if (vec_len (mac_addrs) == 0 || vec_len (mac_addrs) != vec_len (next_hops))
-    goto barf;
+    {
+      error = clib_error_return (0, "unknown input `%U'",
+                                format_unformat_error, line_input);
+      goto done;
+    }
 
   /* Create / delete special interface route /32's */
 
@@ -100,10 +110,12 @@ virtual_ip_cmd_fn_command_fn (vlib_main_t * vm,
                             &prefix,
                             FIB_SOURCE_CLI, FIB_ENTRY_FLAG_NONE, rpaths);
 
+done:
   vec_free (mac_addrs);
   vec_free (next_hops);
+  unformat_free (line_input);
 
-  return 0;
+  return error;
 }
 
 /* *INDENT-OFF* */