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];