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