emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

master 59a3edc3559: Avert a crash and file descriptor leak in yank-media


From: Po Lu
Subject: master 59a3edc3559: Avert a crash and file descriptor leak in yank-media
Date: Sun, 29 Oct 2023 01:00:00 -0400 (EDT)

branch: master
commit 59a3edc3559057e6f0346e3f1b3b13e8ef3e1683
Author: Po Lu <luangruo@yahoo.com>
Commit: Po Lu <luangruo@yahoo.com>

    Avert a crash and file descriptor leak in yank-media
    
    * java/org/gnu/emacs/EmacsNative.java (close): New declaration.
    
    * java/org/gnu/emacs/EmacsSdk11Clipboard.java
    (getClipboardData): Catch SecurityException and guarantee file
    descriptors are closed even if exceptions arise.
    
    * src/android.c (dup): Export another function.
---
 java/org/gnu/emacs/EmacsNative.java         |  3 +++
 java/org/gnu/emacs/EmacsSdk11Clipboard.java | 24 ++++++++++++++++++++++++
 src/android.c                               |  8 ++++++++
 3 files changed, 35 insertions(+)

diff --git a/java/org/gnu/emacs/EmacsNative.java 
b/java/org/gnu/emacs/EmacsNative.java
index 7d7e1e5d831..f15927bb3a7 100644
--- a/java/org/gnu/emacs/EmacsNative.java
+++ b/java/org/gnu/emacs/EmacsNative.java
@@ -39,6 +39,9 @@ public final class EmacsNative
   /* Like `dup' in C.  */
   public static native int dup (int fd);
 
+  /* Like `close' in C.  */
+  public static native int close (int fd);
+
   /* Obtain the fingerprint of this build of Emacs.  The fingerprint
      can be used to determine the dump file name.  */
   public static native String getFingerprint ();
diff --git a/java/org/gnu/emacs/EmacsSdk11Clipboard.java 
b/java/org/gnu/emacs/EmacsSdk11Clipboard.java
index b8a43496b6d..b068a89831e 100644
--- a/java/org/gnu/emacs/EmacsSdk11Clipboard.java
+++ b/java/org/gnu/emacs/EmacsSdk11Clipboard.java
@@ -245,6 +245,8 @@ public final class EmacsSdk11Clipboard extends 
EmacsClipboard
     if (data == null || data.getItemCount () < 1)
       return null;
 
+    fd = -1;
+
     try
       {
        uri = data.getItemAt (0).getUri ();
@@ -267,12 +269,34 @@ public final class EmacsSdk11Clipboard extends 
EmacsClipboard
        /* Close the original offset.  */
        assetFd.close ();
       }
+    catch (SecurityException e)
+      {
+       /* Guarantee a file descriptor duplicated or detached is
+          ultimately closed if an error arises.  */
+
+       if (fd != -1)
+         EmacsNative.close (fd);
+
+       return null;
+      }
     catch (FileNotFoundException e)
       {
+       /* Guarantee a file descriptor duplicated or detached is
+          ultimately closed if an error arises.  */
+
+       if (fd != -1)
+         EmacsNative.close (fd);
+
        return null;
       }
     catch (IOException e)
       {
+       /* Guarantee a file descriptor duplicated or detached is
+          ultimately closed if an error arises.  */
+
+       if (fd != -1)
+         EmacsNative.close (fd);
+
        return null;
       }
 
diff --git a/src/android.c b/src/android.c
index 3344a773d5f..79f16568fd4 100644
--- a/src/android.c
+++ b/src/android.c
@@ -1260,6 +1260,14 @@ NATIVE_NAME (dup) (JNIEnv *env, jobject object, jint fd)
   return dup (fd);
 }
 
+JNIEXPORT jint JNICALL
+NATIVE_NAME (close) (JNIEnv *env, jobject object, jint fd)
+{
+  JNI_STACK_ALIGNMENT_PROLOGUE;
+
+  return close (fd);
+}
+
 JNIEXPORT jstring JNICALL
 NATIVE_NAME (getFingerprint) (JNIEnv *env, jobject object)
 {



reply via email to

[Prev in Thread] Current Thread [Next in Thread]