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:
parent
3624e9bd40
commit
59a3edc355
3 changed files with 35 additions and 0 deletions
|
@ -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 ();
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
Loading…
Add table
Reference in a new issue