Assign the bit calculation as long to prevent overflow

The value should be assigned as a long to do the bit calculation
as the mNetworkCapabilities is intended to be a long. Otherwise,
the value will be temporary assigned into an integer then
assigned to the target long. When the bit shift calculation
is out of the integer scope, the calculation will overflow and
result in unexpected bebavior.

Without assigning to a long, ConnectivityServiceTest will get
Out-Of-Memory in StringBuilder while generating toString() in
NetworkCapabilities after updating tests to verify
NET_CAPABILITY_VSIM and NET_CAPABILITY_BIP.

Bug: 130869457
Test: atest FrameworksNetTests
Change-Id: I4d34c1215c7efb6dc352c314107792e3fa512ad7
This commit is contained in:
Chiachang Wang
2021-04-06 21:15:42 +08:00
parent 133733bdd2
commit 7dd2a3d7db
2 changed files with 18 additions and 12 deletions

View File

@@ -593,8 +593,9 @@ public final class NetworkCapabilities implements Parcelable {
// TODO: Consider adding unwanted capabilities to the public API and mention this
// in the documentation.
checkValidCapability(capability);
mNetworkCapabilities |= 1 << capability;
mUnwantedNetworkCapabilities &= ~(1 << capability); // remove from unwanted capability list
mNetworkCapabilities |= 1L << capability;
// remove from unwanted capability list
mUnwantedNetworkCapabilities &= ~(1L << capability);
return this;
}
@@ -613,8 +614,8 @@ public final class NetworkCapabilities implements Parcelable {
*/
public void addUnwantedCapability(@NetCapability int capability) {
checkValidCapability(capability);
mUnwantedNetworkCapabilities |= 1 << capability;
mNetworkCapabilities &= ~(1 << capability); // remove from requested capabilities
mUnwantedNetworkCapabilities |= 1L << capability;
mNetworkCapabilities &= ~(1L << capability); // remove from requested capabilities
}
/**
@@ -627,7 +628,7 @@ public final class NetworkCapabilities implements Parcelable {
*/
public @NonNull NetworkCapabilities removeCapability(@NetCapability int capability) {
checkValidCapability(capability);
final long mask = ~(1 << capability);
final long mask = ~(1L << capability);
mNetworkCapabilities &= mask;
return this;
}
@@ -642,7 +643,7 @@ public final class NetworkCapabilities implements Parcelable {
*/
public @NonNull NetworkCapabilities removeUnwantedCapability(@NetCapability int capability) {
checkValidCapability(capability);
mUnwantedNetworkCapabilities &= ~(1 << capability);
mUnwantedNetworkCapabilities &= ~(1L << capability);
return this;
}
@@ -710,14 +711,14 @@ public final class NetworkCapabilities implements Parcelable {
*/
public boolean hasCapability(@NetCapability int capability) {
return isValidCapability(capability)
&& ((mNetworkCapabilities & (1 << capability)) != 0);
&& ((mNetworkCapabilities & (1L << capability)) != 0);
}
/** @hide */
@SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
public boolean hasUnwantedCapability(@NetCapability int capability) {
return isValidCapability(capability)
&& ((mUnwantedNetworkCapabilities & (1 << capability)) != 0);
&& ((mUnwantedNetworkCapabilities & (1L << capability)) != 0);
}
/**