Avoid Unparcelling AttributionSource in WifiP2p handler thread
Unparcelling the AttributionSource outside of a Binder thread will soon
cause an Exception to be thrown. This patch restructures WifiP2p to
avoid that.
Bug: 267231571
Bug: 244465118
Test: atest com.android.server.wifi
Test: atest
CtsWifiTestCases:android.net.wifi.cts.ConcurrencyTest#testConcurrency to
verify the fix works with ag/19728355
(cherry picked from commit e7432d55b04cdb1be06301965757d7f9bd1b4b0d)
(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:ff989a665f9e83aa1113445154c787f84133a6b8)
Merged-In: I985a4bcf9036dab78d2595759b1c6fa2a80518b0
Change-Id: I985a4bcf9036dab78d2595759b1c6fa2a80518b0
diff --git a/framework/java/android/net/wifi/p2p/WifiP2pManager.java b/framework/java/android/net/wifi/p2p/WifiP2pManager.java
index 939495a..2031dfa 100644
--- a/framework/java/android/net/wifi/p2p/WifiP2pManager.java
+++ b/framework/java/android/net/wifi/p2p/WifiP2pManager.java
@@ -220,6 +220,13 @@
"android.net.wifi.p2p.EXTRA_PARAM_KEY_INFORMATION_ELEMENT_LIST";
/**
+ * Key for transporting a bundle of extra information.
+ * @hide
+ */
+ public static final String EXTRA_PARAM_KEY_BUNDLE =
+ "android.net.wifi.p2p.EXTRA_PARAM_KEY_BUNDLE";
+
+ /**
* Broadcast intent action to indicate whether Wi-Fi p2p is enabled or disabled. An
* extra {@link #EXTRA_WIFI_STATE} provides the state information as int.
*
@@ -1524,7 +1531,7 @@
*/
public Channel initialize(Context srcContext, Looper srcLooper, ChannelListener listener) {
Binder binder = new Binder();
- Bundle extras = prepareExtrasBundle(srcContext);
+ Bundle extras = prepareExtrasBundleWithAttributionSource(srcContext);
int displayId = Display.DEFAULT_DISPLAY;
try {
Display display = srcContext.getDisplay();
@@ -1551,13 +1558,29 @@
null);
}
+ private Message prepareMessage(int what, int arg1, int arg2, Bundle extras, Context context) {
+ Message msg = Message.obtain();
+ msg.what = what;
+ msg.arg1 = arg1;
+ msg.arg2 = arg2;
+ msg.obj = maybeGetAttributionSource(context);
+ msg.getData().putBundle(EXTRA_PARAM_KEY_BUNDLE, extras);
+ return msg;
+ }
+
private Bundle prepareExtrasBundle(Channel c) {
- Bundle b = prepareExtrasBundle(c.mContext);
+ Bundle b = new Bundle();
b.putBinder(CALLING_BINDER, c.getBinder());
return b;
}
- private Bundle prepareExtrasBundle(Context context) {
+ /**
+ * Note, this should only be used for Binder calls.
+ * Unparcelling an AttributionSource will throw an exception when done outside of a Binder
+ * transaction. So don't use this with AsyncChannel since it will throw exception when
+ * unparcelling.
+ */
+ private Bundle prepareExtrasBundleWithAttributionSource(Context context) {
Bundle bundle = new Bundle();
if (SdkLevel.isAtLeastS()) {
bundle.putParcelable(WifiManager.EXTRA_PARAM_KEY_ATTRIBUTION_SOURCE,
@@ -1566,6 +1589,10 @@
return bundle;
}
+ private Object maybeGetAttributionSource(Context context) {
+ return SdkLevel.isAtLeastS() ? context.getAttributionSource() : null;
+ }
+
private Channel initializeChannel(Context srcContext, Looper srcLooper,
ChannelListener listener, Messenger messenger, Binder binder) {
if (messenger == null) return null;
@@ -1577,12 +1604,9 @@
bundle.putString(CALLING_PACKAGE, c.mContext.getOpPackageName());
bundle.putString(CALLING_FEATURE_ID, c.mContext.getAttributionTag());
bundle.putBinder(CALLING_BINDER, binder);
- if (SdkLevel.isAtLeastT()) {
- bundle.putParcelable(WifiManager.EXTRA_PARAM_KEY_ATTRIBUTION_SOURCE,
- c.mContext.getAttributionSource());
- }
- c.mAsyncChannel.sendMessage(UPDATE_CHANNEL_INFO, 0,
- c.putListener(null), bundle);
+ Message msg = prepareMessage(UPDATE_CHANNEL_INFO, 0, c.putListener(null),
+ bundle, c.mContext);
+ c.mAsyncChannel.sendMessage(msg);
return c;
} else {
c.close();
@@ -1625,8 +1649,8 @@
public void discoverPeers(Channel channel, ActionListener listener) {
checkChannel(channel);
Bundle extras = prepareExtrasBundle(channel);
- channel.mAsyncChannel.sendMessage(DISCOVER_PEERS, WIFI_P2P_SCAN_FULL,
- channel.putListener(listener), extras);
+ channel.mAsyncChannel.sendMessage(prepareMessage(DISCOVER_PEERS, WIFI_P2P_SCAN_FULL,
+ channel.putListener(listener), extras, channel.mContext));
}
/**
@@ -1670,8 +1694,8 @@
}
checkChannel(channel);
Bundle extras = prepareExtrasBundle(channel);
- channel.mAsyncChannel.sendMessage(DISCOVER_PEERS, WIFI_P2P_SCAN_SOCIAL,
- channel.putListener(listener), extras);
+ channel.mAsyncChannel.sendMessage(prepareMessage(DISCOVER_PEERS, WIFI_P2P_SCAN_SOCIAL,
+ channel.putListener(listener), extras, channel.mContext));
}
/**
@@ -1720,8 +1744,8 @@
}
Bundle extras = prepareExtrasBundle(channel);
extras.putInt(EXTRA_PARAM_KEY_PEER_DISCOVERY_FREQ, frequencyMhz);
- channel.mAsyncChannel.sendMessage(DISCOVER_PEERS, WIFI_P2P_SCAN_SINGLE_FREQ,
- channel.putListener(listener), extras);
+ channel.mAsyncChannel.sendMessage(prepareMessage(DISCOVER_PEERS, WIFI_P2P_SCAN_SINGLE_FREQ,
+ channel.putListener(listener), extras, channel.mContext));
}
/**
@@ -1785,7 +1809,8 @@
checkP2pConfig(config);
Bundle extras = prepareExtrasBundle(channel);
extras.putParcelable(EXTRA_PARAM_KEY_CONFIG, config);
- channel.mAsyncChannel.sendMessage(CONNECT, 0, channel.putListener(listener), extras);
+ channel.mAsyncChannel.sendMessage(prepareMessage(CONNECT, 0, channel.putListener(listener),
+ extras, channel.mContext));
}
/**
@@ -1839,8 +1864,9 @@
public void createGroup(Channel channel, ActionListener listener) {
checkChannel(channel);
Bundle extras = prepareExtrasBundle(channel);
- channel.mAsyncChannel.sendMessage(CREATE_GROUP, WifiP2pGroup.NETWORK_ID_PERSISTENT,
- channel.putListener(listener), extras);
+ channel.mAsyncChannel.sendMessage(prepareMessage(CREATE_GROUP,
+ WifiP2pGroup.NETWORK_ID_PERSISTENT, channel.putListener(listener), extras,
+ channel.mContext));
}
/**
@@ -1886,8 +1912,8 @@
checkChannel(channel);
Bundle extras = prepareExtrasBundle(channel);
extras.putParcelable(EXTRA_PARAM_KEY_CONFIG, config);
- channel.mAsyncChannel.sendMessage(CREATE_GROUP, 0,
- channel.putListener(listener), extras);
+ channel.mAsyncChannel.sendMessage(prepareMessage(CREATE_GROUP, 0,
+ channel.putListener(listener), extras, channel.mContext));
}
/**
@@ -1934,7 +1960,8 @@
public void startListening(@NonNull Channel channel, @Nullable ActionListener listener) {
checkChannel(channel);
Bundle extras = prepareExtrasBundle(channel);
- channel.mAsyncChannel.sendMessage(START_LISTEN, 0, channel.putListener(listener), extras);
+ channel.mAsyncChannel.sendMessage(prepareMessage(START_LISTEN, 0,
+ channel.putListener(listener), extras, channel.mContext));
}
/**
@@ -2038,8 +2065,8 @@
checkServiceInfo(servInfo);
Bundle extras = prepareExtrasBundle(channel);
extras.putParcelable(EXTRA_PARAM_KEY_SERVICE_INFO, servInfo);
- channel.mAsyncChannel.sendMessage(
- ADD_LOCAL_SERVICE, 0, channel.putListener(listener), extras);
+ channel.mAsyncChannel.sendMessage(prepareMessage(ADD_LOCAL_SERVICE, 0,
+ channel.putListener(listener), extras, channel.mContext));
}
/**
@@ -2162,8 +2189,8 @@
public void discoverServices(Channel channel, ActionListener listener) {
checkChannel(channel);
Bundle extras = prepareExtrasBundle(channel);
- channel.mAsyncChannel.sendMessage(
- DISCOVER_SERVICES, 0, channel.putListener(listener), extras);
+ channel.mAsyncChannel.sendMessage(prepareMessage(DISCOVER_SERVICES, 0,
+ channel.putListener(listener), extras, channel.mContext));
}
/**
@@ -2252,7 +2279,8 @@
public void requestPeers(Channel channel, PeerListListener listener) {
checkChannel(channel);
Bundle extras = prepareExtrasBundle(channel);
- channel.mAsyncChannel.sendMessage(REQUEST_PEERS, 0, channel.putListener(listener), extras);
+ channel.mAsyncChannel.sendMessage(prepareMessage(REQUEST_PEERS, 0,
+ channel.putListener(listener), extras, channel.mContext));
}
/**
@@ -2289,8 +2317,8 @@
public void requestGroupInfo(Channel channel, GroupInfoListener listener) {
checkChannel(channel);
Bundle extras = prepareExtrasBundle(channel);
- channel.mAsyncChannel.sendMessage(
- REQUEST_GROUP_INFO, 0, channel.putListener(listener), extras);
+ channel.mAsyncChannel.sendMessage(prepareMessage(REQUEST_GROUP_INFO, 0,
+ channel.putListener(listener), extras, channel.mContext));
}
/**
@@ -2436,8 +2464,8 @@
@Nullable PersistentGroupInfoListener listener) {
checkChannel(channel);
Bundle extras = prepareExtrasBundle(channel);
- channel.mAsyncChannel.sendMessage(
- REQUEST_PERSISTENT_GROUP_INFO, 0, channel.putListener(listener), extras);
+ channel.mAsyncChannel.sendMessage(prepareMessage(REQUEST_PERSISTENT_GROUP_INFO, 0,
+ channel.putListener(listener), extras, channel.mContext));
}
/** @hide */
@@ -2800,7 +2828,8 @@
if (listener == null) throw new IllegalArgumentException("This listener cannot be null.");
Bundle extras = prepareExtrasBundle(c);
- c.mAsyncChannel.sendMessage(REQUEST_DEVICE_INFO, 0, c.putListener(listener), extras);
+ c.mAsyncChannel.sendMessage(prepareMessage(REQUEST_DEVICE_INFO, 0,
+ c.putListener(listener), extras, c.mContext));
}
/**
@@ -2842,7 +2871,8 @@
Bundle extras = prepareExtrasBundle(c);
extras.putParcelable(EXTRA_PARAM_KEY_PEER_ADDRESS, deviceAddress);
- c.mAsyncChannel.sendMessage(ADD_EXTERNAL_APPROVER, 0, c.putListener(listener), extras);
+ c.mAsyncChannel.sendMessage(prepareMessage(ADD_EXTERNAL_APPROVER, 0,
+ c.putListener(listener), extras, c.mContext));
}
/**
@@ -2867,7 +2897,8 @@
Bundle extras = prepareExtrasBundle(c);
extras.putParcelable(EXTRA_PARAM_KEY_PEER_ADDRESS, deviceAddress);
- c.mAsyncChannel.sendMessage(REMOVE_EXTERNAL_APPROVER, 0, c.putListener(listener), extras);
+ c.mAsyncChannel.sendMessage(prepareMessage(REMOVE_EXTERNAL_APPROVER, 0,
+ c.putListener(listener), extras, c.mContext));
}
/**
@@ -2893,8 +2924,8 @@
Bundle extras = prepareExtrasBundle(c);
extras.putParcelable(EXTRA_PARAM_KEY_PEER_ADDRESS, deviceAddress);
- c.mAsyncChannel.sendMessage(SET_CONNECTION_REQUEST_RESULT,
- result, c.putListener(listener), extras);
+ c.mAsyncChannel.sendMessage(prepareMessage(SET_CONNECTION_REQUEST_RESULT,
+ result, c.putListener(listener), extras, c.mContext));
}
/**
@@ -2926,8 +2957,8 @@
Bundle extras = prepareExtrasBundle(c);
extras.putParcelable(EXTRA_PARAM_KEY_PEER_ADDRESS, deviceAddress);
extras.putString(EXTRA_PARAM_KEY_WPS_PIN, pin);
- c.mAsyncChannel.sendMessage(SET_CONNECTION_REQUEST_RESULT,
- result, c.putListener(listener), extras);
+ c.mAsyncChannel.sendMessage(prepareMessage(SET_CONNECTION_REQUEST_RESULT,
+ result, c.putListener(listener), extras, c.mContext));
}
/**
@@ -2986,8 +3017,8 @@
Bundle extras = prepareExtrasBundle(c);
extras.putParcelableArrayList(EXTRA_PARAM_KEY_INFORMATION_ELEMENT_LIST,
new ArrayList<>(vendorElements));
- c.mAsyncChannel.sendMessage(SET_VENDOR_ELEMENTS, 0,
- c.putListener(listener), extras);
+ c.mAsyncChannel.sendMessage(prepareMessage(SET_VENDOR_ELEMENTS, 0,
+ c.putListener(listener), extras, c.mContext));
}
/**
diff --git a/service/java/com/android/server/wifi/p2p/WifiP2pServiceImpl.java b/service/java/com/android/server/wifi/p2p/WifiP2pServiceImpl.java
index c417758..e3e4c30 100644
--- a/service/java/com/android/server/wifi/p2p/WifiP2pServiceImpl.java
+++ b/service/java/com/android/server/wifi/p2p/WifiP2pServiceImpl.java
@@ -1694,7 +1694,9 @@
replyToMessage(message, WifiP2pManager.RESPONSE_PEERS,
getPeers(getCallingPkgName(message.sendingUid, message.replyTo),
getCallingFeatureId(message.sendingUid, message.replyTo),
- message.sendingUid, (Bundle) message.obj));
+ message.sendingUid, message.getData().getBundle(
+ WifiP2pManager.EXTRA_PARAM_KEY_BUNDLE),
+ message.obj));
break;
case WifiP2pManager.REQUEST_CONNECTION_INFO:
replyToMessage(message, WifiP2pManager.RESPONSE_CONNECTION_INFO,
@@ -1707,7 +1709,8 @@
break;
}
int uid = message.sendingUid;
- Bundle extras = (Bundle) message.obj;
+ Bundle extras = message.getData()
+ .getBundle(WifiP2pManager.EXTRA_PARAM_KEY_BUNDLE);
boolean hasPermission = false;
if (isPlatformOrTargetSdkLessThanT(packageName, uid)) {
hasPermission = mWifiPermissionsUtil.checkCanAccessWifiDirect(
@@ -1716,7 +1719,7 @@
uid, false);
} else {
hasPermission = checkNearbyDevicesPermission(uid, packageName,
- extras, "REQUEST_GROUP_INFO");
+ extras, "REQUEST_GROUP_INFO", message.obj);
}
if (!hasPermission) {
replyToMessage(message, WifiP2pManager.RESPONSE_GROUP_INFO, null);
@@ -1743,10 +1746,11 @@
new WifiP2pGroupList());
break;
}
- Bundle extras = (Bundle) message.obj;
+ Bundle extras = message.getData()
+ .getBundle(WifiP2pManager.EXTRA_PARAM_KEY_BUNDLE);
if (!isPlatformOrTargetSdkLessThanT(packageName, message.sendingUid)
&& !checkNearbyDevicesPermission(message.sendingUid, packageName,
- extras, "REQUEST_PERSISTENT_GROUP_INFO")) {
+ extras, "REQUEST_PERSISTENT_GROUP_INFO", message.obj)) {
loge("Permission violation - no NEARBY_WIFI_DEVICES permission, uid = "
+ message.sendingUid);
replyToMessage(message, WifiP2pManager.RESPONSE_PERSISTENT_GROUP_INFO,
@@ -1885,10 +1889,11 @@
}
break;
case WifiP2pManager.UPDATE_CHANNEL_INFO: {
- if (!(message.obj instanceof Bundle)) {
+ Bundle bundle = message.getData()
+ .getBundle(WifiP2pManager.EXTRA_PARAM_KEY_BUNDLE);
+ if (!(bundle instanceof Bundle)) {
break;
}
- Bundle bundle = (Bundle) message.obj;
String pkgName = bundle.getString(WifiP2pManager.CALLING_PACKAGE);
String featureId = bundle.getString(WifiP2pManager.CALLING_FEATURE_ID);
IBinder binder = bundle.getBinder(WifiP2pManager.CALLING_BINDER);
@@ -1904,8 +1909,7 @@
clientInfo.mPackageName = pkgName;
clientInfo.mFeatureId = featureId;
if (SdkLevel.isAtLeastS()) {
- AttributionSource source = (AttributionSource) bundle.getParcelable(
- WifiManager.EXTRA_PARAM_KEY_ATTRIBUTION_SOURCE);
+ AttributionSource source = (AttributionSource) message.obj;
if (null != source) {
mClientAttributionSource.put(binder, source);
}
@@ -1921,7 +1925,8 @@
break;
}
int uid = message.sendingUid;
- Bundle extras = (Bundle) message.obj;
+ Bundle extras = message.getData()
+ .getBundle(WifiP2pManager.EXTRA_PARAM_KEY_BUNDLE);
boolean hasPermission = false;
if (isPlatformOrTargetSdkLessThanT(packageName, uid)) {
hasPermission = mWifiPermissionsUtil.checkCanAccessWifiDirect(
@@ -1930,7 +1935,7 @@
uid, false);
} else {
hasPermission = checkNearbyDevicesPermission(uid, packageName,
- extras, "REQUEST_DEVICE_INFO");
+ extras, "REQUEST_DEVICE_INFO", message.obj);
}
if (!hasPermission) {
replyToMessage(message, WifiP2pManager.RESPONSE_DEVICE_INFO, null);
@@ -1949,7 +1954,8 @@
replyToMessage(message, WifiP2pManager.REMOVE_CLIENT_SUCCEEDED);
break;
case WifiP2pManager.ADD_EXTERNAL_APPROVER: {
- Bundle extras = (Bundle) message.obj;
+ Bundle extras = message.getData().getBundle(
+ WifiP2pManager.EXTRA_PARAM_KEY_BUNDLE);
MacAddress devAddr = extras.getParcelable(
WifiP2pManager.EXTRA_PARAM_KEY_PEER_ADDRESS);
IBinder binder = extras.getBinder(WifiP2pManager.CALLING_BINDER);
@@ -1977,7 +1983,8 @@
break;
}
case WifiP2pManager.REMOVE_EXTERNAL_APPROVER: {
- Bundle extras = (Bundle) message.obj;
+ Bundle extras = message.getData().getBundle(
+ WifiP2pManager.EXTRA_PARAM_KEY_BUNDLE);
MacAddress devAddr = extras.getParcelable(
WifiP2pManager.EXTRA_PARAM_KEY_PEER_ADDRESS);
IBinder binder = extras.getBinder(WifiP2pManager.CALLING_BINDER);
@@ -2013,11 +2020,13 @@
replyToMessage(message, WifiP2pManager.SET_VENDOR_ELEMENTS_FAILED);
break;
}
- if (!checkNearbyDevicesPermission(message, "SET_VENDOR_ELEMENTS")) {
+ if (!SdkLevel.isAtLeastS()
+ || !checkNearbyDevicesPermission(message, "SET_VENDOR_ELEMENTS")) {
replyToMessage(message, WifiP2pManager.SET_VENDOR_ELEMENTS_FAILED);
break;
}
- Bundle extras = (Bundle) message.obj;
+ Bundle extras = message.getData()
+ .getBundle(WifiP2pManager.EXTRA_PARAM_KEY_BUNDLE);
ArrayList<ScanResult.InformationElement> ies =
extras.getParcelableArrayList(
WifiP2pManager.EXTRA_PARAM_KEY_INFORMATION_ELEMENT_LIST);
@@ -2404,7 +2413,8 @@
}
int scanType = message.arg1;
int uid = message.sendingUid;
- Bundle extras = (Bundle) message.obj;
+ Bundle extras = message.getData()
+ .getBundle(WifiP2pManager.EXTRA_PARAM_KEY_BUNDLE);
int freq = extras.getInt(
WifiP2pManager.EXTRA_PARAM_KEY_PEER_DISCOVERY_FREQ,
WifiP2pManager.WIFI_P2P_SCAN_FREQ_UNSPECIFIED);
@@ -2421,7 +2431,7 @@
uid, true);
} else {
hasPermission = checkNearbyDevicesPermission(uid, packageName,
- extras, "DISCOVER_PEERS");
+ extras, "DISCOVER_PEERS", message.obj);
}
if (!hasPermission) {
@@ -2468,7 +2478,8 @@
break;
}
int uid = message.sendingUid;
- Bundle extras = (Bundle) message.obj;
+ Bundle extras = message.getData()
+ .getBundle(WifiP2pManager.EXTRA_PARAM_KEY_BUNDLE);
boolean hasPermission = false;
if (isPlatformOrTargetSdkLessThanT(packageName, uid)) {
hasPermission = mWifiPermissionsUtil.checkCanAccessWifiDirect(
@@ -2477,7 +2488,7 @@
uid, true);
} else {
hasPermission = checkNearbyDevicesPermission(uid, packageName,
- extras, "DISCOVER_SERVICES");
+ extras, "DISCOVER_SERVICES", message.obj);
}
if (!hasPermission) {
replyToMessage(message, WifiP2pManager.DISCOVER_SERVICES_FAILED,
@@ -2535,8 +2546,9 @@
break;
}
int uid = message.sendingUid;
- Bundle extras = (Bundle) message.obj;
- boolean hasPermission = false;
+ Bundle extras = message.getData()
+ .getBundle(WifiP2pManager.EXTRA_PARAM_KEY_BUNDLE);
+ boolean hasPermission;
if (isPlatformOrTargetSdkLessThanT(packageName, uid)) {
hasPermission = mWifiPermissionsUtil.checkCanAccessWifiDirect(
packageName,
@@ -2544,7 +2556,7 @@
uid, false);
} else {
hasPermission = checkNearbyDevicesPermission(uid, packageName,
- extras, "ADD_LOCAL_SERVICE");
+ extras, "ADD_LOCAL_SERVICE", message.obj);
}
if (!hasPermission) {
replyToMessage(message, WifiP2pManager.ADD_LOCAL_SERVICE_FAILED);
@@ -2633,8 +2645,9 @@
break;
}
int uid = message.sendingUid;
- Bundle extras = (Bundle) message.obj;
- boolean hasPermission = false;
+ Bundle extras = message.getData()
+ .getBundle(WifiP2pManager.EXTRA_PARAM_KEY_BUNDLE);
+ boolean hasPermission;
if (isPlatformOrTargetSdkLessThanT(packageName, uid)) {
hasPermission = mWifiPermissionsUtil.checkCanAccessWifiDirect(
packageName,
@@ -2642,7 +2655,7 @@
uid, true);
} else {
hasPermission = checkNearbyDevicesPermission(uid, packageName,
- extras, "START_LISTEN");
+ extras, "START_LISTEN", message.obj);
}
if (!hasPermission) {
replyToMessage(message, WifiP2pManager.START_LISTEN_FAILED);
@@ -2755,7 +2768,8 @@
break;
}
int uid = message.sendingUid;
- Bundle extras = (Bundle) message.obj;
+ Bundle extras = message.getData()
+ .getBundle(WifiP2pManager.EXTRA_PARAM_KEY_BUNDLE);
boolean hasPermission = false;
if (isPlatformOrTargetSdkLessThanT(packageName, uid)) {
hasPermission = mWifiPermissionsUtil.checkCanAccessWifiDirect(
@@ -2764,7 +2778,7 @@
uid, false);
} else {
hasPermission = checkNearbyDevicesPermission(uid, packageName,
- extras, "CONNECT");
+ extras, "CONNECT", message.obj);
}
if (!hasPermission) {
replyToMessage(message, WifiP2pManager.CONNECT_FAILED);
@@ -2936,8 +2950,9 @@
break;
}
int uid = message.sendingUid;
- Bundle extras = (Bundle) message.obj;
- boolean hasPermission = false;
+ Bundle extras = message.getData()
+ .getBundle(WifiP2pManager.EXTRA_PARAM_KEY_BUNDLE);
+ boolean hasPermission;
if (isPlatformOrTargetSdkLessThanT(packageName, uid)) {
hasPermission = mWifiPermissionsUtil.checkCanAccessWifiDirect(
packageName,
@@ -2945,7 +2960,7 @@
uid, false);
} else {
hasPermission = checkNearbyDevicesPermission(uid, packageName,
- extras, "CREATE_GROUP");
+ extras, "CREATE_GROUP", message.obj);
}
if (!hasPermission) {
replyToMessage(message, WifiP2pManager.CREATE_GROUP_FAILED,
@@ -3027,8 +3042,9 @@
break;
}
int uid = message.sendingUid;
- Bundle extras = (Bundle) message.obj;
- boolean hasPermission = false;
+ Bundle extras = message.getData()
+ .getBundle(WifiP2pManager.EXTRA_PARAM_KEY_BUNDLE);
+ boolean hasPermission;
if (isPlatformOrTargetSdkLessThanT(packageName, uid)) {
hasPermission = mWifiPermissionsUtil.checkCanAccessWifiDirect(
packageName,
@@ -3036,7 +3052,7 @@
uid, true);
} else {
hasPermission = checkNearbyDevicesPermission(uid, packageName,
- extras, "START_LISTEN");
+ extras, "START_LISTEN", message.obj);
}
if (!hasPermission) {
replyToMessage(message, WifiP2pManager.START_LISTEN_FAILED);
@@ -4001,7 +4017,8 @@
break;
}
int uid = message.sendingUid;
- Bundle extras = (Bundle) message.obj;
+ Bundle extras = message.getData()
+ .getBundle(WifiP2pManager.EXTRA_PARAM_KEY_BUNDLE);
boolean hasPermission = false;
if (isPlatformOrTargetSdkLessThanT(packageName, uid)) {
hasPermission = mWifiPermissionsUtil.checkCanAccessWifiDirect(
@@ -4010,7 +4027,7 @@
uid, false);
} else {
hasPermission = checkNearbyDevicesPermission(uid, packageName,
- extras, "CONNECT");
+ extras, "CONNECT", message.obj);
}
if (!hasPermission) {
replyToMessage(message, WifiP2pManager.CONNECT_FAILED);
@@ -4385,16 +4402,15 @@
return false;
}
int uid = message.sendingUid;
- Bundle extras = (Bundle) message.obj;
- return checkNearbyDevicesPermission(uid, packageName, extras, cmd);
+ Bundle extras = message.getData()
+ .getBundle(WifiP2pManager.EXTRA_PARAM_KEY_BUNDLE);
+ return checkNearbyDevicesPermission(uid, packageName, extras, cmd, message.obj);
}
private boolean checkNearbyDevicesPermission(int uid, String packageName, Bundle extras,
- String message) {
- if (extras == null) {
- return false;
- }
- if (extras.getBoolean(WifiP2pManager.EXTRA_PARAM_KEY_INTERNAL_MESSAGE)) {
+ String message, Object attributionSource) {
+ if (extras != null
+ && extras.getBoolean(WifiP2pManager.EXTRA_PARAM_KEY_INTERNAL_MESSAGE)) {
// bypass permission check for internal call.
return true;
}
@@ -4405,9 +4421,8 @@
return false;
}
return mWifiPermissionsUtil.checkNearbyDevicesPermission(
- extras.getParcelable(
- WifiManager.EXTRA_PARAM_KEY_ATTRIBUTION_SOURCE),
- true, TAG + " " + message);
+ SdkLevel.isAtLeastS() ? (AttributionSource) attributionSource : null, true,
+ TAG + " " + message);
}
private boolean isPackageExisted(String pkgName) {
@@ -5424,7 +5439,11 @@
mServiceDiscReqId = null;
Bundle extras = new Bundle();
extras.putBoolean(WifiP2pManager.EXTRA_PARAM_KEY_INTERNAL_MESSAGE, true);
- sendMessage(WifiP2pManager.DISCOVER_PEERS, extras);
+
+ Message msg = Message.obtain();
+ msg.what = WifiP2pManager.DISCOVER_PEERS;
+ msg.getData().putBundle(WifiP2pManager.EXTRA_PARAM_KEY_BUNDLE, extras);
+ sendMessage(msg);
sendDisconnectWifiRequest(false);
}
@@ -5813,7 +5832,7 @@
* @return WifiP2pDeviceList the peer list
*/
private WifiP2pDeviceList getPeers(String pkgName, @Nullable String featureId, int uid,
- Bundle extras) {
+ Bundle extras, Object attributionSource) {
// getPeers() is guaranteed to be invoked after Wifi Service is up
// This ensures getInstance() will return a non-null object now
boolean hasPermission = false;
@@ -5822,7 +5841,7 @@
pkgName, featureId, uid, true);
} else {
hasPermission = checkNearbyDevicesPermission(uid, pkgName,
- extras, "getPeers");
+ extras, "getPeers", attributionSource);
}
if (hasPermission) {
return new WifiP2pDeviceList(mPeers);
@@ -6056,7 +6075,8 @@
private boolean checkExternalApproverCaller(Message message,
IBinder binder, MacAddress devAddr, String cmd) {
- Bundle extras = (Bundle) message.obj;
+ Bundle extras = message.getData()
+ .getBundle(WifiP2pManager.EXTRA_PARAM_KEY_BUNDLE);
if (!mWifiPermissionsUtil.checkManageWifiNetworkSelectionPermission(
message.sendingUid)) {
loge("Permission violation - no MANAGE_WIFI_NETWORK_SELECTION,"
@@ -6113,7 +6133,7 @@
}
private boolean handleSetConnectionResultCommon(@NonNull Message message) {
- Bundle extras = (Bundle) message.obj;
+ Bundle extras = message.getData().getBundle(WifiP2pManager.EXTRA_PARAM_KEY_BUNDLE);
MacAddress devAddr = extras.getParcelable(
WifiP2pManager.EXTRA_PARAM_KEY_PEER_ADDRESS);
IBinder binder = extras.getBinder(WifiP2pManager.CALLING_BINDER);
@@ -6170,7 +6190,8 @@
&& WpsInfo.KEYPAD == mSavedPeerConfig.wps.setup) {
sendMessage(PEER_CONNECTION_USER_CONFIRM);
} else {
- Bundle extras = (Bundle) message.obj;
+ Bundle extras = message.getData().getBundle(
+ WifiP2pManager.EXTRA_PARAM_KEY_BUNDLE);
String pin = extras.getString(
WifiP2pManager.EXTRA_PARAM_KEY_WPS_PIN);
if (!TextUtils.isEmpty(pin)) {
diff --git a/service/tests/wifitests/src/com/android/server/wifi/p2p/WifiP2pServiceImplTest.java b/service/tests/wifitests/src/com/android/server/wifi/p2p/WifiP2pServiceImplTest.java
index b2e844b..b119537 100644
--- a/service/tests/wifitests/src/com/android/server/wifi/p2p/WifiP2pServiceImplTest.java
+++ b/service/tests/wifitests/src/com/android/server/wifi/p2p/WifiP2pServiceImplTest.java
@@ -370,7 +370,10 @@
bundle.putString(WifiP2pManager.CALLING_PACKAGE, pkgName);
bundle.putString(WifiP2pManager.CALLING_FEATURE_ID, featureId);
bundle.putBinder(WifiP2pManager.CALLING_BINDER, binder);
- msg.obj = bundle;
+ if (SdkLevel.isAtLeastS()) {
+ msg.obj = new AttributionSource(1000, TEST_PACKAGE_NAME, null);
+ }
+ msg.getData().putBundle(WifiP2pManager.EXTRA_PARAM_KEY_BUNDLE, bundle);
msg.replyTo = replyMessenger;
mP2pStateMachineMessenger.send(Message.obtain(msg));
mLooper.dispatchAll();
@@ -386,7 +389,10 @@
Bundle extras = new Bundle();
extras.putParcelable(WifiP2pManager.EXTRA_PARAM_KEY_SERVICE_INFO, mTestWifiP2pServiceInfo);
msg.what = WifiP2pManager.ADD_LOCAL_SERVICE;
- msg.obj = extras;
+ if (SdkLevel.isAtLeastS()) {
+ msg.obj = new AttributionSource(1000, TEST_PACKAGE_NAME, null);
+ }
+ msg.getData().putBundle(WifiP2pManager.EXTRA_PARAM_KEY_BUNDLE, extras);
msg.replyTo = replyMessenger;
mP2pStateMachineMessenger.send(Message.obtain(msg));
mLooper.dispatchAll();
@@ -437,7 +443,10 @@
extras.putInt(WifiP2pManager.EXTRA_PARAM_KEY_PEER_DISCOVERY_FREQ, frequencyMhz);
msg.what = WifiP2pManager.DISCOVER_PEERS;
msg.arg1 = type;
- msg.obj = extras;
+ if (SdkLevel.isAtLeastS()) {
+ msg.obj = new AttributionSource(1000, TEST_PACKAGE_NAME, null);
+ }
+ msg.getData().putBundle(WifiP2pManager.EXTRA_PARAM_KEY_BUNDLE, extras);
msg.replyTo = replyMessenger;
mP2pStateMachineMessenger.send(Message.obtain(msg));
mLooper.dispatchAll();
@@ -466,7 +475,10 @@
Message msg = Message.obtain();
Bundle extras = new Bundle();
msg.what = WifiP2pManager.DISCOVER_SERVICES;
- msg.obj = extras;
+ if (SdkLevel.isAtLeastS()) {
+ msg.obj = new AttributionSource(1000, TEST_PACKAGE_NAME, null);
+ }
+ msg.getData().putBundle(WifiP2pManager.EXTRA_PARAM_KEY_BUNDLE, extras);
msg.replyTo = replyMessenger;
mP2pStateMachineMessenger.send(Message.obtain(msg));
mLooper.dispatchAll();
@@ -481,7 +493,10 @@
Message msg = Message.obtain();
Bundle extras = new Bundle();
msg.what = WifiP2pManager.REQUEST_PEERS;
- msg.obj = extras;
+ if (SdkLevel.isAtLeastS()) {
+ msg.obj = new AttributionSource(1000, TEST_PACKAGE_NAME, null);
+ }
+ msg.getData().putBundle(WifiP2pManager.EXTRA_PARAM_KEY_BUNDLE, extras);
msg.replyTo = replyMessenger;
mP2pStateMachineMessenger.send(Message.obtain(msg));
mLooper.dispatchAll();
@@ -504,7 +519,10 @@
Message msg = Message.obtain();
Bundle extras = new Bundle();
msg.what = WifiP2pManager.REQUEST_GROUP_INFO;
- msg.obj = extras;
+ if (SdkLevel.isAtLeastS()) {
+ msg.obj = new AttributionSource(1000, TEST_PACKAGE_NAME, null);
+ }
+ msg.getData().putBundle(WifiP2pManager.EXTRA_PARAM_KEY_BUNDLE, extras);
msg.replyTo = replyMessenger;
mP2pStateMachineMessenger.send(Message.obtain(msg));
mLooper.dispatchAll();
@@ -703,7 +721,10 @@
Bundle extras = new Bundle();
extras.putParcelable(WifiP2pManager.EXTRA_PARAM_KEY_CONFIG, config);
msg.what = WifiP2pManager.CONNECT;
- msg.obj = extras;
+ if (SdkLevel.isAtLeastS()) {
+ msg.obj = new AttributionSource(1000, TEST_PACKAGE_NAME, null);
+ }
+ msg.getData().putBundle(WifiP2pManager.EXTRA_PARAM_KEY_BUNDLE, extras);
msg.replyTo = replyMessenger;
mP2pStateMachineMessenger.send(Message.obtain(msg));
mLooper.dispatchAll();
@@ -740,7 +761,10 @@
extras.putParcelable(WifiP2pManager.EXTRA_PARAM_KEY_CONFIG, config);
msg.what = WifiP2pManager.CREATE_GROUP;
msg.arg1 = netId;
- msg.obj = extras;
+ if (SdkLevel.isAtLeastS()) {
+ msg.obj = new AttributionSource(1000, TEST_PACKAGE_NAME, null);
+ }
+ msg.getData().putBundle(WifiP2pManager.EXTRA_PARAM_KEY_BUNDLE, extras);
msg.replyTo = replyMessenger;
mP2pStateMachineMessenger.send(Message.obtain(msg));
mLooper.dispatchAll();
@@ -756,12 +780,13 @@
ArrayList<ScanResult.InformationElement> ies) throws Exception {
Message msg = Message.obtain();
Bundle extras = new Bundle();
- extras.putParcelable(WifiManager.EXTRA_PARAM_KEY_ATTRIBUTION_SOURCE,
- mContext.getAttributionSource());
extras.putParcelableArrayList(WifiP2pManager.EXTRA_PARAM_KEY_INFORMATION_ELEMENT_LIST,
ies);
msg.what = WifiP2pManager.SET_VENDOR_ELEMENTS;
- msg.obj = extras;
+ if (SdkLevel.isAtLeastS()) {
+ msg.obj = mContext.getAttributionSource();
+ }
+ msg.getData().putBundle(WifiP2pManager.EXTRA_PARAM_KEY_BUNDLE, extras);
msg.replyTo = replyMessenger;
mP2pStateMachineMessenger.send(Message.obtain(msg));
mLooper.dispatchAll();
@@ -785,7 +810,10 @@
extras.putBinder(WifiP2pManager.CALLING_BINDER, binder);
}
msg.what = WifiP2pManager.ADD_EXTERNAL_APPROVER;
- msg.obj = extras;
+ if (SdkLevel.isAtLeastS()) {
+ msg.obj = new AttributionSource(1000, TEST_PACKAGE_NAME, null);
+ }
+ msg.getData().putBundle(WifiP2pManager.EXTRA_PARAM_KEY_BUNDLE, extras);
msg.replyTo = replyMessenger;
mP2pStateMachineMessenger.send(Message.obtain(msg));
mLooper.dispatchAll();
@@ -808,7 +836,10 @@
extras.putBinder(WifiP2pManager.CALLING_BINDER, binder);
}
msg.what = WifiP2pManager.REMOVE_EXTERNAL_APPROVER;
- msg.obj = extras;
+ if (SdkLevel.isAtLeastS()) {
+ msg.obj = new AttributionSource(1000, TEST_PACKAGE_NAME, null);
+ }
+ msg.getData().putBundle(WifiP2pManager.EXTRA_PARAM_KEY_BUNDLE, extras);
msg.replyTo = replyMessenger;
mP2pStateMachineMessenger.send(Message.obtain(msg));
mLooper.dispatchAll();
@@ -832,7 +863,10 @@
extras.putBinder(WifiP2pManager.CALLING_BINDER, binder);
}
msg.what = WifiP2pManager.SET_CONNECTION_REQUEST_RESULT;
- msg.obj = extras;
+ if (SdkLevel.isAtLeastS()) {
+ msg.obj = new AttributionSource(1000, TEST_PACKAGE_NAME, null);
+ }
+ msg.getData().putBundle(WifiP2pManager.EXTRA_PARAM_KEY_BUNDLE, extras);
msg.arg1 = result;
msg.replyTo = replyMessenger;
mP2pStateMachineMessenger.send(Message.obtain(msg));
@@ -895,7 +929,10 @@
Message msg = Message.obtain();
Bundle extras = new Bundle();
msg.what = what;
- msg.obj = extras;
+ if (SdkLevel.isAtLeastS()) {
+ msg.obj = new AttributionSource(1000, TEST_PACKAGE_NAME, null);
+ }
+ msg.getData().putBundle(WifiP2pManager.EXTRA_PARAM_KEY_BUNDLE, extras);
if (replyMessenger != null) {
msg.replyTo = replyMessenger;
}