vapi: avoid memory leak
[vpp.git] / src / vpp / app / vpp_get_stats.c
index d500f8f..1c3b9d9 100644 (file)
@@ -19,6 +19,7 @@
 
 #include <vpp-api/client/stat_client.h>
 #include <vlib/vlib.h>
+#include <vpp/vnet/config.h>
 
 static int
 stat_poll_loop (u8 ** patterns)
@@ -79,14 +80,13 @@ stat_poll_loop (u8 ** patterns)
                           res[i].name);
              break;
 
-           case STAT_DIR_TYPE_ERROR_INDEX:
-             fformat (stdout, "%llu %s\n", res[i].error_value, res[i].name);
-             break;
-
            case STAT_DIR_TYPE_SCALAR_INDEX:
              fformat (stdout, "%.2f %s\n", res[i].scalar_value, res[i].name);
              break;
 
+           case STAT_DIR_TYPE_EMPTY:
+             break;
+
            default:
              printf ("Unknown value\n");
              ;
@@ -111,6 +111,15 @@ enum stat_client_cmd_e
   STAT_CLIENT_CMD_TIGHTPOLL,
 };
 
+#ifdef CLIB_SANITIZE_ADDR
+/* default options for Address Sanitizer */
+const char *
+__asan_default_options (void)
+{
+  return VPP_SANITIZE_ADDR_OPTIONS;
+}
+#endif /* CLIB_SANITIZE_ADDR */
+
 int
 main (int argc, char **argv)
 {
@@ -180,6 +189,8 @@ reconnect:
       for (i = 0; i < vec_len (dir); i++)
        {
          char *n = stat_segment_index_to_name (dir[i]);
+         if (!n)
+           continue;
          printf ("%s\n", n);
          free (n);
        }
@@ -194,7 +205,7 @@ reconnect:
            case STAT_DIR_TYPE_COUNTER_VECTOR_SIMPLE:
              if (res[i].simple_counter_vec == 0)
                continue;
-             for (k = 0; k < vec_len (res[i].simple_counter_vec) - 1; k++)
+             for (k = 0; k < vec_len (res[i].simple_counter_vec); k++)
                for (j = 0; j < vec_len (res[i].simple_counter_vec[k]); j++)
                  fformat (stdout, "[%d @ %d]: %llu packets %s\n",
                           j, k, res[i].simple_counter_vec[k][j],
@@ -202,7 +213,7 @@ reconnect:
              break;
 
            case STAT_DIR_TYPE_COUNTER_VECTOR_COMBINED:
-             if (res[i].simple_counter_vec == 0)
+             if (res[i].combined_counter_vec == 0)
                continue;
              for (k = 0; k < vec_len (res[i].combined_counter_vec); k++)
                for (j = 0; j < vec_len (res[i].combined_counter_vec[k]); j++)
@@ -212,14 +223,22 @@ reconnect:
                           res[i].name);
              break;
 
-           case STAT_DIR_TYPE_ERROR_INDEX:
-             fformat (stdout, "%llu %s\n", res[i].error_value, res[i].name);
-             break;
-
            case STAT_DIR_TYPE_SCALAR_INDEX:
              fformat (stdout, "%.2f %s\n", res[i].scalar_value, res[i].name);
              break;
 
+           case STAT_DIR_TYPE_NAME_VECTOR:
+             if (res[i].name_vector == 0)
+               continue;
+             for (k = 0; k < vec_len (res[i].name_vector); k++)
+               if (res[i].name_vector[k])
+                 fformat (stdout, "[%d]: %s %s\n", k, res[i].name_vector[k],
+                          res[i].name);
+             break;
+
+           case STAT_DIR_TYPE_EMPTY:
+             break;
+
            default:
              ;
            }