X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fovs_stats.c;h=23b7533c185a0ddeb52d21c800c5ce2351e28b78;hb=9eb3efd17e10c3bd59aa227d8d11fe60d6d4f303;hp=77dc1f2eb7b0a786d9a1c42c4aa128f920ce0384;hpb=9717b1a55d60d992c16e66e2ae5bdfb42f80aca8;p=collectd.git diff --git a/src/ovs_stats.c b/src/ovs_stats.c index 77dc1f2e..23b7533c 100644 --- a/src/ovs_stats.c +++ b/src/ovs_stats.c @@ -155,7 +155,7 @@ static ovs_stats_config_t ovs_stats_cfg = { .ovs_db_serv = "6640", /* use default OVS DB service */ }; -static const iface_counter ovs_stats_counter_name_to_type(const char *counter) { +static iface_counter ovs_stats_counter_name_to_type(const char *counter) { iface_counter index = not_supported; if (counter == NULL) @@ -349,13 +349,15 @@ static int ovs_stats_update_bridge(yajl_val bridge) { if (br_ports && YAJL_IS_ARRAY(br_ports)) { char *tmp = YAJL_GET_STRING(br_ports->u.array.values[0]); if (tmp != NULL && strcmp("set", tmp) == 0) { - yajl_val *ports_arr = - YAJL_GET_ARRAY(br_ports->u.array.values[1])->values; - size_t ports_num = YAJL_GET_ARRAY(br_ports->u.array.values[1])->len; - - for (int i = 0; i < ports_num; i++) - ovs_stats_new_port( - br, YAJL_GET_STRING(ports_arr[i]->u.array.values[1])); + yajl_val *array = YAJL_GET_ARRAY(br_ports)->values; + size_t array_len = YAJL_GET_ARRAY(br_ports)->len; + if (array != NULL && array_len > 0 && YAJL_IS_ARRAY(array[1])) { + yajl_val *ports_arr = YAJL_GET_ARRAY(array[1])->values; + size_t ports_num = YAJL_GET_ARRAY(array[1])->len; + for (size_t i = 0; i < ports_num && ports_arr != NULL; i++) + ovs_stats_new_port( + br, YAJL_GET_STRING(ports_arr[i]->u.array.values[1])); + } } else ovs_stats_new_port(br, YAJL_GET_STRING(br_ports->u.array.values[1])); } @@ -398,7 +400,7 @@ static void ovs_stats_bridge_table_change_cb(yajl_val jupdates) { yajl_val bridges = yajl_tree_get(jupdates, path, yajl_t_object); if (bridges && YAJL_IS_OBJECT(bridges)) { - for (int i = 0; i < YAJL_GET_OBJECT(bridges)->len; i++) { + for (size_t i = 0; i < YAJL_GET_OBJECT(bridges)->len; i++) { yajl_val bridge = YAJL_GET_OBJECT(bridges)->values[i]; ovs_stats_update_bridge(bridge); } @@ -412,7 +414,7 @@ static void ovs_stats_bridge_table_delete_cb(yajl_val jupdates) { yajl_val bridge; if (bridges && YAJL_IS_OBJECT(bridges)) { pthread_mutex_lock(&g_stats_lock); - for (int i = 0; i < YAJL_GET_OBJECT(bridges)->len; i++) { + for (size_t i = 0; i < YAJL_GET_OBJECT(bridges)->len; i++) { bridge = YAJL_GET_OBJECT(bridges)->values[i]; ovs_stats_del_bridge(bridge); } @@ -498,7 +500,7 @@ static void ovs_stats_port_table_change_cb(yajl_val jupdates) { yajl_val ports = yajl_tree_get(jupdates, path, yajl_t_object); yajl_val port; if (ports && YAJL_IS_OBJECT(ports)) { - for (int i = 0; i < YAJL_GET_OBJECT(ports)->len; i++) { + for (size_t i = 0; i < YAJL_GET_OBJECT(ports)->len; i++) { port = YAJL_GET_OBJECT(ports)->values[i]; ovs_stats_update_port(YAJL_GET_OBJECT(ports)->keys[i], port); } @@ -521,7 +523,7 @@ static void ovs_stats_port_table_delete_cb(yajl_val jupdates) { yajl_val ports = yajl_tree_get(jupdates, path, yajl_t_object); pthread_mutex_lock(&g_stats_lock); if (ports && YAJL_IS_OBJECT(ports)) - for (int i = 0; i < YAJL_GET_OBJECT(ports)->len; i++) { + for (size_t i = 0; i < YAJL_GET_OBJECT(ports)->len; i++) { ovs_stats_del_port(YAJL_GET_OBJECT(ports)->keys[i]); } pthread_mutex_unlock(&g_stats_lock); @@ -535,8 +537,10 @@ static int ovs_stats_update_iface_stats(port_list_t *port, yajl_val stats) { char *counter_name = NULL; int64_t counter_value = 0; if (stats && YAJL_IS_ARRAY(stats)) - for (int i = 0; i < YAJL_GET_ARRAY(stats)->len; i++) { + for (size_t i = 0; i < YAJL_GET_ARRAY(stats)->len; i++) { stat = YAJL_GET_ARRAY(stats)->values[i]; + if (!YAJL_IS_ARRAY(stat)) + return (-1); counter_name = YAJL_GET_STRING(YAJL_GET_ARRAY(stat)->values[0]); counter_index = ovs_stats_counter_name_to_type(counter_name); counter_value = YAJL_GET_INTEGER(YAJL_GET_ARRAY(stat)->values[1]); @@ -555,8 +559,10 @@ static int ovs_stats_update_iface_ext_ids(port_list_t *port, yajl_val ext_ids) { char *value; if (ext_ids && YAJL_IS_ARRAY(ext_ids)) - for (int i = 0; i < YAJL_GET_ARRAY(ext_ids)->len; i++) { + for (size_t i = 0; i < YAJL_GET_ARRAY(ext_ids)->len; i++) { ext_id = YAJL_GET_ARRAY(ext_ids)->values[i]; + if (!YAJL_IS_ARRAY(ext_id)) + return (-1); key = YAJL_GET_STRING(YAJL_GET_ARRAY(ext_id)->values[0]); value = YAJL_GET_STRING(YAJL_GET_ARRAY(ext_id)->values[1]); if (key && value) { @@ -681,7 +687,7 @@ static void ovs_stats_interface_table_change_cb(yajl_val jupdates) { yajl_val ports = yajl_tree_get(jupdates, path, yajl_t_object); pthread_mutex_lock(&g_stats_lock); if (ports && YAJL_IS_OBJECT(ports)) - for (int i = 0; i < YAJL_GET_OBJECT(ports)->len; i++) + for (size_t i = 0; i < YAJL_GET_OBJECT(ports)->len; i++) ovs_stats_update_iface(YAJL_GET_OBJECT(ports)->values[i]); pthread_mutex_unlock(&g_stats_lock); return; @@ -875,7 +881,7 @@ static int ovs_stats_plugin_init(void) { static int ovs_stats_plugin_read(__attribute__((unused)) user_data_t *ud) { bridge_list_t *bridge; port_list_t *port; - char devname[PORT_NAME_SIZE_MAX]; + char devname[PORT_NAME_SIZE_MAX * 2]; pthread_mutex_lock(&g_stats_lock); for (bridge = g_bridge_list_head; bridge != NULL; bridge = bridge->next) {