From 94f79a6438c7021db9c02003865c17f3a0da1718 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 24 May 2016 21:46:13 +0200 Subject: [PATCH] prevent crash caused by bad netmask given to WifiStateChangeService My guess is that is from IPv6, but those should be filtered out in this code before it gets to the crash point. Here's the stacktrace: java.lang.RuntimeException: An error occured while executing doInBackground() at android.os.AsyncTask$3.done(AsyncTask.java:300) at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355) at java.util.concurrent.FutureTask.setException(FutureTask.java:222) at java.util.concurrent.FutureTask.run(FutureTask.java:242) at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) at java.lang.Thread.run(Thread.java:841) Caused by: java.lang.IllegalArgumentException: Value [64] not in range [0,32] at org.apache.commons.net.util.SubnetUtils.rangeCheck(SubnetUtils.java:339) at org.apache.commons.net.util.SubnetUtils.calculate(SubnetUtils.java:264) at org.apache.commons.net.util.SubnetUtils.(SubnetUtils.java:51) at org.fdroid.fdroid.net.WifiStateChangeService.setIpInfoFromNetworkInterface(WifiStateChangeService.java:222) at org.fdroid.fdroid.net.WifiStateChangeService.access$300(WifiStateChangeService.java:37) at org.fdroid.fdroid.net.WifiStateChangeService$WaitForWifiAsyncTask.doInBackground(WifiStateChangeService.java:99) at org.fdroid.fdroid.net.WifiStateChangeService$WaitForWifiAsyncTask.doInBackground(WifiStateChangeService.java:71) at android.os.AsyncTask$2.call(AsyncTask.java:288) at java.util.concurrent.FutureTask.run(FutureTask.java:237) ... 4 more java.lang.IllegalArgumentException: Value [64] not in range [0,32] at org.apache.commons.net.util.SubnetUtils.rangeCheck(SubnetUtils.java:339) at org.apache.commons.net.util.SubnetUtils.calculate(SubnetUtils.java:264) at org.apache.commons.net.util.SubnetUtils.(SubnetUtils.java:51) at org.fdroid.fdroid.net.WifiStateChangeService.setIpInfoFromNetworkInterface(WifiStateChangeService.java:222) at org.fdroid.fdroid.net.WifiStateChangeService.access$300(WifiStateChangeService.java:37) at org.fdroid.fdroid.net.WifiStateChangeService$WaitForWifiAsyncTask.doInBackground(WifiStateChangeService.java:99) at org.fdroid.fdroid.net.WifiStateChangeService$WaitForWifiAsyncTask.doInBackground(WifiStateChangeService.java:71) at android.os.AsyncTask$2.call(AsyncTask.java:288) at java.util.concurrent.FutureTask.run(FutureTask.java:237) at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) at java.lang.Thread.run(Thread.java:841) --- .../fdroid/fdroid/net/WifiStateChangeService.java | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/fdroid/fdroid/net/WifiStateChangeService.java b/app/src/main/java/org/fdroid/fdroid/net/WifiStateChangeService.java index bd624427d..d0560a052 100644 --- a/app/src/main/java/org/fdroid/fdroid/net/WifiStateChangeService.java +++ b/app/src/main/java/org/fdroid/fdroid/net/WifiStateChangeService.java @@ -36,6 +36,12 @@ import java.util.Locale; * which is how it can be triggered by code, or it came in from the system * via {@link org.fdroid.fdroid.receiver.WifiStateChangeReceiver}, in * which case an instance of {@link NetworkInfo} is included. + * + * The work is done in a {@link Thread} so that new incoming {@code Intents} + * are not blocked by processing. A new {@code Intent} immediately nullifies + * the current state because it means that something about the wifi has + * changed. Having the {@code Thread} also makes it easy to kill work + * that is in progress. */ public class WifiStateChangeService extends IntentService { private static final String TAG = "WifiStateChangeService"; @@ -202,9 +208,15 @@ public class WifiStateChangeService extends IntentService { } // the following methods were not added until android-9/Gingerbread for (InterfaceAddress address : netIf.getInterfaceAddresses()) { + short networkPrefixLength = address.getNetworkPrefixLength(); + if (networkPrefixLength > 32) { + // something is giving a "/64" netmask, IPv6? + // java.lang.IllegalArgumentException: Value [64] not in range [0,32] + continue; + } if (inetAddress.equals(address.getAddress()) && !TextUtils.isEmpty(FDroidApp.ipAddressString)) { String cidr = String.format(Locale.ENGLISH, "%s/%d", - FDroidApp.ipAddressString, address.getNetworkPrefixLength()); + FDroidApp.ipAddressString, networkPrefixLength); FDroidApp.subnetInfo = new SubnetUtils(cidr).getInfo(); break; }