aboutsummaryrefslogtreecommitdiffstats
path: root/wpa_supplicant/dbus
diff options
context:
space:
mode:
authorTodd Previte <toddx.a.previte@intel.com>2012-02-04 13:08:12 +0200
committerJouni Malinen <j@w1.fi>2012-02-04 13:08:12 +0200
commitaa89df56996c0da499f1cdb132893c1863b6b2fb (patch)
tree9f43c23326cd9350cef76f0b364dea0657ad07b6 /wpa_supplicant/dbus
parent96efeeb66bd8762ab9fccd9fe2b5c3e276ff220c (diff)
downloadexternal_wpa_supplicant_8_ti-aa89df56996c0da499f1cdb132893c1863b6b2fb.zip
external_wpa_supplicant_8_ti-aa89df56996c0da499f1cdb132893c1863b6b2fb.tar.gz
external_wpa_supplicant_8_ti-aa89df56996c0da499f1cdb132893c1863b6b2fb.tar.bz2
P2P: Fix DBus crash and return additional P2P group properties
When using DBus to get group properties, a segmentation fault is generated on P2P clients due to a NULL pointer for the ap_iface struct. The current implementation only returns vendor extensions when called on a P2P group owner. The code now checks the P2P role which allows for role-specific information to be provided. This also fixes the crash issue by only looking for the correct structures based on the current P2P role. Signed-hostap: Todd Previte <toddx.a.previte@intel.com> Signed-hostap: Angie Chinchilla <angie.v.chinchilla@intel.com> intended-for: hostap-1
Diffstat (limited to 'wpa_supplicant/dbus')
-rw-r--r--wpa_supplicant/dbus/dbus_new_handlers_p2p.c86
1 files changed, 72 insertions, 14 deletions
diff --git a/wpa_supplicant/dbus/dbus_new_handlers_p2p.c b/wpa_supplicant/dbus/dbus_new_handlers_p2p.c
index 0f6914c..2476e62 100644
--- a/wpa_supplicant/dbus/dbus_new_handlers_p2p.c
+++ b/wpa_supplicant/dbus/dbus_new_handlers_p2p.c
@@ -1664,14 +1664,41 @@ dbus_bool_t wpas_dbus_getter_p2p_group_properties(DBusMessageIter *iter,
{
struct wpa_supplicant *wpa_s = user_data;
DBusMessageIter variant_iter, dict_iter;
- struct hostapd_data *hapd = wpa_s->ap_iface->bss[0];
+ struct hostapd_data *hapd = NULL;
const struct wpabuf *vendor_ext[MAX_WPS_VENDOR_EXTENSIONS];
int num_vendor_ext = 0;
int i;
+ u8 role = wpas_get_p2p_role(wpa_s);
+ u16 op_freq = 0;
+ u8 *p_bssid = NULL;
+ char *role_name = NULL;
- if (!hapd) {
- dbus_set_error_const(error, DBUS_ERROR_FAILED,
- "internal error");
+ if (!wpa_s->current_ssid)
+ return FALSE;
+
+ /* Check current role and adjust information accordingly */
+ switch (role) {
+ case WPAS_P2P_ROLE_CLIENT:
+ /* go_params is only valid for a client */
+ if (wpa_s->go_params) {
+ op_freq = wpa_s->go_params->freq;
+ p_bssid = wpa_s->current_ssid->bssid;
+ role_name = "client";
+ } else
+ return FALSE;
+ break;
+ case WPAS_P2P_ROLE_GO:
+ /* ap_iface is only valid for a GO */
+ if (wpa_s->ap_iface) {
+ hapd = wpa_s->ap_iface->bss[0];
+ p_bssid = hapd->own_addr;
+ op_freq = wpa_s->ap_iface->freq;
+ role_name = "GO";
+ } else
+ return FALSE;
+ break;
+ default:
+ /* Error condition; this should NEVER occur */
return FALSE;
}
@@ -1679,19 +1706,50 @@ dbus_bool_t wpas_dbus_getter_p2p_group_properties(DBusMessageIter *iter,
"a{sv}", &variant_iter) ||
!wpa_dbus_dict_open_write(&variant_iter, &dict_iter))
goto err_no_mem;
+ /* Provide the SSID */
+ if (!wpa_dbus_dict_append_byte_array(
+ &dict_iter, "SSID",
+ (const char *) wpa_s->current_ssid->ssid,
+ wpa_s->current_ssid->ssid_len))
+ goto err_no_mem;
+ /* Provide the BSSID */
+ if (p_bssid &&
+ !wpa_dbus_dict_append_byte_array(&dict_iter, "BSSID",
+ (const char *) p_bssid, ETH_ALEN))
+ goto err_no_mem;
+ /* Provide the role within the group */
+ if (role_name &&
+ !wpa_dbus_dict_append_string(&dict_iter, "Role", role_name))
+ goto err_no_mem;
+ /* Provide the operational frequency */
+ if (!wpa_dbus_dict_append_uint16(&dict_iter, "Frequency", op_freq))
+ goto err_no_mem;
- /* Parse WPS Vendor Extensions sent in Beacon/Probe Response */
- for (i = 0; i < MAX_WPS_VENDOR_EXTENSIONS; i++) {
- if (hapd->conf->wps_vendor_ext[i] == NULL)
- continue;
- vendor_ext[num_vendor_ext++] = hapd->conf->wps_vendor_ext[i];
+ /* Additional information for group owners */
+ if (role == WPAS_P2P_ROLE_GO) {
+ /* Provide the passphrase */
+ if (!wpa_dbus_dict_append_string(&dict_iter, "Passphrase",
+ wpa_s->current_ssid->passphrase))
+ goto err_no_mem;
+ /* Parse WPS Vendor Extensions sent in Beacon/Probe Response */
+ for (i = 0; hapd && i < MAX_WPS_VENDOR_EXTENSIONS; i++) {
+ if (hapd->conf->wps_vendor_ext[i] == NULL)
+ continue;
+ vendor_ext[num_vendor_ext++] =
+ hapd->conf->wps_vendor_ext[i];
+ }
+ if (!wpa_dbus_dict_append_wpabuf_array(&dict_iter,
+ "WPSVendorExtensions",
+ vendor_ext, num_vendor_ext))
+ goto err_no_mem;
+ } else {
+ /* If not a GO, provide the PSK */
+ if (!wpa_dbus_dict_append_byte_array(
+ &dict_iter, "PSK",
+ (const char *) wpa_s->current_ssid->psk, 32))
+ goto err_no_mem;
}
- if (!wpa_dbus_dict_append_wpabuf_array(&dict_iter,
- "WPSVendorExtensions",
- vendor_ext, num_vendor_ext))
- goto err_no_mem;
-
if (!wpa_dbus_dict_close_write(&variant_iter, &dict_iter) ||
!dbus_message_iter_close_container(iter, &variant_iter))
goto err_no_mem;