diff options
author | Szymon Janc <szymon.janc@codecoup.pl> | 2015-11-21 21:09:04 +0100 |
---|---|---|
committer | Szymon Janc <szymon.janc@codecoup.pl> | 2015-11-24 20:57:05 +0100 |
commit | 537c69f76e34d2aa168062098a1125449b3b262b (patch) | |
tree | c453bd45520c09d0d5e79be142512f1395271976 | |
parent | 0e18e5e482ece1f1ecb8d04f500a45b540e40a25 (diff) | |
download | bluez-537c69f76e34d2aa168062098a1125449b3b262b.tar.gz |
monitor: Fix possible crash on unknown LE Meta Event
For unknown LE Meta Event subevent_data passed to print_subevent is
NULL. This results in NULL pointer dereference when subeven code is
printed. Fix that by making print_subevent expect always valid
subevent_data and handle unknown event in caller.
-rw-r--r-- | monitor/packet.c | 27 |
1 files changed, 14 insertions, 13 deletions
diff --git a/monitor/packet.c b/monitor/packet.c index 70bd15314..322bba694 100644 --- a/monitor/packet.c +++ b/monitor/packet.c @@ -8375,23 +8375,17 @@ struct subevent_data { static void print_subevent(const struct subevent_data *subevent_data, const void *data, uint8_t size) { - const char *subevent_color, *subevent_str; + const char *subevent_color; - if (subevent_data) { - if (subevent_data->func) - subevent_color = COLOR_HCI_EVENT; - else - subevent_color = COLOR_HCI_EVENT_UNKNOWN; - subevent_str = subevent_data->str; - } else { + if (subevent_data->func) + subevent_color = COLOR_HCI_EVENT; + else subevent_color = COLOR_HCI_EVENT_UNKNOWN; - subevent_str = "Unknown"; - } - print_indent(6, subevent_color, "", subevent_str, COLOR_OFF, + print_indent(6, subevent_color, "", subevent_data->str, COLOR_OFF, " (0x%2.2x)", subevent_data->subevent); - if (!subevent_data || !subevent_data->func) { + if (!subevent_data->func) { packet_hexdump(data, size); return; } @@ -8442,9 +8436,16 @@ static const struct subevent_data le_meta_event_table[] = { static void le_meta_event_evt(const void *data, uint8_t size) { uint8_t subevent = *((const uint8_t *) data); - const struct subevent_data *subevent_data = NULL; + struct subevent_data unknown; + const struct subevent_data *subevent_data = &unknown; int i; + unknown.subevent = subevent; + unknown.str = "Unknown"; + unknown.func = NULL; + unknown.size = 0; + unknown.fixed = true; + for (i = 0; le_meta_event_table[i].str; i++) { if (le_meta_event_table[i].subevent == subevent) { subevent_data = &le_meta_event_table[i]; |