From 883b5abc7b2a770146683e7e27bf275bd4064511 Mon Sep 17 00:00:00 2001
From: pacien
Date: Mon, 20 Jan 2020 17:07:12 +0100
Subject: pass network device fd via unix socket instead of inheritance
Workaround for new shared memory restrictions added in Android 10
preventing file descriptor leakage to sub-processes.
This change set BREAKS ENCRYPTED PRIVATE KEYS SUPPORT.
GitHub: https://github.com/pacien/tincapp/issues/92
---
app/src/main/c/exec.c | 60 ---------------------------------------------------
app/src/main/c/main.c | 1 +
2 files changed, 1 insertion(+), 60 deletions(-)
delete mode 100644 app/src/main/c/exec.c
create mode 100644 app/src/main/c/main.c
(limited to 'app/src/main/c')
diff --git a/app/src/main/c/exec.c b/app/src/main/c/exec.c
deleted file mode 100644
index c335b20..0000000
--- a/app/src/main/c/exec.c
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Tinc App, an Android binding and user interface for the tinc mesh VPN daemon
- * Copyright (C) 2017-2018 Pacien TRAN-GIRARD
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-#include
-#include
-#include
-#include
-
-static inline const char **to_string_array(JNIEnv *env, jobjectArray ja) {
- const int len = (*env)->GetArrayLength(env, ja);
- const char **ca = calloc((size_t) len + 1, sizeof(char *));
-
- for (int i = 0; i < len; ++i) {
- jstring jstr = (jstring) (*env)->GetObjectArrayElement(env, ja, i);
- ca[i] = (*env)->GetStringUTFChars(env, jstr, NULL);
- }
-
- ca[len] = NULL;
- return ca;
-}
-
-static inline void exec(const char **argcv) {
- execv(argcv[0], (char *const *) argcv);
- exit(1);
-}
-
-JNIEXPORT jint JNICALL
-Java_org_pacien_tincapp_commands_Executor_forkExec(JNIEnv *env, __attribute__((unused)) jclass class, jobjectArray args) {
- pid_t pid = fork();
- switch (pid) {
- case 0:
- exec(to_string_array(env, args));
- return 0;
-
- default:
- return pid;
- }
-}
-
-JNIEXPORT jint JNICALL
-Java_org_pacien_tincapp_commands_Executor_wait(__attribute__((unused))JNIEnv *env, __attribute__((unused)) jclass class, jint pid) {
- int status;
- waitpid(pid, &status, 0);
- return WIFEXITED(status) ? WEXITSTATUS(status) : -1;
-}
diff --git a/app/src/main/c/main.c b/app/src/main/c/main.c
new file mode 100644
index 0000000..68007d8
--- /dev/null
+++ b/app/src/main/c/main.c
@@ -0,0 +1 @@
+// This file intentionally left blank.
--
cgit v1.2.3