Skip to content

Commit f9f6718

Browse files
author
Alon Blayer-Gat
committed
lint: fixes + baseline
Signed-off-by: Alon Blayer-Gat <[email protected]>
1 parent 7a65695 commit f9f6718

33 files changed

+5936
-327
lines changed

Diff for: .idea/inspectionProfiles/Default.xml

+1-37
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: tunnel/build.gradle.kts

+1
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ android {
5555
lint {
5656
disable += "LongLogTag"
5757
disable += "NewApi"
58+
baseline = file("lint-baseline.xml")
5859
}
5960
publishing {
6061
singleVariant("release") {

Diff for: tunnel/lint-baseline.xml

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<issues format="6" by="lint 8.3.0-alpha09" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha09)" variant="all" version="8.3.0-alpha09">
3+
4+
<issue
5+
id="UnsafeDynamicallyLoadedCode"
6+
message="Dynamically loading code using `load` is risky, please use `loadLibrary` instead when possible"
7+
errorLine1=" System.load(f.getAbsolutePath());"
8+
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
9+
<location
10+
file="src/main/java/com/wireguard/android/util/SharedLibraryLoader.java"
11+
line="80"
12+
column="17"/>
13+
</issue>
14+
15+
</issues>

Diff for: tunnel/src/main/java/com/wireguard/android/backend/GoBackend.java

+12-9
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@
77

88
import android.content.Context;
99
import android.content.Intent;
10-
import android.os.Build;
10+
import android.net.VpnService.Builder;
11+
import android.os.Build.VERSION;
12+
import android.os.Build.VERSION_CODES;
1113
import android.os.ParcelFileDescriptor;
1214
import android.system.OsConstants;
1315
import android.util.Log;
@@ -24,14 +26,14 @@
2426
import com.wireguard.util.NonNullForAll;
2527

2628
import java.net.InetAddress;
27-
import java.time.Instant;
2829
import java.util.Collections;
2930
import java.util.Set;
3031
import java.util.concurrent.ExecutionException;
3132
import java.util.concurrent.FutureTask;
3233
import java.util.concurrent.LinkedBlockingQueue;
3334
import java.util.concurrent.TimeUnit;
3435
import java.util.concurrent.TimeoutException;
36+
import java.util.regex.Pattern;
3537

3638
import androidx.annotation.Nullable;
3739
import androidx.collection.ArraySet;
@@ -43,6 +45,7 @@
4345
@NonNullForAll
4446
public final class GoBackend implements Backend {
4547
private static final int DNS_RESOLUTION_RETRIES = 10;
48+
private static final Pattern COMPILE = Pattern.compile("\\n");
4649
private static final String TAG = "WireGuard/GoBackend";
4750
@Nullable private static AlwaysOnCallback alwaysOnCallback;
4851
private static GhettoCompletableFuture<VpnService> vpnService = new GhettoCompletableFuture<>();
@@ -127,7 +130,7 @@ public Statistics getStatistics(final Tunnel tunnel) {
127130
long rx = 0;
128131
long tx = 0;
129132
long latestHandshakeMSec = 0;
130-
for (final String line : config.split("\\n")) {
133+
for (final String line : COMPILE.split(config)) {
131134
if (line.startsWith("public_key=")) {
132135
if (key != null)
133136
stats.add(key, rx, tx, latestHandshakeMSec);
@@ -212,7 +215,7 @@ public State setState(final Tunnel tunnel, State state, @Nullable final Config c
212215
if (currentTunnel != null)
213216
setStateInternal(currentTunnel, null, State.DOWN);
214217
try {
215-
setStateInternal(tunnel, config, state);
218+
setStateInternal(tunnel, config, State.UP);
216219
} catch (final Exception e) {
217220
if (originalTunnel != null)
218221
setStateInternal(originalTunnel, originalConfig, State.UP);
@@ -232,7 +235,7 @@ private void setStateInternal(final Tunnel tunnel, @Nullable final Config config
232235
if (config == null)
233236
throw new BackendException(Reason.TUNNEL_MISSING_CONFIG);
234237

235-
if (VpnService.prepare(context) != null)
238+
if (android.net.VpnService.prepare(context) != null)
236239
throw new BackendException(Reason.VPN_NOT_AUTHORIZED);
237240

238241
final VpnService service;
@@ -278,7 +281,7 @@ private void setStateInternal(final Tunnel tunnel, @Nullable final Config config
278281
final String goConfig = config.toWgUserspaceString();
279282

280283
// Create the vpn tunnel with android API
281-
final VpnService.Builder builder = service.getBuilder();
284+
final Builder builder = service.getBuilder();
282285
builder.setSession(tunnel.getName());
283286

284287
for (final String excludedApplication : config.getInterface().getExcludedApplications())
@@ -313,9 +316,9 @@ private void setStateInternal(final Tunnel tunnel, @Nullable final Config config
313316

314317
builder.setMtu(config.getInterface().getMtu().orElse(1280));
315318

316-
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q)
319+
if (VERSION.SDK_INT >= VERSION_CODES.Q)
317320
builder.setMetered(false);
318-
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
321+
if (VERSION.SDK_INT >= VERSION_CODES.M)
319322
service.setUnderlyingNetworks(null);
320323

321324
builder.setBlocking(true);
@@ -338,7 +341,7 @@ private void setStateInternal(final Tunnel tunnel, @Nullable final Config config
338341
Log.w(TAG, "Tunnel already down");
339342
return;
340343
}
341-
int handleToClose = currentTunnelHandle;
344+
final int handleToClose = currentTunnelHandle;
342345
currentTunnel = null;
343346
currentTunnelHandle = -1;
344347
currentConfig = null;

Diff for: tunnel/src/main/java/com/wireguard/android/backend/WgQuickBackend.java

+7-4
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,10 @@
2929
import java.util.List;
3030
import java.util.Locale;
3131
import java.util.Map;
32+
import java.util.Map.Entry;
3233
import java.util.Objects;
3334
import java.util.Set;
35+
import java.util.regex.Pattern;
3436

3537
import androidx.annotation.Nullable;
3638

@@ -41,6 +43,7 @@
4143

4244
@NonNullForAll
4345
public final class WgQuickBackend implements Backend {
46+
private static final Pattern COMPILE = Pattern.compile("\\t");
4447
private static final String TAG = "WireGuard/WgQuickBackend";
4548
private final File localTemporaryDir;
4649
private final RootShell rootShell;
@@ -90,7 +93,7 @@ public Statistics getStatistics(final Tunnel tunnel) {
9093
return stats;
9194
}
9295
for (final String line : output) {
93-
final String[] parts = line.split("\\t");
96+
final String[] parts = COMPILE.split(line);
9497
if (parts.length != 8)
9598
continue;
9699
try {
@@ -127,9 +130,9 @@ public State setState(final Tunnel tunnel, State state, @Nullable final Config c
127130
if (state == State.UP) {
128131
toolsInstaller.ensureToolsAvailable();
129132
if (!multipleTunnels && originalState == State.DOWN) {
130-
final List<Pair<Tunnel, Config>> rewind = new LinkedList<>();
133+
final Collection<Pair<Tunnel, Config>> rewind = new LinkedList<>();
131134
try {
132-
for (final Map.Entry<Tunnel, Config> entry : runningConfigsSnapshot.entrySet()) {
135+
for (final Entry<Tunnel, Config> entry : runningConfigsSnapshot.entrySet()) {
133136
setStateInternal(entry.getKey(), entry.getValue(), State.DOWN);
134137
rewind.add(Pair.create(entry.getKey(), entry.getValue()));
135138
}
@@ -153,7 +156,7 @@ public State setState(final Tunnel tunnel, State state, @Nullable final Config c
153156
setStateInternal(tunnel, originalConfig, State.UP);
154157
}
155158
if (!multipleTunnels && originalState == State.DOWN) {
156-
for (final Map.Entry<Tunnel, Config> entry : runningConfigsSnapshot.entrySet()) {
159+
for (final Entry<Tunnel, Config> entry : runningConfigsSnapshot.entrySet()) {
157160
setStateInternal(entry.getKey(), entry.getValue(), State.UP);
158161
}
159162
}

Diff for: tunnel/src/main/java/com/wireguard/android/util/RootShell.java

+11-9
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
import java.io.OutputStreamWriter;
1919
import java.nio.charset.StandardCharsets;
2020
import java.util.Collection;
21+
import java.util.Locale;
22+
import java.util.Objects;
2123
import java.util.UUID;
2224

2325
import androidx.annotation.Nullable;
@@ -46,16 +48,16 @@ public RootShell(final Context context) {
4648
final String packageName = context.getPackageName();
4749
if (packageName.contains("'"))
4850
throw new RuntimeException("Impossibly invalid package name contains a single quote");
49-
preamble = String.format("export CALLING_PACKAGE='%s' PATH=\"%s:$PATH\" TMPDIR='%s'; magisk --sqlite \"UPDATE policies SET notification=0, logging=0 WHERE uid=%d\" >/dev/null 2>&1; id -u\n",
51+
preamble = String.format(Locale.getDefault(), "export CALLING_PACKAGE='%s' PATH=\"%s:$PATH\" TMPDIR='%s'; magisk --sqlite \"UPDATE policies SET notification=0, logging=0 WHERE uid=%d\" >/dev/null 2>&1; id -u\n",
5052
packageName, localBinaryDir, localTemporaryDir, android.os.Process.myUid());
5153
}
5254

53-
private static boolean isExecutableInPath(final String name) {
55+
private static boolean isExecutableInPath() {
5456
final String path = System.getenv("PATH");
5557
if (path == null)
5658
return false;
5759
for (final String dir : path.split(":"))
58-
if (new File(dir, name).canExecute())
60+
if (new File(dir, RootShell.SU).canExecute())
5961
return true;
6062
return false;
6163
}
@@ -91,17 +93,17 @@ public int run(@Nullable final Collection<String> output, final String command)
9193
final String script = "echo " + marker + "; echo " + marker + " >&2; (" + command +
9294
"); ret=$?; echo " + marker + " $ret; echo " + marker + " $ret >&2\n";
9395
Log.v(TAG, "executing: " + command);
94-
stdin.write(script);
96+
Objects.requireNonNull(stdin).write(script);
9597
stdin.flush();
9698
String line;
9799
int errnoStdout = Integer.MIN_VALUE;
98100
int errnoStderr = Integer.MAX_VALUE;
99101
int markersSeen = 0;
100-
while ((line = stdout.readLine()) != null) {
102+
while ((line = Objects.requireNonNull(stdout).readLine()) != null) {
101103
if (line.startsWith(marker)) {
102104
++markersSeen;
103105
if (line.length() > marker.length() + 1) {
104-
errnoStdout = Integer.valueOf(line.substring(marker.length() + 1));
106+
errnoStdout = Integer.parseInt(line.substring(marker.length() + 1));
105107
break;
106108
}
107109
} else if (markersSeen > 0) {
@@ -110,11 +112,11 @@ public int run(@Nullable final Collection<String> output, final String command)
110112
Log.v(TAG, "stdout: " + line);
111113
}
112114
}
113-
while ((line = stderr.readLine()) != null) {
115+
while ((line = Objects.requireNonNull(stderr).readLine()) != null) {
114116
if (line.startsWith(marker)) {
115117
++markersSeen;
116118
if (line.length() > marker.length() + 1) {
117-
errnoStderr = Integer.valueOf(line.substring(marker.length() + 1));
119+
errnoStderr = Integer.parseInt(line.substring(marker.length() + 1));
118120
break;
119121
}
120122
} else if (markersSeen > 2) {
@@ -131,7 +133,7 @@ public int run(@Nullable final Collection<String> output, final String command)
131133
}
132134

133135
public void start() throws IOException, RootShellException {
134-
if (!isExecutableInPath(SU))
136+
if (!isExecutableInPath())
135137
throw new RootShellException(Reason.NO_ROOT_ACCESS);
136138
synchronized (lock) {
137139
if (isRunning())

Diff for: tunnel/src/main/java/com/wireguard/android/util/ToolsInstaller.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ public boolean extract() throws IOException {
117117
for (int i = 0; i < files.length; ++i) {
118118
files[i] = new File(localBinaryDir, EXECUTABLES[i]);
119119
tempFiles[i] = new File(localBinaryDir, EXECUTABLES[i] + ".tmp");
120-
allExist &= files[i].exists();
120+
allExist = allExist && files[i].exists();
121121
}
122122
if (allExist)
123123
return false;
@@ -148,7 +148,7 @@ private int installMagisk() throws RootShellException, IOException {
148148
script.append("printf 'id=wireguard\nname=WireGuard Command Line Tools\nversion=1.0\nversionCode=1\nauthor=zx2c4\ndescription=Command line tools for WireGuard\nminMagisk=1500\n' > /data/adb/modules/wireguard/module.prop; ");
149149
script.append("touch /data/adb/modules/wireguard/auto_mount; ");
150150
for (final String name : EXECUTABLES) {
151-
final File destination = new File("/data/adb/modules/wireguard" + INSTALL_DIR, name);
151+
final File destination = new File("/data/adb/modules/wireguard%s".formatted(INSTALL_DIR), name);
152152
script.append(String.format("cp '%s' '%s'; chmod 755 '%s'; chcon 'u:object_r:system_file:s0' '%s' || true; ",
153153
new File(localBinaryDir, name), destination, destination, destination));
154154
}

Diff for: tunnel/src/main/java/com/wireguard/config/Config.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -114,9 +114,8 @@ public static Config parse(final BufferedReader reader)
114114

115115
@Override
116116
public boolean equals(final Object obj) {
117-
if (!(obj instanceof Config))
117+
if (!(obj instanceof final Config other))
118118
return false;
119-
final Config other = (Config) obj;
120119
return interfaze.equals(other.interfaze) && peers.equals(other.peers);
121120
}
122121

Diff for: tunnel/src/main/java/com/wireguard/config/InetAddresses.java

+5-2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@
55

66
package com.wireguard.config;
77

8+
import android.os.Build.VERSION;
9+
import android.os.Build.VERSION_CODES;
10+
811
import com.wireguard.util.NonNullForAll;
912

1013
import java.lang.reflect.Method;
@@ -28,7 +31,7 @@ public final class InetAddresses {
2831
static {
2932
Method m = null;
3033
try {
31-
if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.Q)
34+
if (VERSION.SDK_INT < VERSION_CODES.Q)
3235
// noinspection JavaReflectionMemberAccess
3336
m = InetAddress.class.getMethod("parseNumericAddress", String.class);
3437
} catch (final Exception ignored) {
@@ -59,7 +62,7 @@ public static InetAddress parse(final String address) throws ParseException {
5962
if (address.isEmpty())
6063
throw new ParseException(InetAddress.class, address, "Empty address");
6164
try {
62-
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q)
65+
if (VERSION.SDK_INT >= VERSION_CODES.Q)
6366
return android.net.InetAddresses.parseNumericAddress(address);
6467
else if (PARSER_METHOD != null)
6568
return (InetAddress) PARSER_METHOD.invoke(null, address);

Diff for: tunnel/src/main/java/com/wireguard/config/InetEndpoint.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,8 @@ public static InetEndpoint parse(final String endpoint) throws ParseException {
6666

6767
@Override
6868
public boolean equals(final Object obj) {
69-
if (!(obj instanceof InetEndpoint))
69+
if (!(obj instanceof final InetEndpoint other))
7070
return false;
71-
final InetEndpoint other = (InetEndpoint) obj;
7271
return host.equals(other.host) && port == other.port;
7372
}
7473

Diff for: tunnel/src/main/java/com/wireguard/config/InetNetwork.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,8 @@ public static InetNetwork parse(final String network) throws ParseException {
5353

5454
@Override
5555
public boolean equals(final Object obj) {
56-
if (!(obj instanceof InetNetwork))
56+
if (!(obj instanceof final InetNetwork other))
5757
return false;
58-
final InetNetwork other = (InetNetwork) obj;
5958
return address.equals(other.address) && mask == other.mask;
6059
}
6160

Diff for: tunnel/src/main/java/com/wireguard/config/Interface.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -105,9 +105,8 @@ public static Interface parse(final Iterable<? extends CharSequence> lines)
105105

106106
@Override
107107
public boolean equals(final Object obj) {
108-
if (!(obj instanceof Interface))
108+
if (!(obj instanceof final Interface other))
109109
return false;
110-
final Interface other = (Interface) obj;
111110
return addresses.equals(other.addresses)
112111
&& dnsServers.equals(other.dnsServers)
113112
&& dnsSearchDomains.equals(other.dnsSearchDomains)

Diff for: tunnel/src/main/java/com/wireguard/config/Peer.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -85,9 +85,8 @@ public static Peer parse(final Iterable<? extends CharSequence> lines)
8585

8686
@Override
8787
public boolean equals(final Object obj) {
88-
if (!(obj instanceof Peer))
88+
if (!(obj instanceof final Peer other))
8989
return false;
90-
final Peer other = (Peer) obj;
9190
return allowedIps.equals(other.allowedIps)
9291
&& endpoint.equals(other.endpoint)
9392
&& persistentKeepalive.equals(other.persistentKeepalive)

Diff for: tunnel/src/main/java/com/wireguard/crypto/Key.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,7 @@ public byte[] getBytes() {
228228
public int hashCode() {
229229
int ret = 0;
230230
for (int i = 0; i < key.length / 4; ++i)
231-
ret ^= (key[i * 4 + 0] >> 0) + (key[i * 4 + 1] >> 8) + (key[i * 4 + 2] >> 16) + (key[i * 4 + 3] >> 24);
231+
ret ^= (key[i * 4] >> 0) + (key[i * 4 + 1] >> 8) + (key[i * 4 + 2] >> 16) + (key[i * 4 + 3] >> 24);
232232
return ret;
233233
}
234234

Diff for: tunnel/tools/libwg-go/jni.c

+2
Original file line numberDiff line numberDiff line change
@@ -69,3 +69,5 @@ JNIEXPORT jstring JNICALL Java_com_wireguard_android_backend_GoBackend_wgVersion
6969
free(version);
7070
return ret;
7171
}
72+
73+

Diff for: ui/build.gradle.kts

+1
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ android {
6161
disable += "LongLogTag"
6262
warning += "MissingTranslation"
6363
warning += "ImpliedQuantity"
64+
baseline = file("lint-baseline.xml")
6465
}
6566
}
6667

0 commit comments

Comments
 (0)