Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 938e9b23 authored by Guillaume Jacquart's avatar Guillaume Jacquart
Browse files

Merge branch 'fix_socket_busy_on_restart' into 'main'

Fix localsocket busy on restart

See merge request e/privacy-central/privacymoduletrackerfilter!7
parents 4fe47152 e15489ba
Loading
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
image: "registry.gitlab.e.foundation:5000/e/apps/docker-android-apps-cicd:latest"
image: "registry.gitlab.e.foundation/e/os/docker-android-apps-cicd:latest"

stages:
- build
+1 −1
Original line number Diff line number Diff line
@@ -10,7 +10,7 @@ android {
        targetSdkVersion 30

        versionCode 1
        versionName "0.5.0"
        versionName "0.5.1"
    }

    buildTypes {
+25 −8
Original line number Diff line number Diff line
@@ -25,6 +25,9 @@ import android.content.Context;
import android.content.pm.PackageManager;
import android.net.LocalServerSocket;
import android.net.LocalSocket;
import android.system.ErrnoException;
import android.system.Os;
import android.system.OsConstants;
import android.util.Log;

import java.io.BufferedReader;
@@ -60,15 +63,35 @@ public class DNSBlockerRunnable implements Runnable {

	public synchronized void stop() {
		stopped = true;
		closeSocket();
	}

	private void closeSocket() {
		// Known bug and workaround that LocalServerSocket::close is not working well
		// https://issuetracker.google.com/issues/36945762
		if (resolverReceiver != null) {
			try {
				Os.shutdown(resolverReceiver.getFileDescriptor(), OsConstants.SHUT_RDWR);
				resolverReceiver.close();
				resolverReceiver = null;
			} catch (ErrnoException e) {
				if (e.errno != OsConstants.EBADF) {
					Log.w(TAG, "Socket already closed");
				} else {
					Log.e(TAG, "Exception: cannot close DNS port on stop" + SOCKET_NAME + "!", e);
				}
			} catch (Exception e) {
				Log.e(TAG, "Exception: cannot close DNS port on stop" + SOCKET_NAME + "!", e);
			}
		}
	}

	@Override
	public void run() {
		try {
			resolverReceiver = new LocalServerSocket(SOCKET_NAME);
		} catch (IOException eio) {
			Log.e(TAG, "Exception:Cannot open DNS port " + SOCKET_NAME + "!" + eio.getMessage());
			Log.e(TAG, "Exception:Cannot open DNS port " + SOCKET_NAME + "!", eio);
			return;
		}
		Log.d(TAG, "DNSFilterProxy running on port " + SOCKET_NAME + "!");
@@ -107,15 +130,9 @@ public class DNSBlockerRunnable implements Runnable {
				socket.close();
				// Printing bufferedreader data
			} catch (IOException e) {
				Log.w(TAG, "exception " + e.getMessage());
				Log.w(TAG, "Exception while listening DNS resolver", e);
			}
		}

		try {
			resolverReceiver.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	private void initEBrowserDoTFix(Context context) {