AI 144124: Avoid leaking a pty file descriptor when quitting the terminal.
BUG=1750582
Automated import of CL 144124
diff --git a/apps/Term/jni/termExec.cpp b/apps/Term/jni/termExec.cpp
index 968bb90..d0666cc 100644
--- a/apps/Term/jni/termExec.cpp
+++ b/apps/Term/jni/termExec.cpp
@@ -215,6 +215,21 @@
return result;
}
+static void android_os_Exec_close(JNIEnv *env, jobject clazz, jobject fileDescriptor)
+{
+ int fd;
+ struct winsize sz;
+
+ fd = env->GetIntField(fileDescriptor, field_fileDescriptor_descriptor);
+
+ if (env->ExceptionOccurred() != NULL) {
+ return;
+ }
+
+ close(fd);
+}
+
+
static int register_FileDescriptor(JNIEnv *env)
{
class_fileDescriptor = env->FindClass("java/io/FileDescriptor");
@@ -248,7 +263,9 @@
{ "setPtyWindowSize", "(Ljava/io/FileDescriptor;IIII)V",
(void*) android_os_Exec_setPtyWindowSize},
{ "waitFor", "(I)I",
- (void*) android_os_Exec_waitFor}
+ (void*) android_os_Exec_waitFor},
+ { "close", "(Ljava/io/FileDescriptor;)V",
+ (void*) android_os_Exec_close}
};
/*
diff --git a/apps/Term/src/com/android/term/Exec.java b/apps/Term/src/com/android/term/Exec.java
index f84e7c1..6a9ccac 100644
--- a/apps/Term/src/com/android/term/Exec.java
+++ b/apps/Term/src/com/android/term/Exec.java
@@ -63,5 +63,10 @@
*
*/
public static native int waitFor(int processId);
+
+ /**
+ * Close a given file descriptor.
+ */
+ public static native void close(FileDescriptor fd);
}
diff --git a/apps/Term/src/com/android/term/Term.java b/apps/Term/src/com/android/term/Term.java
index ae83a89..82aa0d3 100644
--- a/apps/Term/src/com/android/term/Term.java
+++ b/apps/Term/src/com/android/term/Term.java
@@ -184,6 +184,15 @@
updatePrefs();
}
+ @Override
+ public void onDestroy() {
+ super.onDestroy();
+ if (mTermFd != null) {
+ Exec.close(mTermFd);
+ mTermFd = null;
+ }
+ }
+
private void startListening() {
int[] processId = new int[1];