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:
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user