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.
This commit is contained in:
Po Lu 2023-10-29 12:59:45 +08:00
parent 3624e9bd40
commit 59a3edc355
3 changed files with 35 additions and 0 deletions

View file

@ -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 ();

View file

@ -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;
}

View file

@ -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)
{