From bab6677a3105f15b19b6be4a189e7baf61b4f791 Mon Sep 17 00:00:00 2001 From: Jouni Malinen Date: Thu, 6 Feb 2014 16:03:42 +0200 Subject: [PATCH] Handle Wi-Fi Display commands more carefully if P2P is disabled If P2P was disabled (e.g., due to driver not supporting it or through p2p_disabled=1 configuration), setting Wi-Fi Display parameters could result in segmentation fault when the WFD IE is updated without the P2P module being initialized. Fix this by skipping the update if P2P module is not in use. In addition, show Wi-Fi Display as disabled in "GET wifi_display" and refuse to enable it with "SET wifi_display 1" if P2P is not enabled. Signed-hostap: Jouni Malinen --- wpa_supplicant/ctrl_iface.c | 15 ++++++++++++--- wpa_supplicant/wifi_display.c | 3 +++ 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/wpa_supplicant/ctrl_iface.c b/wpa_supplicant/ctrl_iface.c index 9a3cbeaef..3deb05f32 100644 --- a/wpa_supplicant/ctrl_iface.c +++ b/wpa_supplicant/ctrl_iface.c @@ -440,7 +440,11 @@ static int wpa_supplicant_ctrl_iface_set(struct wpa_supplicant *wpa_s, ret = wpa_drv_set_p2p_powersave(wpa_s, atoi(value), -1, -1); #ifdef CONFIG_WIFI_DISPLAY } else if (os_strcasecmp(cmd, "wifi_display") == 0) { - wifi_display_enable(wpa_s->global, !!atoi(value)); + int enabled = !!atoi(value); + if (enabled && !wpa_s->global->p2p) + ret = -1; + else + wifi_display_enable(wpa_s->global, enabled); #endif /* CONFIG_WIFI_DISPLAY */ } else if (os_strcasecmp(cmd, "bssid_filter") == 0) { ret = set_bssid_filter(wpa_s, value); @@ -475,8 +479,13 @@ static int wpa_supplicant_ctrl_iface_get(struct wpa_supplicant *wpa_s, wpa_s->conf->country[1]); #ifdef CONFIG_WIFI_DISPLAY } else if (os_strcasecmp(cmd, "wifi_display") == 0) { - res = os_snprintf(buf, buflen, "%d", - wpa_s->global->wifi_display); + int enabled; + if (wpa_s->global->p2p == NULL || + wpa_s->global->p2p_disabled) + enabled = 0; + else + enabled = wpa_s->global->wifi_display; + res = os_snprintf(buf, buflen, "%d", enabled); if (res < 0 || (unsigned int) res >= buflen) return -1; return res; diff --git a/wpa_supplicant/wifi_display.c b/wpa_supplicant/wifi_display.c index 578199ebe..8435b63a7 100644 --- a/wpa_supplicant/wifi_display.c +++ b/wpa_supplicant/wifi_display.c @@ -41,6 +41,9 @@ static int wifi_display_update_wfd_ie(struct wpa_global *global) struct wpabuf *ie, *buf; size_t len, plen; + if (global->p2p == NULL) + return 0; + wpa_printf(MSG_DEBUG, "WFD: Update WFD IE"); if (!global->wifi_display) {