From 5a65bc37fe33c1690bdebd9485f6c411bf6c6ea2 Mon Sep 17 00:00:00 2001 From: James Prestwood Date: Mon, 8 Feb 2021 11:52:29 -0800 Subject: [PATCH] diagnostics: check dbus variant parsing If the diagnostics dictionary is invalid print an error and do not continue parsing. --- client/diagnostic.c | 43 ++++++++++++++++++++++++++++++------------- 1 file changed, 30 insertions(+), 13 deletions(-) diff --git a/client/diagnostic.c b/client/diagnostic.c index c94178d6..153598ed 100644 --- a/client/diagnostic.c +++ b/client/diagnostic.c @@ -31,7 +31,7 @@ #include "client/diagnostic.h" #include "client/display.h" -typedef void (*display_dict_custom_func_t)(struct l_dbus_message_iter *variant, +typedef bool (*display_dict_custom_func_t)(struct l_dbus_message_iter *variant, const char *key, const char *margin, int name_column_width, int value_column_width); @@ -64,16 +64,19 @@ static const struct diagnostic_dict_mapping *find_mapping(const char *key, return NULL; } -static void display_bitrate_100kbps(struct l_dbus_message_iter *variant, +static bool display_bitrate_100kbps(struct l_dbus_message_iter *variant, const char *key, const char *margin, int name_column_width, int value_column_width) { uint32_t rate; - l_dbus_message_iter_get_variant(variant, "u", &rate); + if (!l_dbus_message_iter_get_variant(variant, "u", &rate)) + return false; display("%s%-*s%-*u Kbit/s\n", margin, name_column_width, key, value_column_width, rate * 100); + + return true; } static const struct diagnostic_dict_mapping diagnostic_mapping[] = { @@ -115,39 +118,48 @@ void diagnostic_display(struct l_dbus_message_iter *dict, if (!map->custom) continue; - map->custom(&variant, key, margin, name_column_width, - value_column_width); + if (!map->custom(&variant, key, margin, name_column_width, + value_column_width)) + goto parse_error; /* custom should handle any units, so continue */ continue; case 's': - l_dbus_message_iter_get_variant(&variant, "s", - &s_value); + if (!l_dbus_message_iter_get_variant(&variant, "s", + &s_value)) + goto parse_error; + sprintf(display_text, "%s%-*s%-*s", margin, name_column_width, key, value_column_width, s_value); break; case 'u': - l_dbus_message_iter_get_variant(&variant, "u", - &u_value); + if (!l_dbus_message_iter_get_variant(&variant, "u", + &u_value)) + goto parse_error; + sprintf(display_text, "%s%-*s%-*u", margin, name_column_width, key, value_column_width, u_value); break; case 'n': - l_dbus_message_iter_get_variant(&variant, "n", - &n_value); + if (!l_dbus_message_iter_get_variant(&variant, "n", + &n_value)) + goto parse_error; + sprintf(display_text, "%s%-*s%-*i", margin, name_column_width, key, value_column_width, n_value); break; case 'y': - l_dbus_message_iter_get_variant(&variant, "y", - &y_value); + if (!l_dbus_message_iter_get_variant(&variant, "y", + &y_value)) + goto parse_error; + sprintf(display_text, "%s%-*s%-*u", margin, name_column_width, key, value_column_width, y_value); @@ -164,4 +176,9 @@ void diagnostic_display(struct l_dbus_message_iter *dict, else display("%s\n", display_text); } + + return; + +parse_error: + display_error("Error parsing dignostics"); }