D-Bus: Fix operations when P2P management interface is used
Commit 21efc940f6 ('wpa_supplicant: Do not
register a P2P management interface on DBus') hides the special P2P
management interface from D-Bus. However, it did not take into account
the possibility of wpa_s->dbus_path and wpa_s->dbus_new_path being NULL
in such cases on number of code paths within the D-Bus handlers. This
could result in invalid arguments (NULL path) being provided to D-Bus
functions (mainly, dbus_message_iter_append_basic) and NULL pointer
dereference when iterating over all interfaces. Either of these could
make wpa_supplicant process terminate.
Fix this by explicitly checking that the interface-specific D-Bus path
has been registered before using it anywhere with D-Bus handlers. In
addition, find the correct wpa_s instance to fix P2P operations through
D-Bus when the P2P Device interface is used.
Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com>
			
			
This commit is contained in:
		
							parent
							
								
									dea0d8ee29
								
							
						
					
					
						commit
						8a78e227df
					
				
					 6 changed files with 156 additions and 73 deletions
				
			
		|  | @ -137,7 +137,7 @@ static void wpas_dbus_signal_interface(struct wpa_supplicant *wpa_s, | ||||||
| 	iface = wpa_s->global->dbus; | 	iface = wpa_s->global->dbus; | ||||||
| 
 | 
 | ||||||
| 	/* Do nothing if the control interface is not turned on */ | 	/* Do nothing if the control interface is not turned on */ | ||||||
| 	if (iface == NULL) | 	if (iface == NULL || !wpa_s->dbus_new_path) | ||||||
| 		return; | 		return; | ||||||
| 
 | 
 | ||||||
| 	msg = dbus_message_new_signal(WPAS_DBUS_NEW_PATH, | 	msg = dbus_message_new_signal(WPAS_DBUS_NEW_PATH, | ||||||
|  | @ -200,7 +200,7 @@ void wpas_dbus_signal_scan_done(struct wpa_supplicant *wpa_s, int success) | ||||||
| 	iface = wpa_s->global->dbus; | 	iface = wpa_s->global->dbus; | ||||||
| 
 | 
 | ||||||
| 	/* Do nothing if the control interface is not turned on */ | 	/* Do nothing if the control interface is not turned on */ | ||||||
| 	if (iface == NULL) | 	if (iface == NULL || !wpa_s->dbus_new_path) | ||||||
| 		return; | 		return; | ||||||
| 
 | 
 | ||||||
| 	msg = dbus_message_new_signal(wpa_s->dbus_new_path, | 	msg = dbus_message_new_signal(wpa_s->dbus_new_path, | ||||||
|  | @ -239,7 +239,7 @@ static void wpas_dbus_signal_bss(struct wpa_supplicant *wpa_s, | ||||||
| 	iface = wpa_s->global->dbus; | 	iface = wpa_s->global->dbus; | ||||||
| 
 | 
 | ||||||
| 	/* Do nothing if the control interface is not turned on */ | 	/* Do nothing if the control interface is not turned on */ | ||||||
| 	if (iface == NULL) | 	if (iface == NULL || !wpa_s->dbus_new_path) | ||||||
| 		return; | 		return; | ||||||
| 
 | 
 | ||||||
| 	msg = dbus_message_new_signal(wpa_s->dbus_new_path, | 	msg = dbus_message_new_signal(wpa_s->dbus_new_path, | ||||||
|  | @ -307,7 +307,7 @@ static void wpas_dbus_signal_blob(struct wpa_supplicant *wpa_s, | ||||||
| 	iface = wpa_s->global->dbus; | 	iface = wpa_s->global->dbus; | ||||||
| 
 | 
 | ||||||
| 	/* Do nothing if the control interface is not turned on */ | 	/* Do nothing if the control interface is not turned on */ | ||||||
| 	if (iface == NULL) | 	if (iface == NULL || !wpa_s->dbus_new_path) | ||||||
| 		return; | 		return; | ||||||
| 
 | 
 | ||||||
| 	msg = dbus_message_new_signal(wpa_s->dbus_new_path, | 	msg = dbus_message_new_signal(wpa_s->dbus_new_path, | ||||||
|  | @ -374,7 +374,7 @@ static void wpas_dbus_signal_network(struct wpa_supplicant *wpa_s, | ||||||
| 	iface = wpa_s->global->dbus; | 	iface = wpa_s->global->dbus; | ||||||
| 
 | 
 | ||||||
| 	/* Do nothing if the control interface is not turned on */ | 	/* Do nothing if the control interface is not turned on */ | ||||||
| 	if (iface == NULL) | 	if (iface == NULL || !wpa_s->dbus_new_path) | ||||||
| 		return; | 		return; | ||||||
| 
 | 
 | ||||||
| 	os_snprintf(net_obj_path, WPAS_DBUS_OBJECT_PATH_MAX, | 	os_snprintf(net_obj_path, WPAS_DBUS_OBJECT_PATH_MAX, | ||||||
|  | @ -467,7 +467,7 @@ void wpas_dbus_signal_network_request(struct wpa_supplicant *wpa_s, | ||||||
| 	iface = wpa_s->global->dbus; | 	iface = wpa_s->global->dbus; | ||||||
| 
 | 
 | ||||||
| 	/* Do nothing if the control interface is not turned on */ | 	/* Do nothing if the control interface is not turned on */ | ||||||
| 	if (iface == NULL) | 	if (iface == NULL || !wpa_s->dbus_new_path) | ||||||
| 		return; | 		return; | ||||||
| 
 | 
 | ||||||
| 	field = wpa_supplicant_ctrl_req_to_string(rtype, default_txt, &txt); | 	field = wpa_supplicant_ctrl_req_to_string(rtype, default_txt, &txt); | ||||||
|  | @ -511,6 +511,8 @@ void wpas_dbus_signal_network_enabled_changed(struct wpa_supplicant *wpa_s, | ||||||
| 
 | 
 | ||||||
| 	char path[WPAS_DBUS_OBJECT_PATH_MAX]; | 	char path[WPAS_DBUS_OBJECT_PATH_MAX]; | ||||||
| 
 | 
 | ||||||
|  | 	if (!wpa_s->dbus_new_path) | ||||||
|  | 		return; | ||||||
| 	os_snprintf(path, WPAS_DBUS_OBJECT_PATH_MAX, | 	os_snprintf(path, WPAS_DBUS_OBJECT_PATH_MAX, | ||||||
| 		    "%s/" WPAS_DBUS_NEW_NETWORKS_PART "/%d", | 		    "%s/" WPAS_DBUS_NEW_NETWORKS_PART "/%d", | ||||||
| 		    wpa_s->dbus_new_path, ssid->id); | 		    wpa_s->dbus_new_path, ssid->id); | ||||||
|  | @ -539,7 +541,7 @@ void wpas_dbus_signal_wps_event_success(struct wpa_supplicant *wpa_s) | ||||||
| 	iface = wpa_s->global->dbus; | 	iface = wpa_s->global->dbus; | ||||||
| 
 | 
 | ||||||
| 	/* Do nothing if the control interface is not turned on */ | 	/* Do nothing if the control interface is not turned on */ | ||||||
| 	if (iface == NULL) | 	if (iface == NULL || !wpa_s->dbus_new_path) | ||||||
| 		return; | 		return; | ||||||
| 
 | 
 | ||||||
| 	msg = dbus_message_new_signal(wpa_s->dbus_new_path, | 	msg = dbus_message_new_signal(wpa_s->dbus_new_path, | ||||||
|  | @ -579,7 +581,7 @@ void wpas_dbus_signal_wps_event_fail(struct wpa_supplicant *wpa_s, | ||||||
| 	iface = wpa_s->global->dbus; | 	iface = wpa_s->global->dbus; | ||||||
| 
 | 
 | ||||||
| 	/* Do nothing if the control interface is not turned on */ | 	/* Do nothing if the control interface is not turned on */ | ||||||
| 	if (iface == NULL) | 	if (iface == NULL || !wpa_s->dbus_new_path) | ||||||
| 		return; | 		return; | ||||||
| 
 | 
 | ||||||
| 	msg = dbus_message_new_signal(wpa_s->dbus_new_path, | 	msg = dbus_message_new_signal(wpa_s->dbus_new_path, | ||||||
|  | @ -620,7 +622,7 @@ void wpas_dbus_signal_wps_event_m2d(struct wpa_supplicant *wpa_s, | ||||||
| 	iface = wpa_s->global->dbus; | 	iface = wpa_s->global->dbus; | ||||||
| 
 | 
 | ||||||
| 	/* Do nothing if the control interface is not turned on */ | 	/* Do nothing if the control interface is not turned on */ | ||||||
| 	if (iface == NULL) | 	if (iface == NULL || !wpa_s->dbus_new_path) | ||||||
| 		return; | 		return; | ||||||
| 
 | 
 | ||||||
| 	msg = dbus_message_new_signal(wpa_s->dbus_new_path, | 	msg = dbus_message_new_signal(wpa_s->dbus_new_path, | ||||||
|  | @ -686,7 +688,7 @@ void wpas_dbus_signal_wps_cred(struct wpa_supplicant *wpa_s, | ||||||
| 	iface = wpa_s->global->dbus; | 	iface = wpa_s->global->dbus; | ||||||
| 
 | 
 | ||||||
| 	/* Do nothing if the control interface is not turned on */ | 	/* Do nothing if the control interface is not turned on */ | ||||||
| 	if (iface == NULL) | 	if (iface == NULL || !wpa_s->dbus_new_path) | ||||||
| 		return; | 		return; | ||||||
| 
 | 
 | ||||||
| 	msg = dbus_message_new_signal(wpa_s->dbus_new_path, | 	msg = dbus_message_new_signal(wpa_s->dbus_new_path, | ||||||
|  | @ -760,7 +762,7 @@ void wpas_dbus_signal_certification(struct wpa_supplicant *wpa_s, | ||||||
| 	iface = wpa_s->global->dbus; | 	iface = wpa_s->global->dbus; | ||||||
| 
 | 
 | ||||||
| 	/* Do nothing if the control interface is not turned on */ | 	/* Do nothing if the control interface is not turned on */ | ||||||
| 	if (iface == NULL) | 	if (iface == NULL || !wpa_s->dbus_new_path) | ||||||
| 		return; | 		return; | ||||||
| 
 | 
 | ||||||
| 	msg = dbus_message_new_signal(wpa_s->dbus_new_path, | 	msg = dbus_message_new_signal(wpa_s->dbus_new_path, | ||||||
|  | @ -801,7 +803,7 @@ void wpas_dbus_signal_eap_status(struct wpa_supplicant *wpa_s, | ||||||
| 	iface = wpa_s->global->dbus; | 	iface = wpa_s->global->dbus; | ||||||
| 
 | 
 | ||||||
| 	/* Do nothing if the control interface is not turned on */ | 	/* Do nothing if the control interface is not turned on */ | ||||||
| 	if (iface == NULL) | 	if (iface == NULL || !wpa_s->dbus_new_path) | ||||||
| 		return; | 		return; | ||||||
| 
 | 
 | ||||||
| 	msg = dbus_message_new_signal(wpa_s->dbus_new_path, | 	msg = dbus_message_new_signal(wpa_s->dbus_new_path, | ||||||
|  | @ -844,7 +846,7 @@ static void wpas_dbus_signal_sta(struct wpa_supplicant *wpa_s, | ||||||
| 	iface = wpa_s->global->dbus; | 	iface = wpa_s->global->dbus; | ||||||
| 
 | 
 | ||||||
| 	/* Do nothing if the control interface is not turned on */ | 	/* Do nothing if the control interface is not turned on */ | ||||||
| 	if (iface == NULL) | 	if (iface == NULL || !wpa_s->dbus_new_path) | ||||||
| 		return; | 		return; | ||||||
| 
 | 
 | ||||||
| 	msg = dbus_message_new_signal(wpa_s->dbus_new_path, | 	msg = dbus_message_new_signal(wpa_s->dbus_new_path, | ||||||
|  | @ -916,7 +918,8 @@ void wpas_dbus_signal_p2p_group_removed(struct wpa_supplicant *wpa_s, | ||||||
| 	if (parent->p2p_mgmt) | 	if (parent->p2p_mgmt) | ||||||
| 		parent = parent->parent; | 		parent = parent->parent; | ||||||
| 
 | 
 | ||||||
| 	if (!wpa_s->dbus_groupobj_path) | 	if (!wpa_s->dbus_groupobj_path || !wpa_s->dbus_new_path || | ||||||
|  | 	    !parent->dbus_new_path) | ||||||
| 		return; | 		return; | ||||||
| 
 | 
 | ||||||
| 	msg = dbus_message_new_signal(parent->dbus_new_path, | 	msg = dbus_message_new_signal(parent->dbus_new_path, | ||||||
|  | @ -984,6 +987,8 @@ void wpas_dbus_signal_p2p_provision_discovery(struct wpa_supplicant *wpa_s, | ||||||
| 
 | 
 | ||||||
| 	if (wpa_s->p2p_mgmt) | 	if (wpa_s->p2p_mgmt) | ||||||
| 		wpa_s = wpa_s->parent; | 		wpa_s = wpa_s->parent; | ||||||
|  | 	if (!wpa_s->dbus_new_path) | ||||||
|  | 		return; | ||||||
| 
 | 
 | ||||||
| 	if (request || !status) { | 	if (request || !status) { | ||||||
| 		if (config_methods & WPS_CONFIG_DISPLAY) | 		if (config_methods & WPS_CONFIG_DISPLAY) | ||||||
|  | @ -1073,6 +1078,8 @@ void wpas_dbus_signal_p2p_go_neg_req(struct wpa_supplicant *wpa_s, | ||||||
| 
 | 
 | ||||||
| 	if (wpa_s->p2p_mgmt) | 	if (wpa_s->p2p_mgmt) | ||||||
| 		wpa_s = wpa_s->parent; | 		wpa_s = wpa_s->parent; | ||||||
|  | 	if (!wpa_s->dbus_new_path) | ||||||
|  | 		return; | ||||||
| 
 | 
 | ||||||
| 	os_snprintf(peer_obj_path, WPAS_DBUS_OBJECT_PATH_MAX, | 	os_snprintf(peer_obj_path, WPAS_DBUS_OBJECT_PATH_MAX, | ||||||
| 		    "%s/" WPAS_DBUS_NEW_P2P_PEERS_PART "/" COMPACT_MACSTR, | 		    "%s/" WPAS_DBUS_NEW_P2P_PEERS_PART "/" COMPACT_MACSTR, | ||||||
|  | @ -1105,7 +1112,8 @@ static int wpas_dbus_get_group_obj_path(struct wpa_supplicant *wpa_s, | ||||||
| { | { | ||||||
| 	char group_name[3]; | 	char group_name[3]; | ||||||
| 
 | 
 | ||||||
| 	if (os_memcmp(ssid->ssid, P2P_WILDCARD_SSID, P2P_WILDCARD_SSID_LEN)) | 	if (!wpa_s->dbus_new_path || | ||||||
|  | 	    os_memcmp(ssid->ssid, P2P_WILDCARD_SSID, P2P_WILDCARD_SSID_LEN)) | ||||||
| 		return -1; | 		return -1; | ||||||
| 
 | 
 | ||||||
| 	os_memcpy(group_name, ssid->ssid + P2P_WILDCARD_SSID_LEN, 2); | 	os_memcpy(group_name, ssid->ssid + P2P_WILDCARD_SSID_LEN, 2); | ||||||
|  | @ -1209,7 +1217,7 @@ void wpas_dbus_signal_p2p_group_started(struct wpa_supplicant *wpa_s, | ||||||
| 	iface = parent->global->dbus; | 	iface = parent->global->dbus; | ||||||
| 
 | 
 | ||||||
| 	/* Do nothing if the control interface is not turned on */ | 	/* Do nothing if the control interface is not turned on */ | ||||||
| 	if (iface == NULL) | 	if (iface == NULL || !parent->dbus_new_path || !wpa_s->dbus_new_path) | ||||||
| 		return; | 		return; | ||||||
| 
 | 
 | ||||||
| 	if (wpa_s->dbus_groupobj_path == NULL) | 	if (wpa_s->dbus_groupobj_path == NULL) | ||||||
|  | @ -1272,7 +1280,7 @@ void wpas_dbus_signal_p2p_go_neg_resp(struct wpa_supplicant *wpa_s, | ||||||
| 
 | 
 | ||||||
| 	os_memset(freqs, 0, sizeof(freqs)); | 	os_memset(freqs, 0, sizeof(freqs)); | ||||||
| 	/* Do nothing if the control interface is not turned on */ | 	/* Do nothing if the control interface is not turned on */ | ||||||
| 	if (iface == NULL) | 	if (iface == NULL || !wpa_s->dbus_new_path) | ||||||
| 		return; | 		return; | ||||||
| 
 | 
 | ||||||
| 	os_snprintf(peer_obj_path, WPAS_DBUS_OBJECT_PATH_MAX, | 	os_snprintf(peer_obj_path, WPAS_DBUS_OBJECT_PATH_MAX, | ||||||
|  | @ -1386,6 +1394,8 @@ void wpas_dbus_signal_p2p_invitation_result(struct wpa_supplicant *wpa_s, | ||||||
| 
 | 
 | ||||||
| 	if (wpa_s->p2p_mgmt) | 	if (wpa_s->p2p_mgmt) | ||||||
| 		wpa_s = wpa_s->parent; | 		wpa_s = wpa_s->parent; | ||||||
|  | 	if (!wpa_s->dbus_new_path) | ||||||
|  | 		return; | ||||||
| 
 | 
 | ||||||
| 	msg = dbus_message_new_signal(wpa_s->dbus_new_path, | 	msg = dbus_message_new_signal(wpa_s->dbus_new_path, | ||||||
| 				      WPAS_DBUS_NEW_IFACE_P2PDEVICE, | 				      WPAS_DBUS_NEW_IFACE_P2PDEVICE, | ||||||
|  | @ -1439,6 +1449,8 @@ void wpas_dbus_signal_p2p_peer_joined(struct wpa_supplicant *wpa_s, | ||||||
| 	parent = wpa_s->parent; | 	parent = wpa_s->parent; | ||||||
| 	if (parent->p2p_mgmt) | 	if (parent->p2p_mgmt) | ||||||
| 		parent = parent->parent; | 		parent = parent->parent; | ||||||
|  | 	if (!parent->dbus_new_path) | ||||||
|  | 		return; | ||||||
| 
 | 
 | ||||||
| 	os_snprintf(peer_obj_path, WPAS_DBUS_OBJECT_PATH_MAX, | 	os_snprintf(peer_obj_path, WPAS_DBUS_OBJECT_PATH_MAX, | ||||||
| 			"%s/" WPAS_DBUS_NEW_P2P_PEERS_PART "/" | 			"%s/" WPAS_DBUS_NEW_P2P_PEERS_PART "/" | ||||||
|  | @ -1494,6 +1506,8 @@ void wpas_dbus_signal_p2p_peer_disconnected(struct wpa_supplicant *wpa_s, | ||||||
| 	parent = wpa_s->parent; | 	parent = wpa_s->parent; | ||||||
| 	if (parent->p2p_mgmt) | 	if (parent->p2p_mgmt) | ||||||
| 		parent = parent->parent; | 		parent = parent->parent; | ||||||
|  | 	if (!parent->dbus_new_path) | ||||||
|  | 		return; | ||||||
| 
 | 
 | ||||||
| 	os_snprintf(peer_obj_path, WPAS_DBUS_OBJECT_PATH_MAX, | 	os_snprintf(peer_obj_path, WPAS_DBUS_OBJECT_PATH_MAX, | ||||||
| 			"%s/" WPAS_DBUS_NEW_P2P_PEERS_PART "/" | 			"%s/" WPAS_DBUS_NEW_P2P_PEERS_PART "/" | ||||||
|  | @ -1551,6 +1565,8 @@ void wpas_dbus_signal_p2p_sd_request(struct wpa_supplicant *wpa_s, | ||||||
| 
 | 
 | ||||||
| 	if (wpa_s->p2p_mgmt) | 	if (wpa_s->p2p_mgmt) | ||||||
| 		wpa_s = wpa_s->parent; | 		wpa_s = wpa_s->parent; | ||||||
|  | 	if (!wpa_s->dbus_new_path) | ||||||
|  | 		return; | ||||||
| 
 | 
 | ||||||
| 	/* Check if this is a known peer */ | 	/* Check if this is a known peer */ | ||||||
| 	if (!p2p_peer_known(wpa_s->global->p2p, sa)) | 	if (!p2p_peer_known(wpa_s->global->p2p, sa)) | ||||||
|  | @ -1617,6 +1633,8 @@ void wpas_dbus_signal_p2p_sd_response(struct wpa_supplicant *wpa_s, | ||||||
| 
 | 
 | ||||||
| 	if (wpa_s->p2p_mgmt) | 	if (wpa_s->p2p_mgmt) | ||||||
| 		wpa_s = wpa_s->parent; | 		wpa_s = wpa_s->parent; | ||||||
|  | 	if (!wpa_s->dbus_new_path) | ||||||
|  | 		return; | ||||||
| 
 | 
 | ||||||
| 	/* Check if this is a known peer */ | 	/* Check if this is a known peer */ | ||||||
| 	if (!p2p_peer_known(wpa_s->global->p2p, sa)) | 	if (!p2p_peer_known(wpa_s->global->p2p, sa)) | ||||||
|  | @ -1678,6 +1696,8 @@ static void wpas_dbus_signal_persistent_group(struct wpa_supplicant *wpa_s, | ||||||
| 
 | 
 | ||||||
| 	if (wpa_s->p2p_mgmt) | 	if (wpa_s->p2p_mgmt) | ||||||
| 		wpa_s = wpa_s->parent; | 		wpa_s = wpa_s->parent; | ||||||
|  | 	if (!wpa_s->dbus_new_path) | ||||||
|  | 		return; | ||||||
| 
 | 
 | ||||||
| 	os_snprintf(pgrp_obj_path, WPAS_DBUS_OBJECT_PATH_MAX, | 	os_snprintf(pgrp_obj_path, WPAS_DBUS_OBJECT_PATH_MAX, | ||||||
| 		    "%s/" WPAS_DBUS_NEW_PERSISTENT_GROUPS_PART "/%u", | 		    "%s/" WPAS_DBUS_NEW_PERSISTENT_GROUPS_PART "/%u", | ||||||
|  | @ -1762,6 +1782,8 @@ void wpas_dbus_signal_p2p_wps_failed(struct wpa_supplicant *wpa_s, | ||||||
| 	if (wpa_s->p2p_mgmt) | 	if (wpa_s->p2p_mgmt) | ||||||
| 		wpa_s = wpa_s->parent; | 		wpa_s = wpa_s->parent; | ||||||
| 
 | 
 | ||||||
|  | 	if (!wpa_s->dbus_new_path) | ||||||
|  | 		return; | ||||||
| 	msg = dbus_message_new_signal(wpa_s->dbus_new_path, | 	msg = dbus_message_new_signal(wpa_s->dbus_new_path, | ||||||
| 				      WPAS_DBUS_NEW_IFACE_P2PDEVICE, | 				      WPAS_DBUS_NEW_IFACE_P2PDEVICE, | ||||||
| 				      "WpsFailed"); | 				      "WpsFailed"); | ||||||
|  | @ -1862,6 +1884,9 @@ void wpas_dbus_bss_signal_prop_changed(struct wpa_supplicant *wpa_s, | ||||||
| 	char path[WPAS_DBUS_OBJECT_PATH_MAX]; | 	char path[WPAS_DBUS_OBJECT_PATH_MAX]; | ||||||
| 	char *prop; | 	char *prop; | ||||||
| 
 | 
 | ||||||
|  | 	if (!wpa_s->dbus_new_path) | ||||||
|  | 		return; | ||||||
|  | 
 | ||||||
| 	switch (property) { | 	switch (property) { | ||||||
| 	case WPAS_DBUS_BSS_PROP_SIGNAL: | 	case WPAS_DBUS_BSS_PROP_SIGNAL: | ||||||
| 		prop = "Signal"; | 		prop = "Signal"; | ||||||
|  | @ -2177,7 +2202,7 @@ int wpas_dbus_register_network(struct wpa_supplicant *wpa_s, | ||||||
| #endif /* CONFIG_P2P */ | #endif /* CONFIG_P2P */ | ||||||
| 
 | 
 | ||||||
| 	/* Do nothing if the control interface is not turned on */ | 	/* Do nothing if the control interface is not turned on */ | ||||||
| 	if (wpa_s == NULL || wpa_s->global == NULL) | 	if (wpa_s == NULL || wpa_s->global == NULL || !wpa_s->dbus_new_path) | ||||||
| 		return 0; | 		return 0; | ||||||
| 	ctrl_iface = wpa_s->global->dbus; | 	ctrl_iface = wpa_s->global->dbus; | ||||||
| 	if (ctrl_iface == NULL) | 	if (ctrl_iface == NULL) | ||||||
|  | @ -2351,7 +2376,7 @@ int wpas_dbus_unregister_bss(struct wpa_supplicant *wpa_s, | ||||||
| 	char bss_obj_path[WPAS_DBUS_OBJECT_PATH_MAX]; | 	char bss_obj_path[WPAS_DBUS_OBJECT_PATH_MAX]; | ||||||
| 
 | 
 | ||||||
| 	/* Do nothing if the control interface is not turned on */ | 	/* Do nothing if the control interface is not turned on */ | ||||||
| 	if (wpa_s == NULL || wpa_s->global == NULL) | 	if (wpa_s == NULL || wpa_s->global == NULL || !wpa_s->dbus_new_path) | ||||||
| 		return 0; | 		return 0; | ||||||
| 	ctrl_iface = wpa_s->global->dbus; | 	ctrl_iface = wpa_s->global->dbus; | ||||||
| 	if (ctrl_iface == NULL) | 	if (ctrl_iface == NULL) | ||||||
|  | @ -2394,7 +2419,7 @@ int wpas_dbus_register_bss(struct wpa_supplicant *wpa_s, | ||||||
| 	struct bss_handler_args *arg; | 	struct bss_handler_args *arg; | ||||||
| 
 | 
 | ||||||
| 	/* Do nothing if the control interface is not turned on */ | 	/* Do nothing if the control interface is not turned on */ | ||||||
| 	if (wpa_s == NULL || wpa_s->global == NULL) | 	if (wpa_s == NULL || wpa_s->global == NULL || !wpa_s->dbus_new_path) | ||||||
| 		return 0; | 		return 0; | ||||||
| 	ctrl_iface = wpa_s->global->dbus; | 	ctrl_iface = wpa_s->global->dbus; | ||||||
| 	if (ctrl_iface == NULL) | 	if (ctrl_iface == NULL) | ||||||
|  | @ -3345,7 +3370,7 @@ static void wpas_dbus_signal_peer(struct wpa_supplicant *wpa_s, | ||||||
| 	iface = wpa_s->global->dbus; | 	iface = wpa_s->global->dbus; | ||||||
| 
 | 
 | ||||||
| 	/* Do nothing if the control interface is not turned on */ | 	/* Do nothing if the control interface is not turned on */ | ||||||
| 	if (iface == NULL) | 	if (iface == NULL || !wpa_s->dbus_new_path) | ||||||
| 		return; | 		return; | ||||||
| 
 | 
 | ||||||
| 	os_snprintf(peer_obj_path, WPAS_DBUS_OBJECT_PATH_MAX, | 	os_snprintf(peer_obj_path, WPAS_DBUS_OBJECT_PATH_MAX, | ||||||
|  | @ -3422,8 +3447,9 @@ int wpas_dbus_register_peer(struct wpa_supplicant *wpa_s, const u8 *dev_addr) | ||||||
| 	if (ctrl_iface == NULL) | 	if (ctrl_iface == NULL) | ||||||
| 		return 0; | 		return 0; | ||||||
| 
 | 
 | ||||||
| 	if (wpa_s->p2p_mgmt) | 	wpa_s = wpa_s->parent->parent; | ||||||
| 		wpa_s = wpa_s->parent; | 	if (!wpa_s->dbus_new_path) | ||||||
|  | 		return 0; | ||||||
| 
 | 
 | ||||||
| 	os_snprintf(peer_obj_path, WPAS_DBUS_OBJECT_PATH_MAX, | 	os_snprintf(peer_obj_path, WPAS_DBUS_OBJECT_PATH_MAX, | ||||||
| 		    "%s/" WPAS_DBUS_NEW_P2P_PEERS_PART "/" COMPACT_MACSTR, | 		    "%s/" WPAS_DBUS_NEW_P2P_PEERS_PART "/" COMPACT_MACSTR, | ||||||
|  | @ -3481,12 +3507,12 @@ int wpas_dbus_unregister_peer(struct wpa_supplicant *wpa_s, | ||||||
| 	int ret; | 	int ret; | ||||||
| 
 | 
 | ||||||
| 	/* Do nothing if the control interface is not turned on */ | 	/* Do nothing if the control interface is not turned on */ | ||||||
| 	if (wpa_s == NULL || wpa_s->global == NULL || | 	if (wpa_s == NULL || wpa_s->global == NULL) | ||||||
| 	    wpa_s->dbus_new_path == NULL) |  | ||||||
| 		return 0; | 		return 0; | ||||||
| 
 | 
 | ||||||
| 	if (wpa_s->p2p_mgmt) | 	wpa_s = wpa_s->parent->parent; | ||||||
| 		wpa_s = wpa_s->parent; | 	if (!wpa_s->dbus_new_path) | ||||||
|  | 		return 0; | ||||||
| 
 | 
 | ||||||
| 	ctrl_iface = wpa_s->global->dbus; | 	ctrl_iface = wpa_s->global->dbus; | ||||||
| 	if (ctrl_iface == NULL) | 	if (ctrl_iface == NULL) | ||||||
|  | @ -3512,6 +3538,8 @@ void wpas_dbus_signal_peer_groups_changed(struct wpa_supplicant *wpa_s, | ||||||
| 	if (wpa_s->p2p_mgmt) | 	if (wpa_s->p2p_mgmt) | ||||||
| 		wpa_s = wpa_s->parent; | 		wpa_s = wpa_s->parent; | ||||||
| 
 | 
 | ||||||
|  | 	if (!wpa_s->dbus_new_path) | ||||||
|  | 		return; | ||||||
| 	os_snprintf(peer_obj_path, WPAS_DBUS_OBJECT_PATH_MAX, | 	os_snprintf(peer_obj_path, WPAS_DBUS_OBJECT_PATH_MAX, | ||||||
| 		    "%s/" WPAS_DBUS_NEW_P2P_PEERS_PART "/" COMPACT_MACSTR, | 		    "%s/" WPAS_DBUS_NEW_P2P_PEERS_PART "/" COMPACT_MACSTR, | ||||||
| 		    wpa_s->dbus_new_path, MAC2STR(dev_addr)); | 		    wpa_s->dbus_new_path, MAC2STR(dev_addr)); | ||||||
|  | @ -3713,6 +3741,9 @@ int wpas_dbus_register_persistent_group(struct wpa_supplicant *wpa_s, | ||||||
| 	/* Do nothing if the control interface is not turned on */ | 	/* Do nothing if the control interface is not turned on */ | ||||||
| 	if (wpa_s == NULL || wpa_s->global == NULL) | 	if (wpa_s == NULL || wpa_s->global == NULL) | ||||||
| 		return 0; | 		return 0; | ||||||
|  | 	wpa_s = wpa_s->parent->parent; | ||||||
|  | 	if (!wpa_s->dbus_new_path) | ||||||
|  | 		return 0; | ||||||
| 
 | 
 | ||||||
| 	/* Make sure ssid is a persistent group */ | 	/* Make sure ssid is a persistent group */ | ||||||
| 	if (ssid->disabled != 2 && !ssid->p2p_persistent_group) | 	if (ssid->disabled != 2 && !ssid->p2p_persistent_group) | ||||||
|  | @ -3797,15 +3828,13 @@ int wpas_dbus_unregister_persistent_group(struct wpa_supplicant *wpa_s, | ||||||
| 	int ret; | 	int ret; | ||||||
| 
 | 
 | ||||||
| 	/* Do nothing if the control interface is not turned on */ | 	/* Do nothing if the control interface is not turned on */ | ||||||
| 	if (wpa_s == NULL || wpa_s->global == NULL || | 	if (wpa_s == NULL || wpa_s->global == NULL) | ||||||
| 	    wpa_s->dbus_new_path == NULL) |  | ||||||
| 		return 0; | 		return 0; | ||||||
| 
 | 
 | ||||||
| 	if (wpa_s->p2p_mgmt) | 	wpa_s = wpa_s->parent->parent; | ||||||
| 		wpa_s = wpa_s->parent; |  | ||||||
| 
 | 
 | ||||||
| 	ctrl_iface = wpa_s->global->dbus; | 	ctrl_iface = wpa_s->global->dbus; | ||||||
| 	if (ctrl_iface == NULL) | 	if (ctrl_iface == NULL || !wpa_s->dbus_new_path) | ||||||
| 		return 0; | 		return 0; | ||||||
| 
 | 
 | ||||||
| 	os_snprintf(pgrp_obj_path, WPAS_DBUS_OBJECT_PATH_MAX, | 	os_snprintf(pgrp_obj_path, WPAS_DBUS_OBJECT_PATH_MAX, | ||||||
|  |  | ||||||
|  | @ -157,7 +157,8 @@ static struct wpa_supplicant * get_iface_by_dbus_path( | ||||||
| 	struct wpa_supplicant *wpa_s; | 	struct wpa_supplicant *wpa_s; | ||||||
| 
 | 
 | ||||||
| 	for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) { | 	for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) { | ||||||
| 		if (os_strcmp(wpa_s->dbus_new_path, path) == 0) | 		if (wpa_s->dbus_new_path && | ||||||
|  | 		    os_strcmp(wpa_s->dbus_new_path, path) == 0) | ||||||
| 			return wpa_s; | 			return wpa_s; | ||||||
| 	} | 	} | ||||||
| 	return NULL; | 	return NULL; | ||||||
|  | @ -600,7 +601,7 @@ DBusMessage * wpas_dbus_handler_create_interface(DBusMessage *message, | ||||||
| 		iface.bridge_ifname = bridge_ifname; | 		iface.bridge_ifname = bridge_ifname; | ||||||
| 		/* Otherwise, have wpa_supplicant attach to it. */ | 		/* Otherwise, have wpa_supplicant attach to it. */ | ||||||
| 		wpa_s = wpa_supplicant_add_iface(global, &iface, NULL); | 		wpa_s = wpa_supplicant_add_iface(global, &iface, NULL); | ||||||
| 		if (wpa_s) { | 		if (wpa_s && wpa_s->dbus_new_path) { | ||||||
| 			const char *path = wpa_s->dbus_new_path; | 			const char *path = wpa_s->dbus_new_path; | ||||||
| 
 | 
 | ||||||
| 			reply = dbus_message_new_method_return(message); | 			reply = dbus_message_new_method_return(message); | ||||||
|  | @ -684,7 +685,7 @@ DBusMessage * wpas_dbus_handler_get_interface(DBusMessage *message, | ||||||
| 			      DBUS_TYPE_INVALID); | 			      DBUS_TYPE_INVALID); | ||||||
| 
 | 
 | ||||||
| 	wpa_s = wpa_supplicant_get_iface(global, ifname); | 	wpa_s = wpa_supplicant_get_iface(global, ifname); | ||||||
| 	if (wpa_s == NULL) | 	if (wpa_s == NULL || wpa_s->dbus_new_path == NULL) | ||||||
| 		return wpas_dbus_error_iface_unknown(message); | 		return wpas_dbus_error_iface_unknown(message); | ||||||
| 
 | 
 | ||||||
| 	path = wpa_s->dbus_new_path; | 	path = wpa_s->dbus_new_path; | ||||||
|  | @ -876,8 +877,10 @@ dbus_bool_t wpas_dbus_getter_interfaces(DBusMessageIter *iter, | ||||||
| 	unsigned int i = 0, num = 0; | 	unsigned int i = 0, num = 0; | ||||||
| 	dbus_bool_t success; | 	dbus_bool_t success; | ||||||
| 
 | 
 | ||||||
| 	for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) | 	for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) { | ||||||
| 		num++; | 		if (wpa_s->dbus_new_path) | ||||||
|  | 			num++; | ||||||
|  | 	} | ||||||
| 
 | 
 | ||||||
| 	paths = os_calloc(num, sizeof(char *)); | 	paths = os_calloc(num, sizeof(char *)); | ||||||
| 	if (!paths) { | 	if (!paths) { | ||||||
|  | @ -885,8 +888,10 @@ dbus_bool_t wpas_dbus_getter_interfaces(DBusMessageIter *iter, | ||||||
| 		return FALSE; | 		return FALSE; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) | 	for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) { | ||||||
| 		paths[i++] = wpa_s->dbus_new_path; | 		if (wpa_s->dbus_new_path) | ||||||
|  | 			paths[i++] = wpa_s->dbus_new_path; | ||||||
|  | 	} | ||||||
| 
 | 
 | ||||||
| 	success = wpas_dbus_simple_array_property_getter(iter, | 	success = wpas_dbus_simple_array_property_getter(iter, | ||||||
| 							 DBUS_TYPE_OBJECT_PATH, | 							 DBUS_TYPE_OBJECT_PATH, | ||||||
|  | @ -1478,7 +1483,8 @@ DBusMessage * wpas_dbus_handler_add_network(DBusMessage *message, | ||||||
| 
 | 
 | ||||||
| 	dbus_message_iter_init(message, &iter); | 	dbus_message_iter_init(message, &iter); | ||||||
| 
 | 
 | ||||||
| 	ssid = wpa_config_add_network(wpa_s->conf); | 	if (wpa_s->dbus_new_path) | ||||||
|  | 		ssid = wpa_config_add_network(wpa_s->conf); | ||||||
| 	if (ssid == NULL) { | 	if (ssid == NULL) { | ||||||
| 		wpa_printf(MSG_ERROR, "%s[dbus]: can't add new interface.", | 		wpa_printf(MSG_ERROR, "%s[dbus]: can't add new interface.", | ||||||
| 			   __func__); | 			   __func__); | ||||||
|  | @ -1602,7 +1608,7 @@ DBusMessage * wpas_dbus_handler_remove_network(DBusMessage *message, | ||||||
| 	iface = wpas_dbus_new_decompose_object_path(op, | 	iface = wpas_dbus_new_decompose_object_path(op, | ||||||
| 						    WPAS_DBUS_NEW_NETWORKS_PART, | 						    WPAS_DBUS_NEW_NETWORKS_PART, | ||||||
| 						    &net_id); | 						    &net_id); | ||||||
| 	if (iface == NULL || net_id == NULL || | 	if (iface == NULL || net_id == NULL || !wpa_s->dbus_new_path || | ||||||
| 	    os_strcmp(iface, wpa_s->dbus_new_path) != 0) { | 	    os_strcmp(iface, wpa_s->dbus_new_path) != 0) { | ||||||
| 		reply = wpas_dbus_error_invalid_args(message, op); | 		reply = wpas_dbus_error_invalid_args(message, op); | ||||||
| 		goto out; | 		goto out; | ||||||
|  | @ -1715,7 +1721,7 @@ DBusMessage * wpas_dbus_handler_select_network(DBusMessage *message, | ||||||
| 	iface = wpas_dbus_new_decompose_object_path(op, | 	iface = wpas_dbus_new_decompose_object_path(op, | ||||||
| 						    WPAS_DBUS_NEW_NETWORKS_PART, | 						    WPAS_DBUS_NEW_NETWORKS_PART, | ||||||
| 						    &net_id); | 						    &net_id); | ||||||
| 	if (iface == NULL || net_id == NULL || | 	if (iface == NULL || net_id == NULL || !wpa_s->dbus_new_path || | ||||||
| 	    os_strcmp(iface, wpa_s->dbus_new_path) != 0) { | 	    os_strcmp(iface, wpa_s->dbus_new_path) != 0) { | ||||||
| 		reply = wpas_dbus_error_invalid_args(message, op); | 		reply = wpas_dbus_error_invalid_args(message, op); | ||||||
| 		goto out; | 		goto out; | ||||||
|  | @ -1773,7 +1779,7 @@ DBusMessage * wpas_dbus_handler_network_reply(DBusMessage *message, | ||||||
| 	iface = wpas_dbus_new_decompose_object_path(op, | 	iface = wpas_dbus_new_decompose_object_path(op, | ||||||
| 						    WPAS_DBUS_NEW_NETWORKS_PART, | 						    WPAS_DBUS_NEW_NETWORKS_PART, | ||||||
| 						    &net_id); | 						    &net_id); | ||||||
| 	if (iface == NULL || net_id == NULL || | 	if (iface == NULL || net_id == NULL || !wpa_s->dbus_new_path || | ||||||
| 	    os_strcmp(iface, wpa_s->dbus_new_path) != 0) { | 	    os_strcmp(iface, wpa_s->dbus_new_path) != 0) { | ||||||
| 		reply = wpas_dbus_error_invalid_args(message, op); | 		reply = wpas_dbus_error_invalid_args(message, op); | ||||||
| 		goto out; | 		goto out; | ||||||
|  | @ -2266,12 +2272,14 @@ DBusMessage * wpas_dbus_handler_set_pkcs11_engine_and_module_path( | ||||||
| 			message, DBUS_ERROR_FAILED, | 			message, DBUS_ERROR_FAILED, | ||||||
| 			"Reinit of the EAPOL state machine with the new PKCS #11 engine and module path failed."); | 			"Reinit of the EAPOL state machine with the new PKCS #11 engine and module path failed."); | ||||||
| 
 | 
 | ||||||
| 	wpa_dbus_mark_property_changed( | 	if (wpa_s->dbus_new_path) { | ||||||
| 		wpa_s->global->dbus, wpa_s->dbus_new_path, | 		wpa_dbus_mark_property_changed( | ||||||
| 		WPAS_DBUS_NEW_IFACE_INTERFACE, "PKCS11EnginePath"); | 			wpa_s->global->dbus, wpa_s->dbus_new_path, | ||||||
| 	wpa_dbus_mark_property_changed( | 			WPAS_DBUS_NEW_IFACE_INTERFACE, "PKCS11EnginePath"); | ||||||
| 		wpa_s->global->dbus, wpa_s->dbus_new_path, | 		wpa_dbus_mark_property_changed( | ||||||
| 		WPAS_DBUS_NEW_IFACE_INTERFACE, "PKCS11ModulePath"); | 			wpa_s->global->dbus, wpa_s->dbus_new_path, | ||||||
|  | 			WPAS_DBUS_NEW_IFACE_INTERFACE, "PKCS11ModulePath"); | ||||||
|  | 	} | ||||||
| 
 | 
 | ||||||
| 	return NULL; | 	return NULL; | ||||||
| } | } | ||||||
|  | @ -3024,7 +3032,7 @@ dbus_bool_t wpas_dbus_getter_current_bss(DBusMessageIter *iter, | ||||||
| 	struct wpa_supplicant *wpa_s = user_data; | 	struct wpa_supplicant *wpa_s = user_data; | ||||||
| 	char path_buf[WPAS_DBUS_OBJECT_PATH_MAX], *bss_obj_path = path_buf; | 	char path_buf[WPAS_DBUS_OBJECT_PATH_MAX], *bss_obj_path = path_buf; | ||||||
| 
 | 
 | ||||||
| 	if (wpa_s->current_bss) | 	if (wpa_s->current_bss && wpa_s->dbus_new_path) | ||||||
| 		os_snprintf(bss_obj_path, WPAS_DBUS_OBJECT_PATH_MAX, | 		os_snprintf(bss_obj_path, WPAS_DBUS_OBJECT_PATH_MAX, | ||||||
| 			    "%s/" WPAS_DBUS_NEW_BSSIDS_PART "/%u", | 			    "%s/" WPAS_DBUS_NEW_BSSIDS_PART "/%u", | ||||||
| 			    wpa_s->dbus_new_path, wpa_s->current_bss->id); | 			    wpa_s->dbus_new_path, wpa_s->current_bss->id); | ||||||
|  | @ -3052,7 +3060,7 @@ dbus_bool_t wpas_dbus_getter_current_network(DBusMessageIter *iter, | ||||||
| 	struct wpa_supplicant *wpa_s = user_data; | 	struct wpa_supplicant *wpa_s = user_data; | ||||||
| 	char path_buf[WPAS_DBUS_OBJECT_PATH_MAX], *net_obj_path = path_buf; | 	char path_buf[WPAS_DBUS_OBJECT_PATH_MAX], *net_obj_path = path_buf; | ||||||
| 
 | 
 | ||||||
| 	if (wpa_s->current_ssid) | 	if (wpa_s->current_ssid && wpa_s->dbus_new_path) | ||||||
| 		os_snprintf(net_obj_path, WPAS_DBUS_OBJECT_PATH_MAX, | 		os_snprintf(net_obj_path, WPAS_DBUS_OBJECT_PATH_MAX, | ||||||
| 			    "%s/" WPAS_DBUS_NEW_NETWORKS_PART "/%u", | 			    "%s/" WPAS_DBUS_NEW_NETWORKS_PART "/%u", | ||||||
| 			    wpa_s->dbus_new_path, wpa_s->current_ssid->id); | 			    wpa_s->dbus_new_path, wpa_s->current_ssid->id); | ||||||
|  | @ -3140,6 +3148,12 @@ dbus_bool_t wpas_dbus_getter_bsss(DBusMessageIter *iter, DBusError *error, | ||||||
| 	unsigned int i = 0; | 	unsigned int i = 0; | ||||||
| 	dbus_bool_t success = FALSE; | 	dbus_bool_t success = FALSE; | ||||||
| 
 | 
 | ||||||
|  | 	if (!wpa_s->dbus_new_path) { | ||||||
|  | 		dbus_set_error(error, DBUS_ERROR_FAILED, | ||||||
|  | 			       "%s: no D-Bus interface", __func__); | ||||||
|  | 		return FALSE; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	paths = os_calloc(wpa_s->num_bss, sizeof(char *)); | 	paths = os_calloc(wpa_s->num_bss, sizeof(char *)); | ||||||
| 	if (!paths) { | 	if (!paths) { | ||||||
| 		dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); | 		dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory"); | ||||||
|  | @ -3191,6 +3205,12 @@ dbus_bool_t wpas_dbus_getter_networks(DBusMessageIter *iter, DBusError *error, | ||||||
| 	unsigned int i = 0, num = 0; | 	unsigned int i = 0, num = 0; | ||||||
| 	dbus_bool_t success = FALSE; | 	dbus_bool_t success = FALSE; | ||||||
| 
 | 
 | ||||||
|  | 	if (!wpa_s->dbus_new_path) { | ||||||
|  | 		dbus_set_error(error, DBUS_ERROR_FAILED, | ||||||
|  | 			       "%s: no D-Bus interface", __func__); | ||||||
|  | 		return FALSE; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next) | 	for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next) | ||||||
| 		if (!network_is_persistent_group(ssid)) | 		if (!network_is_persistent_group(ssid)) | ||||||
| 			num++; | 			num++; | ||||||
|  | @ -4104,7 +4124,7 @@ void wpas_dbus_signal_preq(struct wpa_supplicant *wpa_s, | ||||||
| 	struct wpas_dbus_priv *priv = wpa_s->global->dbus; | 	struct wpas_dbus_priv *priv = wpa_s->global->dbus; | ||||||
| 
 | 
 | ||||||
| 	/* Do nothing if the control interface is not turned on */ | 	/* Do nothing if the control interface is not turned on */ | ||||||
| 	if (priv == NULL) | 	if (priv == NULL || !wpa_s->dbus_new_path) | ||||||
| 		return; | 		return; | ||||||
| 
 | 
 | ||||||
| 	if (wpa_s->preq_notify_peer == NULL) | 	if (wpa_s->preq_notify_peer == NULL) | ||||||
|  |  | ||||||
|  | @ -354,7 +354,8 @@ DBusMessage * wpas_dbus_handler_p2p_group_add(DBusMessage *message, | ||||||
| 			pg_object_path, WPAS_DBUS_NEW_PERSISTENT_GROUPS_PART, | 			pg_object_path, WPAS_DBUS_NEW_PERSISTENT_GROUPS_PART, | ||||||
| 			&net_id_str); | 			&net_id_str); | ||||||
| 		if (iface == NULL || net_id_str == NULL || | 		if (iface == NULL || net_id_str == NULL || | ||||||
| 		    os_strcmp(iface, wpa_s->dbus_new_path) != 0) { | 		    !wpa_s->parent->dbus_new_path || | ||||||
|  | 		    os_strcmp(iface, wpa_s->parent->dbus_new_path) != 0) { | ||||||
| 			reply = | 			reply = | ||||||
| 			    wpas_dbus_error_invalid_args(message, | 			    wpas_dbus_error_invalid_args(message, | ||||||
| 							 pg_object_path); | 							 pg_object_path); | ||||||
|  | @ -649,7 +650,8 @@ DBusMessage * wpas_dbus_handler_p2p_invite(DBusMessage *message, | ||||||
| 			WPAS_DBUS_NEW_PERSISTENT_GROUPS_PART, | 			WPAS_DBUS_NEW_PERSISTENT_GROUPS_PART, | ||||||
| 			&net_id_str); | 			&net_id_str); | ||||||
| 		if (iface == NULL || net_id_str == NULL || | 		if (iface == NULL || net_id_str == NULL || | ||||||
| 		    os_strcmp(iface, wpa_s->dbus_new_path) != 0) { | 		    !wpa_s->parent->dbus_new_path || | ||||||
|  | 		    os_strcmp(iface, wpa_s->parent->dbus_new_path) != 0) { | ||||||
| 			reply = wpas_dbus_error_invalid_args(message, | 			reply = wpas_dbus_error_invalid_args(message, | ||||||
| 							     pg_object_path); | 							     pg_object_path); | ||||||
| 			goto out; | 			goto out; | ||||||
|  | @ -1043,7 +1045,8 @@ dbus_bool_t wpas_dbus_getter_p2p_peers(DBusMessageIter *iter, DBusError *error, | ||||||
| 
 | 
 | ||||||
| 	char **peer_obj_paths = NULL; | 	char **peer_obj_paths = NULL; | ||||||
| 
 | 
 | ||||||
| 	if (!wpa_dbus_p2p_check_enabled(wpa_s, NULL, NULL, error)) | 	if (!wpa_dbus_p2p_check_enabled(wpa_s, NULL, NULL, error) || | ||||||
|  | 	    !wpa_s->parent->parent->dbus_new_path) | ||||||
| 		return FALSE; | 		return FALSE; | ||||||
| 
 | 
 | ||||||
| 	dl_list_init(&peer_objpath_list); | 	dl_list_init(&peer_objpath_list); | ||||||
|  | @ -1064,7 +1067,8 @@ dbus_bool_t wpas_dbus_getter_p2p_peers(DBusMessageIter *iter, DBusError *error, | ||||||
| 		os_snprintf(node->path, WPAS_DBUS_OBJECT_PATH_MAX, | 		os_snprintf(node->path, WPAS_DBUS_OBJECT_PATH_MAX, | ||||||
| 			    "%s/" WPAS_DBUS_NEW_P2P_PEERS_PART | 			    "%s/" WPAS_DBUS_NEW_P2P_PEERS_PART | ||||||
| 			    "/" COMPACT_MACSTR, | 			    "/" COMPACT_MACSTR, | ||||||
| 			    wpa_s->dbus_new_path, MAC2STR(addr)); | 			    wpa_s->parent->parent->dbus_new_path, | ||||||
|  | 			    MAC2STR(addr)); | ||||||
| 		dl_list_add_tail(&peer_objpath_list, &node->list); | 		dl_list_add_tail(&peer_objpath_list, &node->list); | ||||||
| 		num++; | 		num++; | ||||||
| 
 | 
 | ||||||
|  | @ -1184,13 +1188,17 @@ dbus_bool_t wpas_dbus_getter_p2p_peergo(DBusMessageIter *iter, | ||||||
| 	struct wpa_supplicant *wpa_s = user_data; | 	struct wpa_supplicant *wpa_s = user_data; | ||||||
| 	char go_peer_obj_path[WPAS_DBUS_OBJECT_PATH_MAX], *path; | 	char go_peer_obj_path[WPAS_DBUS_OBJECT_PATH_MAX], *path; | ||||||
| 
 | 
 | ||||||
|  | 	if (!wpa_s->parent->parent->dbus_new_path) | ||||||
|  | 		return FALSE; | ||||||
|  | 
 | ||||||
| 	if (wpas_get_p2p_role(wpa_s) != WPAS_P2P_ROLE_CLIENT) | 	if (wpas_get_p2p_role(wpa_s) != WPAS_P2P_ROLE_CLIENT) | ||||||
| 		os_snprintf(go_peer_obj_path, WPAS_DBUS_OBJECT_PATH_MAX, "/"); | 		os_snprintf(go_peer_obj_path, WPAS_DBUS_OBJECT_PATH_MAX, "/"); | ||||||
| 	else | 	else | ||||||
| 		os_snprintf(go_peer_obj_path, WPAS_DBUS_OBJECT_PATH_MAX, | 		os_snprintf(go_peer_obj_path, WPAS_DBUS_OBJECT_PATH_MAX, | ||||||
| 			    "%s/" WPAS_DBUS_NEW_P2P_PEERS_PART "/" | 			    "%s/" WPAS_DBUS_NEW_P2P_PEERS_PART "/" | ||||||
| 			    COMPACT_MACSTR, | 			    COMPACT_MACSTR, | ||||||
| 			    wpa_s->dbus_new_path, MAC2STR(wpa_s->go_dev_addr)); | 			    wpa_s->parent->parent->dbus_new_path, | ||||||
|  | 			    MAC2STR(wpa_s->go_dev_addr)); | ||||||
| 
 | 
 | ||||||
| 	path = go_peer_obj_path; | 	path = go_peer_obj_path; | ||||||
| 	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_OBJECT_PATH, | 	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_OBJECT_PATH, | ||||||
|  | @ -1636,6 +1644,11 @@ dbus_bool_t wpas_dbus_getter_persistent_groups(DBusMessageIter *iter, | ||||||
| 	unsigned int i = 0, num = 0; | 	unsigned int i = 0, num = 0; | ||||||
| 	dbus_bool_t success = FALSE; | 	dbus_bool_t success = FALSE; | ||||||
| 
 | 
 | ||||||
|  | 	if (wpa_s->p2p_dev) | ||||||
|  | 		wpa_s = wpa_s->p2p_dev; | ||||||
|  | 	if (!wpa_s->parent->dbus_new_path) | ||||||
|  | 		return FALSE; | ||||||
|  | 
 | ||||||
| 	for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next) | 	for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next) | ||||||
| 		if (network_is_persistent_group(ssid)) | 		if (network_is_persistent_group(ssid)) | ||||||
| 			num++; | 			num++; | ||||||
|  | @ -1659,7 +1672,7 @@ dbus_bool_t wpas_dbus_getter_persistent_groups(DBusMessageIter *iter, | ||||||
| 		/* Construct the object path for this network. */ | 		/* Construct the object path for this network. */ | ||||||
| 		os_snprintf(paths[i++], WPAS_DBUS_OBJECT_PATH_MAX, | 		os_snprintf(paths[i++], WPAS_DBUS_OBJECT_PATH_MAX, | ||||||
| 			    "%s/" WPAS_DBUS_NEW_PERSISTENT_GROUPS_PART "/%d", | 			    "%s/" WPAS_DBUS_NEW_PERSISTENT_GROUPS_PART "/%d", | ||||||
| 			    wpa_s->dbus_new_path, ssid->id); | 			    wpa_s->parent->dbus_new_path, ssid->id); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	success = wpas_dbus_simple_array_property_getter(iter, | 	success = wpas_dbus_simple_array_property_getter(iter, | ||||||
|  | @ -1746,7 +1759,10 @@ DBusMessage * wpas_dbus_handler_add_persistent_group( | ||||||
| 
 | 
 | ||||||
| 	dbus_message_iter_init(message, &iter); | 	dbus_message_iter_init(message, &iter); | ||||||
| 
 | 
 | ||||||
| 	ssid = wpa_config_add_network(wpa_s->conf); | 	if (wpa_s->p2p_dev) | ||||||
|  | 		wpa_s = wpa_s->p2p_dev; | ||||||
|  | 	if (wpa_s->parent->dbus_new_path) | ||||||
|  | 		ssid = wpa_config_add_network(wpa_s->conf); | ||||||
| 	if (ssid == NULL) { | 	if (ssid == NULL) { | ||||||
| 		wpa_printf(MSG_ERROR, | 		wpa_printf(MSG_ERROR, | ||||||
| 			   "dbus: %s: Cannot add new persistent group", | 			   "dbus: %s: Cannot add new persistent group", | ||||||
|  | @ -1779,7 +1795,7 @@ DBusMessage * wpas_dbus_handler_add_persistent_group( | ||||||
| 	/* Construct the object path for this network. */ | 	/* Construct the object path for this network. */ | ||||||
| 	os_snprintf(path, WPAS_DBUS_OBJECT_PATH_MAX, | 	os_snprintf(path, WPAS_DBUS_OBJECT_PATH_MAX, | ||||||
| 		    "%s/" WPAS_DBUS_NEW_PERSISTENT_GROUPS_PART "/%d", | 		    "%s/" WPAS_DBUS_NEW_PERSISTENT_GROUPS_PART "/%d", | ||||||
| 		    wpa_s->dbus_new_path, ssid->id); | 		    wpa_s->parent->dbus_new_path, ssid->id); | ||||||
| 
 | 
 | ||||||
| 	reply = dbus_message_new_method_return(message); | 	reply = dbus_message_new_method_return(message); | ||||||
| 	if (reply == NULL) { | 	if (reply == NULL) { | ||||||
|  | @ -1826,6 +1842,9 @@ DBusMessage * wpas_dbus_handler_remove_persistent_group( | ||||||
| 	dbus_message_get_args(message, NULL, DBUS_TYPE_OBJECT_PATH, &op, | 	dbus_message_get_args(message, NULL, DBUS_TYPE_OBJECT_PATH, &op, | ||||||
| 			      DBUS_TYPE_INVALID); | 			      DBUS_TYPE_INVALID); | ||||||
| 
 | 
 | ||||||
|  | 	if (wpa_s->p2p_dev) | ||||||
|  | 		wpa_s = wpa_s->p2p_dev; | ||||||
|  | 
 | ||||||
| 	/*
 | 	/*
 | ||||||
| 	 * Extract the network ID and ensure the network is actually a child of | 	 * Extract the network ID and ensure the network is actually a child of | ||||||
| 	 * this interface. | 	 * this interface. | ||||||
|  | @ -1834,7 +1853,8 @@ DBusMessage * wpas_dbus_handler_remove_persistent_group( | ||||||
| 		op, WPAS_DBUS_NEW_PERSISTENT_GROUPS_PART, | 		op, WPAS_DBUS_NEW_PERSISTENT_GROUPS_PART, | ||||||
| 		&persistent_group_id); | 		&persistent_group_id); | ||||||
| 	if (iface == NULL || persistent_group_id == NULL || | 	if (iface == NULL || persistent_group_id == NULL || | ||||||
| 	    os_strcmp(iface, wpa_s->dbus_new_path) != 0) { | 	    !wpa_s->parent->dbus_new_path || | ||||||
|  | 	    os_strcmp(iface, wpa_s->parent->dbus_new_path) != 0) { | ||||||
| 		reply = wpas_dbus_error_invalid_args(message, op); | 		reply = wpas_dbus_error_invalid_args(message, op); | ||||||
| 		goto out; | 		goto out; | ||||||
| 	} | 	} | ||||||
|  | @ -1899,6 +1919,8 @@ DBusMessage * wpas_dbus_handler_remove_all_persistent_groups( | ||||||
| 	struct wpa_ssid *ssid, *next; | 	struct wpa_ssid *ssid, *next; | ||||||
| 	struct wpa_config *config; | 	struct wpa_config *config; | ||||||
| 
 | 
 | ||||||
|  | 	if (wpa_s->p2p_dev) | ||||||
|  | 		wpa_s = wpa_s->p2p_dev; | ||||||
| 	config = wpa_s->conf; | 	config = wpa_s->conf; | ||||||
| 	ssid = config->ssid; | 	ssid = config->ssid; | ||||||
| 	while (ssid) { | 	while (ssid) { | ||||||
|  | @ -1928,6 +1950,9 @@ dbus_bool_t wpas_dbus_getter_p2p_group_members(DBusMessageIter *iter, | ||||||
| 	const u8 *addr; | 	const u8 *addr; | ||||||
| 	dbus_bool_t success = FALSE; | 	dbus_bool_t success = FALSE; | ||||||
| 
 | 
 | ||||||
|  | 	if (!wpa_s->parent->parent->dbus_new_path) | ||||||
|  | 		return FALSE; | ||||||
|  | 
 | ||||||
| 	/* Verify correct role for this property */ | 	/* Verify correct role for this property */ | ||||||
| 	if (wpas_get_p2p_role(wpa_s) != WPAS_P2P_ROLE_GO) { | 	if (wpas_get_p2p_role(wpa_s) != WPAS_P2P_ROLE_GO) { | ||||||
| 		return wpas_dbus_simple_array_property_getter( | 		return wpas_dbus_simple_array_property_getter( | ||||||
|  | @ -1955,7 +1980,8 @@ dbus_bool_t wpas_dbus_getter_p2p_group_members(DBusMessageIter *iter, | ||||||
| 		os_snprintf(paths[i], WPAS_DBUS_OBJECT_PATH_MAX, | 		os_snprintf(paths[i], WPAS_DBUS_OBJECT_PATH_MAX, | ||||||
| 			    "%s/" WPAS_DBUS_NEW_P2P_PEERS_PART | 			    "%s/" WPAS_DBUS_NEW_P2P_PEERS_PART | ||||||
| 			    "/" COMPACT_MACSTR, | 			    "/" COMPACT_MACSTR, | ||||||
| 			    wpa_s->parent->dbus_new_path, MAC2STR(addr)); | 			    wpa_s->parent->parent->dbus_new_path, | ||||||
|  | 			    MAC2STR(addr)); | ||||||
| 		i++; | 		i++; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -358,6 +358,8 @@ dbus_bool_t wpas_dbus_setter_process_credentials(DBusMessageIter *iter, | ||||||
| 	struct wpa_supplicant *wpa_s = user_data; | 	struct wpa_supplicant *wpa_s = user_data; | ||||||
| 	dbus_bool_t process_credentials, old_pc; | 	dbus_bool_t process_credentials, old_pc; | ||||||
| 
 | 
 | ||||||
|  | 	if (!wpa_s->dbus_new_path) | ||||||
|  | 		return FALSE; | ||||||
| 	if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_BOOLEAN, | 	if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_BOOLEAN, | ||||||
| 					      &process_credentials)) | 					      &process_credentials)) | ||||||
| 		return FALSE; | 		return FALSE; | ||||||
|  |  | ||||||
|  | @ -383,7 +383,7 @@ void wpa_supplicant_dbus_notify_scan_results(struct wpa_supplicant *wpa_s) | ||||||
| 	DBusMessage *_signal; | 	DBusMessage *_signal; | ||||||
| 
 | 
 | ||||||
| 	/* Do nothing if the control interface is not turned on */ | 	/* Do nothing if the control interface is not turned on */ | ||||||
| 	if (iface == NULL) | 	if (iface == NULL || !wpa_s->dbus_path) | ||||||
| 		return; | 		return; | ||||||
| 
 | 
 | ||||||
| 	_signal = dbus_message_new_signal(wpa_s->dbus_path, | 	_signal = dbus_message_new_signal(wpa_s->dbus_path, | ||||||
|  | @ -474,7 +474,7 @@ void wpa_supplicant_dbus_notify_scanning(struct wpa_supplicant *wpa_s) | ||||||
| 	dbus_bool_t scanning = wpa_s->scanning ? TRUE : FALSE; | 	dbus_bool_t scanning = wpa_s->scanning ? TRUE : FALSE; | ||||||
| 
 | 
 | ||||||
| 	/* Do nothing if the control interface is not turned on */ | 	/* Do nothing if the control interface is not turned on */ | ||||||
| 	if (iface == NULL) | 	if (iface == NULL || !wpa_s->dbus_path) | ||||||
| 		return; | 		return; | ||||||
| 
 | 
 | ||||||
| 	_signal = dbus_message_new_signal(wpa_s->dbus_path, | 	_signal = dbus_message_new_signal(wpa_s->dbus_path, | ||||||
|  | @ -509,7 +509,7 @@ void wpa_supplicant_dbus_notify_wps_cred(struct wpa_supplicant *wpa_s, | ||||||
| 	if (wpa_s->global == NULL) | 	if (wpa_s->global == NULL) | ||||||
| 		return; | 		return; | ||||||
| 	iface = wpa_s->global->dbus; | 	iface = wpa_s->global->dbus; | ||||||
| 	if (iface == NULL) | 	if (iface == NULL || !wpa_s->dbus_path) | ||||||
| 		return; | 		return; | ||||||
| 
 | 
 | ||||||
| 	_signal = dbus_message_new_signal(wpa_s->dbus_path, | 	_signal = dbus_message_new_signal(wpa_s->dbus_path, | ||||||
|  | @ -559,7 +559,7 @@ void wpa_supplicant_dbus_notify_certification(struct wpa_supplicant *wpa_s, | ||||||
| 	if (wpa_s->global == NULL) | 	if (wpa_s->global == NULL) | ||||||
| 		return; | 		return; | ||||||
| 	iface = wpa_s->global->dbus; | 	iface = wpa_s->global->dbus; | ||||||
| 	if (iface == NULL) | 	if (iface == NULL || !wpa_s->dbus_path) | ||||||
| 		return; | 		return; | ||||||
| 
 | 
 | ||||||
| 	_signal = dbus_message_new_signal(wpa_s->dbus_path, | 	_signal = dbus_message_new_signal(wpa_s->dbus_path, | ||||||
|  | @ -738,7 +738,7 @@ struct wpa_supplicant * wpa_supplicant_get_iface_by_dbus_path( | ||||||
| 	struct wpa_supplicant *wpa_s; | 	struct wpa_supplicant *wpa_s; | ||||||
| 
 | 
 | ||||||
| 	for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) { | 	for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) { | ||||||
| 		if (strcmp(wpa_s->dbus_path, path) == 0) | 		if (wpa_s->dbus_path && strcmp(wpa_s->dbus_path, path) == 0) | ||||||
| 			return wpa_s; | 			return wpa_s; | ||||||
| 	} | 	} | ||||||
| 	return NULL; | 	return NULL; | ||||||
|  |  | ||||||
|  | @ -166,7 +166,7 @@ DBusMessage * wpas_dbus_global_add_interface(DBusMessage *message, | ||||||
| 		iface.bridge_ifname = bridge_ifname; | 		iface.bridge_ifname = bridge_ifname; | ||||||
| 		/* Otherwise, have wpa_supplicant attach to it. */ | 		/* Otherwise, have wpa_supplicant attach to it. */ | ||||||
| 		wpa_s = wpa_supplicant_add_iface(global, &iface, NULL); | 		wpa_s = wpa_supplicant_add_iface(global, &iface, NULL); | ||||||
| 		if (wpa_s) { | 		if (wpa_s && wpa_s->dbus_path) { | ||||||
| 			const char *path = wpa_s->dbus_path; | 			const char *path = wpa_s->dbus_path; | ||||||
| 
 | 
 | ||||||
| 			reply = dbus_message_new_method_return(message); | 			reply = dbus_message_new_method_return(message); | ||||||
|  | @ -262,7 +262,7 @@ DBusMessage * wpas_dbus_global_get_interface(DBusMessage *message, | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	wpa_s = wpa_supplicant_get_iface(global, ifname); | 	wpa_s = wpa_supplicant_get_iface(global, ifname); | ||||||
| 	if (wpa_s == NULL) { | 	if (wpa_s == NULL || !wpa_s->dbus_path) { | ||||||
| 		reply = wpas_dbus_new_invalid_iface_error(message); | 		reply = wpas_dbus_new_invalid_iface_error(message); | ||||||
| 		goto out; | 		goto out; | ||||||
| 	} | 	} | ||||||
|  | @ -354,6 +354,11 @@ DBusMessage * wpas_dbus_iface_scan_results(DBusMessage *message, | ||||||
| 	DBusMessageIter sub_iter; | 	DBusMessageIter sub_iter; | ||||||
| 	struct wpa_bss *bss; | 	struct wpa_bss *bss; | ||||||
| 
 | 
 | ||||||
|  | 	if (!wpa_s->dbus_path) | ||||||
|  | 		return dbus_message_new_error(message, | ||||||
|  | 					      WPAS_ERROR_INTERNAL_ERROR, | ||||||
|  | 					      "no D-Bus interface available"); | ||||||
|  | 
 | ||||||
| 	/* Create and initialize the return message */ | 	/* Create and initialize the return message */ | ||||||
| 	reply = dbus_message_new_method_return(message); | 	reply = dbus_message_new_method_return(message); | ||||||
| 	dbus_message_iter_init_append(reply, &iter); | 	dbus_message_iter_init_append(reply, &iter); | ||||||
|  | @ -708,10 +713,11 @@ DBusMessage * wpas_dbus_iface_add_network(DBusMessage *message, | ||||||
| 					  struct wpa_supplicant *wpa_s) | 					  struct wpa_supplicant *wpa_s) | ||||||
| { | { | ||||||
| 	DBusMessage *reply = NULL; | 	DBusMessage *reply = NULL; | ||||||
| 	struct wpa_ssid *ssid; | 	struct wpa_ssid *ssid = NULL; | ||||||
| 	char path_buf[WPAS_DBUS_OBJECT_PATH_MAX], *path = path_buf; | 	char path_buf[WPAS_DBUS_OBJECT_PATH_MAX], *path = path_buf; | ||||||
| 
 | 
 | ||||||
| 	ssid = wpa_config_add_network(wpa_s->conf); | 	if (wpa_s->dbus_path) | ||||||
|  | 		ssid = wpa_config_add_network(wpa_s->conf); | ||||||
| 	if (ssid == NULL) { | 	if (ssid == NULL) { | ||||||
| 		reply = dbus_message_new_error( | 		reply = dbus_message_new_error( | ||||||
| 			message, WPAS_ERROR_ADD_NETWORK_ERROR, | 			message, WPAS_ERROR_ADD_NETWORK_ERROR, | ||||||
|  | @ -769,7 +775,7 @@ DBusMessage * wpas_dbus_iface_remove_network(DBusMessage *message, | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	/* Ensure the network is actually a child of this interface */ | 	/* Ensure the network is actually a child of this interface */ | ||||||
| 	if (os_strcmp(iface, wpa_s->dbus_path) != 0) { | 	if (!wpa_s->dbus_path || os_strcmp(iface, wpa_s->dbus_path) != 0) { | ||||||
| 		reply = wpas_dbus_new_invalid_network_error(message); | 		reply = wpas_dbus_new_invalid_network_error(message); | ||||||
| 		goto out; | 		goto out; | ||||||
| 	} | 	} | ||||||
|  | @ -1020,7 +1026,7 @@ DBusMessage * wpas_dbus_iface_select_network(DBusMessage *message, | ||||||
| 			goto out; | 			goto out; | ||||||
| 		} | 		} | ||||||
| 		/* Ensure the object path really points to this interface */ | 		/* Ensure the object path really points to this interface */ | ||||||
| 		if (network == NULL || | 		if (network == NULL || !wpa_s->dbus_path || | ||||||
| 		    os_strcmp(iface_obj_path, wpa_s->dbus_path) != 0) { | 		    os_strcmp(iface_obj_path, wpa_s->dbus_path) != 0) { | ||||||
| 			reply = wpas_dbus_new_invalid_network_error(message); | 			reply = wpas_dbus_new_invalid_network_error(message); | ||||||
| 			goto out; | 			goto out; | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Jouni Malinen
						Jouni Malinen