aboutsummaryrefslogtreecommitdiffstats
path: root/src/android.c
diff options
context:
space:
mode:
authorPo Lu2023-10-04 16:33:05 +0800
committerPo Lu2023-10-04 16:33:05 +0800
commitbb417daa703b0dd8871470ce53a40b16b1ca300b (patch)
treee826d39aef4b622acfdc9c77a4b581dbab447fab /src/android.c
parentfbfdd1e0e3e67f765c6dbf9f61b5f913e55e004e (diff)
downloademacs-bb417daa703b0dd8871470ce53a40b16b1ca300b.tar.gz
emacs-bb417daa703b0dd8871470ce53a40b16b1ca300b.zip
Correct local reference leaks
* src/android.c (android_build_string): Accept a list of local references to destroy upon an allocation failure, facilitating the proper deallocation of local references in such situations. (android_browse_url): Revise for new calling convention. * src/android.h (android_build_string): Update declaration correspondingly. * src/androidmenu.c (android_menu_show, android_dialog_show): Revise for new calling convention. * src/androidselect.c (android_notifications_notify_1): Supply each successive local reference to android_build_string as notification text is being encoded. * src/androidvfs.c (android_saf_exception_check): Introduce absent va_end.
Diffstat (limited to 'src/android.c')
-rw-r--r--src/android.c45
1 files changed, 39 insertions, 6 deletions
diff --git a/src/android.c b/src/android.c
index aa4033c676f..1424270e785 100644
--- a/src/android.c
+++ b/src/android.c
@@ -5593,15 +5593,20 @@ android_verify_jni_string (const char *name)
5593} 5593}
5594 5594
5595/* Given a Lisp string TEXT, return a local reference to an equivalent 5595/* Given a Lisp string TEXT, return a local reference to an equivalent
5596 Java string. */ 5596 Java string. Each argument following TEXT should be NULL or a
5597 local reference that will be freed if creating the string fails,
5598 whereupon memory_full will also be signaled. */
5597 5599
5598jstring 5600jstring
5599android_build_string (Lisp_Object text) 5601android_build_string (Lisp_Object text, ...)
5600{ 5602{
5601 Lisp_Object encoded; 5603 Lisp_Object encoded;
5602 jstring string; 5604 jstring string;
5603 size_t nchars; 5605 size_t nchars;
5604 jchar *characters; 5606 jchar *characters;
5607 va_list ap;
5608 jobject object;
5609
5605 USE_SAFE_ALLOCA; 5610 USE_SAFE_ALLOCA;
5606 5611
5607 /* Directly encode TEXT if it contains no non-ASCII characters, or 5612 /* Directly encode TEXT if it contains no non-ASCII characters, or
@@ -5619,9 +5624,11 @@ android_build_string (Lisp_Object text)
5619 { 5624 {
5620 string = (*android_java_env)->NewStringUTF (android_java_env, 5625 string = (*android_java_env)->NewStringUTF (android_java_env,
5621 SSDATA (text)); 5626 SSDATA (text));
5622 android_exception_check ();
5623 SAFE_FREE ();
5624 5627
5628 if ((*android_java_env)->ExceptionCheck (android_java_env))
5629 goto error;
5630
5631 SAFE_FREE ();
5625 return string; 5632 return string;
5626 } 5633 }
5627 5634
@@ -5640,10 +5647,36 @@ android_build_string (Lisp_Object text)
5640 string 5647 string
5641 = (*android_java_env)->NewString (android_java_env, 5648 = (*android_java_env)->NewString (android_java_env,
5642 characters, nchars); 5649 characters, nchars);
5643 android_exception_check (); 5650
5651 if ((*android_java_env)->ExceptionCheck (android_java_env))
5652 goto error;
5644 5653
5645 SAFE_FREE (); 5654 SAFE_FREE ();
5646 return string; 5655 return string;
5656
5657 error:
5658 /* An exception arose while creating the string. When this
5659 transpires, an assumption is made that the error was induced by
5660 running out of memory. Delete each of the local references
5661 within AP. */
5662
5663 va_start (ap, text);
5664
5665 __android_log_print (ANDROID_LOG_WARN, __func__,
5666 "Possible out of memory error. "
5667 " The Java exception follows: ");
5668 /* Describe exactly what went wrong. */
5669 (*android_java_env)->ExceptionDescribe (android_java_env);
5670 (*android_java_env)->ExceptionClear (android_java_env);
5671
5672 /* Now remove each and every local reference provided after
5673 OBJECT. */
5674
5675 while ((object = va_arg (ap, jobject)))
5676 ANDROID_DELETE_LOCAL_REF (object);
5677
5678 va_end (ap);
5679 memory_full (0);
5647} 5680}
5648 5681
5649/* Do the same, except TEXT is constant string data in ASCII or 5682/* Do the same, except TEXT is constant string data in ASCII or
@@ -6154,7 +6187,7 @@ android_browse_url (Lisp_Object url, Lisp_Object send)
6154 Lisp_Object tem; 6187 Lisp_Object tem;
6155 const char *buffer; 6188 const char *buffer;
6156 6189
6157 string = android_build_string (url); 6190 string = android_build_string (url, NULL);
6158 value 6191 value
6159 = (*android_java_env)->CallNonvirtualObjectMethod (android_java_env, 6192 = (*android_java_env)->CallNonvirtualObjectMethod (android_java_env,
6160 emacs_service, 6193 emacs_service,