From abb97e16c457dd3a47275421215e0d5818d42cef Mon Sep 17 00:00:00 2001 From: Max Lv Date: Fri, 24 Jul 2015 23:07:58 +0800 Subject: [PATCH] play tricks to close fd manually --- src/main/java/com/github/shadowsocks/System.java | 1 + src/main/jni/system.cpp | 6 ++++++ .../scala/com/github/shadowsocks/ShadowsocksVpnThread.scala | 3 +++ 3 files changed, 10 insertions(+) diff --git a/src/main/java/com/github/shadowsocks/System.java b/src/main/java/com/github/shadowsocks/System.java index 0dd47f59..47b10ed6 100755 --- a/src/main/java/com/github/shadowsocks/System.java +++ b/src/main/java/com/github/shadowsocks/System.java @@ -46,4 +46,5 @@ public class System { public static native void exec(String cmd); public static native String getABI(); public static native int sendfd(int fd); + public static native void jniclose(int fd); } diff --git a/src/main/jni/system.cpp b/src/main/jni/system.cpp index 8a44882d..39cfc1e4 100644 --- a/src/main/jni/system.cpp +++ b/src/main/jni/system.cpp @@ -43,6 +43,10 @@ void Java_com_github_shadowsocks_system_exec(JNIEnv *env, jobject thiz, jstring env->ReleaseStringUTFChars(cmd, str); } +void Java_com_github_shadowsocks_system_jniclose(JNIEnv *env, jobject thiz, jint fd) { + close(fd); +} + jint Java_com_github_shadowsocks_system_sendfd(JNIEnv *env, jobject thiz, jint tun_fd) { int fd; struct sockaddr_un addr; @@ -75,6 +79,8 @@ jint Java_com_github_shadowsocks_system_sendfd(JNIEnv *env, jobject thiz, jint t static const char *classPathName = "com/github/shadowsocks/System"; static JNINativeMethod method_table[] = { + { "jniclose", "(I)V", + (void*) Java_com_github_shadowsocks_system_jniclose }, { "sendfd", "(I)I", (void*) Java_com_github_shadowsocks_system_sendfd }, { "exec", "(Ljava/lang/String;)V", diff --git a/src/main/scala/com/github/shadowsocks/ShadowsocksVpnThread.scala b/src/main/scala/com/github/shadowsocks/ShadowsocksVpnThread.scala index 3cc79861..7eadaad5 100644 --- a/src/main/scala/com/github/shadowsocks/ShadowsocksVpnThread.scala +++ b/src/main/scala/com/github/shadowsocks/ShadowsocksVpnThread.scala @@ -105,6 +105,9 @@ class ShadowsocksVpnThread(vpnService: ShadowsocksVpnService) extends Thread { val fd = getInt.invoke(fds(0)).asInstanceOf[Int] ret = vpnService.protect(fd) + // Trick to close file decriptor + System.jniclose(fd) + if (ret) { output.write(0) } else {