D-Bus: Remove useless wpa_s->conf checks
[mech_eap.git] / wpa_supplicant / dbus / dbus_new_handlers_p2p.c
index 078468d..e24b216 100644 (file)
@@ -127,6 +127,9 @@ DBusMessage * wpas_dbus_handler_p2p_find(DBusMessage *message,
                wpa_dbus_dict_entry_clear(&entry);
        }
 
+       if (wpa_s->p2p_dev)
+               wpa_s = wpa_s->p2p_dev;
+
        wpas_p2p_find(wpa_s, timeout, type, num_req_dev_types, req_dev_types,
                      NULL, 0);
        os_free(req_dev_types);
@@ -144,6 +147,9 @@ error:
 DBusMessage * wpas_dbus_handler_p2p_stop_find(DBusMessage *message,
                                              struct wpa_supplicant *wpa_s)
 {
+       if (wpa_s->p2p_dev)
+               wpa_s = wpa_s->p2p_dev;
+
        wpas_p2p_stop_find(wpa_s);
        return NULL;
 }
@@ -162,6 +168,9 @@ DBusMessage * wpas_dbus_handler_p2p_rejectpeer(DBusMessage *message,
        if (parse_peer_object_path(peer_object_path, peer_addr) < 0)
                return wpas_dbus_error_invalid_args(message, NULL);
 
+       if (wpa_s->p2p_dev)
+               wpa_s = wpa_s->p2p_dev;
+
        if (wpas_p2p_reject(wpa_s, peer_addr) < 0)
                return wpas_dbus_error_unknown_error(message,
                                "Failed to call wpas_p2p_reject method.");
@@ -180,6 +189,9 @@ DBusMessage * wpas_dbus_handler_p2p_listen(DBusMessage *message,
                return dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY,
                                              NULL);
 
+       if (wpa_s->p2p_dev)
+               wpa_s = wpa_s->p2p_dev;
+
        if (wpas_p2p_listen(wpa_s, (unsigned int)timeout))
                return dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY,
                                              NULL);
@@ -217,6 +229,9 @@ DBusMessage * wpas_dbus_handler_p2p_extendedlisten(
                wpa_dbus_dict_entry_clear(&entry);
        }
 
+       if (wpa_s->p2p_dev)
+               wpa_s = wpa_s->p2p_dev;
+
        if (wpas_p2p_ext_listen(wpa_s, period, interval))
                return wpas_dbus_error_unknown_error(
                        message, "failed to initiate a p2p_ext_listen.");
@@ -265,6 +280,10 @@ DBusMessage * wpas_dbus_handler_p2p_presence_request(
 
                wpa_dbus_dict_entry_clear(&entry);
        }
+
+       if (wpa_s->p2p_dev)
+               wpa_s = wpa_s->p2p_dev;
+
        if (wpas_p2p_presence_req(wpa_s, dur1, int1, dur2, int2) < 0)
                return wpas_dbus_error_unknown_error(message,
                                "Failed to invoke presence request.");
@@ -319,6 +338,9 @@ DBusMessage * wpas_dbus_handler_p2p_group_add(DBusMessage *message,
                wpa_dbus_dict_entry_clear(&entry);
        }
 
+       if (wpa_s->p2p_dev)
+               wpa_s = wpa_s->p2p_dev;
+
        if (pg_object_path != NULL) {
                /*
                 * A persistent group Object Path is defined meaning we want
@@ -410,6 +432,9 @@ DBusMessage * wpas_dbus_handler_p2p_flush(DBusMessage *message,
        if (!wpa_dbus_p2p_check_enabled(wpa_s, message, &reply, NULL))
                return reply;
 
+       if (wpa_s->p2p_dev)
+               wpa_s = wpa_s->p2p_dev;
+
        os_memset(wpa_s->p2p_auth_invite, 0, ETH_ALEN);
        wpa_s->force_long_sd = 0;
        p2p_flush(wpa_s->global->p2p);
@@ -504,6 +529,9 @@ DBusMessage * wpas_dbus_handler_p2p_connect(DBusMessage *message,
        if ((!pin || !pin[0]) && (wps_method == WPS_PIN_KEYPAD))
                goto inv_args;
 
+       if (wpa_s->p2p_dev)
+               wpa_s = wpa_s->p2p_dev;
+
        new_pin = wpas_p2p_connect(wpa_s, addr, pin, wps_method,
                                   persistent_group, 0, join, authorize_only,
                                   go_intent, freq, -1, 0, 0, 0);
@@ -605,6 +633,9 @@ DBusMessage * wpas_dbus_handler_p2p_invite(DBusMessage *message,
                goto err;
        }
 
+       if (wpa_s->p2p_dev)
+               wpa_s = wpa_s->p2p_dev;
+
        if (persistent) {
                /*
                 * A group ID is defined meaning we want to re-invoke a
@@ -690,6 +721,9 @@ DBusMessage * wpas_dbus_handler_p2p_prov_disc_req(DBusMessage *message,
            os_strcmp(config_method, "pushbutton"))
                return wpas_dbus_error_invalid_args(message, NULL);
 
+       if (wpa_s->p2p_dev)
+               wpa_s = wpa_s->p2p_dev;
+
        if (wpas_p2p_prov_disc(wpa_s, peer_addr, config_method,
                               WPAS_P2P_PD_FOR_GO_NEG) < 0)
                return wpas_dbus_error_unknown_error(message,
@@ -719,6 +753,9 @@ dbus_bool_t wpas_dbus_getter_p2p_device_config(DBusMessageIter *iter,
        if (!wpa_dbus_p2p_check_enabled(wpa_s, NULL, NULL, error))
                return FALSE;
 
+       if (wpa_s->p2p_dev)
+               wpa_s = wpa_s->p2p_dev;
+
        if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT,
                                              "a{sv}", &variant_iter) ||
            !wpa_dbus_dict_open_write(&variant_iter, &dict_iter))
@@ -860,6 +897,9 @@ dbus_bool_t wpas_dbus_setter_p2p_device_config(DBusMessageIter *iter,
        if (!wpa_dbus_p2p_check_enabled(wpa_s, NULL, NULL, error))
                return FALSE;
 
+       if (wpa_s->p2p_dev)
+               wpa_s = wpa_s->p2p_dev;
+
        dbus_message_iter_recurse(iter, &variant_iter);
        if (!wpa_dbus_dict_open_read(&variant_iter, &iter_dict, error))
                return FALSE;
@@ -1583,7 +1623,7 @@ dbus_bool_t wpas_dbus_getter_p2p_peer_groups(DBusMessageIter *iter,
        struct peer_handler_args *peer_args = user_data;
        const struct p2p_peer_info *info;
        struct peer_group_data data;
-       struct wpa_supplicant *wpa_s_go;
+       struct wpa_supplicant *wpa_s, *wpa_s_go;
        dbus_bool_t success = FALSE;
 
        info = p2p_get_peer_found(peer_args->wpa_s->global->p2p,
@@ -1595,8 +1635,12 @@ dbus_bool_t wpas_dbus_getter_p2p_peer_groups(DBusMessageIter *iter,
        }
 
        os_memset(&data, 0, sizeof(data));
-       wpa_s_go = wpas_get_p2p_client_iface(peer_args->wpa_s,
-                                            info->p2p_device_addr);
+
+       wpa_s = peer_args->wpa_s;
+       if (wpa_s->p2p_dev)
+               wpa_s = wpa_s->p2p_dev;
+
+       wpa_s_go = wpas_get_p2p_client_iface(wpa_s, info->p2p_device_addr);
        if (wpa_s_go) {
                data.paths = os_calloc(1, sizeof(char *));
                if (data.paths == NULL)
@@ -1651,15 +1695,6 @@ dbus_bool_t wpas_dbus_getter_persistent_groups(DBusMessageIter *iter,
        unsigned int i = 0, num = 0;
        dbus_bool_t success = FALSE;
 
-       if (wpa_s->conf == NULL) {
-               wpa_printf(MSG_ERROR, "dbus: %s: "
-                          "An error occurred getting persistent groups list",
-                          __func__);
-               dbus_set_error_const(error, DBUS_ERROR_FAILED, "an error "
-                                    "occurred getting persistent groups list");
-               return FALSE;
-       }
-
        for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next)
                if (network_is_persistent_group(ssid))
                        num++;
@@ -2150,7 +2185,7 @@ dbus_bool_t wpas_dbus_setter_p2p_group_vendor_ext(DBusMessageIter *iter,
                                                  void *user_data)
 {
        struct wpa_supplicant *wpa_s = user_data;
-       DBusMessageIter variant_iter, iter_dict;
+       DBusMessageIter variant_iter, iter_dict, array_iter, sub;
        struct wpa_dbus_dict_entry entry = { .type = DBUS_TYPE_STRING };
        unsigned int i;
        struct hostapd_data *hapd = NULL;
@@ -2162,6 +2197,82 @@ dbus_bool_t wpas_dbus_setter_p2p_group_vendor_ext(DBusMessageIter *iter,
                return FALSE;
 
        dbus_message_iter_recurse(iter, &variant_iter);
+       if (dbus_message_iter_get_arg_type(&variant_iter) != DBUS_TYPE_ARRAY)
+               return FALSE;
+
+       /*
+        * This is supposed to be array of bytearrays (aay), but the earlier
+        * implementation used a dict with "WPSVendorExtensions" as the key in
+        * this setter function which does not match the format used by the
+        * getter function. For backwards compatibility, allow both formats to
+        * be used in the setter.
+        */
+       if (dbus_message_iter_get_element_type(&variant_iter) ==
+           DBUS_TYPE_ARRAY) {
+               /* This is the proper format matching the getter */
+               struct wpabuf *vals[MAX_WPS_VENDOR_EXTENSIONS];
+
+               dbus_message_iter_recurse(&variant_iter, &array_iter);
+
+               if (dbus_message_iter_get_arg_type(&array_iter) !=
+                   DBUS_TYPE_ARRAY ||
+                   dbus_message_iter_get_element_type(&array_iter) !=
+                   DBUS_TYPE_BYTE) {
+                       wpa_printf(MSG_DEBUG,
+                                  "dbus: Not an array of array of bytes");
+                       return FALSE;
+               }
+
+               i = 0;
+               os_memset(vals, 0, sizeof(vals));
+
+               while (dbus_message_iter_get_arg_type(&array_iter) ==
+                      DBUS_TYPE_ARRAY) {
+                       char *val;
+                       int len;
+
+                       if (i == MAX_WPS_VENDOR_EXTENSIONS) {
+                               wpa_printf(MSG_DEBUG,
+                                          "dbus: Too many WPSVendorExtensions values");
+                               i = MAX_WPS_VENDOR_EXTENSIONS + 1;
+                               break;
+                       }
+
+                       dbus_message_iter_recurse(&array_iter, &sub);
+                       dbus_message_iter_get_fixed_array(&sub, &val, &len);
+                       wpa_hexdump(MSG_DEBUG, "dbus: WPSVendorExtentions[]",
+                                   val, len);
+                       vals[i] = wpabuf_alloc_copy(val, len);
+                       if (vals[i] == NULL) {
+                               i = MAX_WPS_VENDOR_EXTENSIONS + 1;
+                               break;
+                       }
+                       i++;
+                       dbus_message_iter_next(&array_iter);
+               }
+
+               if (i > MAX_WPS_VENDOR_EXTENSIONS) {
+                       for (i = 0; i < MAX_WPS_VENDOR_EXTENSIONS; i++)
+                               wpabuf_free(vals[i]);
+                       return FALSE;
+               }
+
+               for (i = 0; i < MAX_WPS_VENDOR_EXTENSIONS; i++) {
+                       wpabuf_free(hapd->conf->wps_vendor_ext[i]);
+                       hapd->conf->wps_vendor_ext[i] = vals[i];
+               }
+
+               hostapd_update_wps(hapd);
+
+               return TRUE;
+       }
+
+       if (dbus_message_iter_get_element_type(&variant_iter) !=
+           DBUS_TYPE_DICT_ENTRY)
+               return FALSE;
+
+       wpa_printf(MSG_DEBUG,
+                  "dbus: Try to use backwards compatibility version of WPSVendorExtensions setter");
        if (!wpa_dbus_dict_open_read(&variant_iter, &iter_dict, error))
                return FALSE;
 
@@ -2179,6 +2290,7 @@ dbus_bool_t wpas_dbus_setter_p2p_group_vendor_ext(DBusMessageIter *iter,
                                goto error;
 
                        for (i = 0; i < MAX_WPS_VENDOR_EXTENSIONS; i++) {
+                               wpabuf_free(hapd->conf->wps_vendor_ext[i]);
                                if (i < entry.array_len) {
                                        hapd->conf->wps_vendor_ext[i] =
                                                entry.binarray_value[i];
@@ -2240,6 +2352,7 @@ DBusMessage * wpas_dbus_handler_p2p_add_service(DBusMessage *message,
                        version = entry.uint32_value;
                } else if (!os_strcmp(entry.key, "service") &&
                             (entry.type == DBUS_TYPE_STRING)) {
+                       os_free(service);
                        service = os_strdup(entry.str_value);
                } else if (!os_strcmp(entry.key, "query")) {
                        if ((entry.type != DBUS_TYPE_ARRAY) ||
@@ -2265,8 +2378,6 @@ DBusMessage * wpas_dbus_handler_p2p_add_service(DBusMessage *message,
                if (wpas_p2p_service_add_upnp(wpa_s, version, service) != 0)
                        goto error;
 
-               os_free(service);
-               service = NULL;
        } else if (bonjour == 1) {
                if (query == NULL || resp == NULL)
                        goto error;
@@ -2278,6 +2389,7 @@ DBusMessage * wpas_dbus_handler_p2p_add_service(DBusMessage *message,
        } else
                goto error;
 
+       os_free(service);
        return reply;
 error_clear:
        wpa_dbus_dict_entry_clear(&entry);
@@ -2331,9 +2443,10 @@ DBusMessage * wpas_dbus_handler_p2p_delete_service(
                            entry.type == DBUS_TYPE_INT32)
                                version = entry.uint32_value;
                        else if (!os_strcmp(entry.key, "service") &&
-                                entry.type == DBUS_TYPE_STRING)
+                                entry.type == DBUS_TYPE_STRING) {
+                               os_free(service);
                                service = os_strdup(entry.str_value);
-                       else
+                       else
                                goto error_clear;
 
                        wpa_dbus_dict_entry_clear(&entry);
@@ -2343,7 +2456,6 @@ DBusMessage * wpas_dbus_handler_p2p_delete_service(
                        goto error;
 
                ret = wpas_p2p_service_del_upnp(wpa_s, version, service);
-               os_free(service);
                if (ret != 0)
                        goto error;
        } else if (bonjour == 1) {
@@ -2355,6 +2467,7 @@ DBusMessage * wpas_dbus_handler_p2p_delete_service(
                                if ((entry.type != DBUS_TYPE_ARRAY) ||
                                    (entry.array_type != DBUS_TYPE_BYTE))
                                        goto error_clear;
+                               wpabuf_free(query);
                                query = wpabuf_alloc_copy(
                                        entry.bytearray_value,
                                        entry.array_len);
@@ -2370,14 +2483,17 @@ DBusMessage * wpas_dbus_handler_p2p_delete_service(
                ret = wpas_p2p_service_del_bonjour(wpa_s, query);
                if (ret != 0)
                        goto error;
-               wpabuf_free(query);
        } else
                goto error;
 
+       wpabuf_free(query);
+       os_free(service);
        return reply;
 error_clear:
        wpa_dbus_dict_entry_clear(&entry);
 error:
+       wpabuf_free(query);
+       os_free(service);
        return wpas_dbus_error_invalid_args(message, NULL);
 }
 
@@ -2513,7 +2629,8 @@ DBusMessage * wpas_dbus_handler_p2p_service_sd_res(
                           entry.type == DBUS_TYPE_INT32) {
                        freq = entry.uint32_value;
                } else if (!os_strcmp(entry.key, "dialog_token") &&
-                          entry.type == DBUS_TYPE_UINT32) {
+                          (entry.type == DBUS_TYPE_UINT32 ||
+                           entry.type == DBUS_TYPE_INT32)) {
                        dlg_tok = entry.uint32_value;
                } else if (!os_strcmp(entry.key, "tlvs")) {
                        if (entry.type != DBUS_TYPE_ARRAY ||