From af30aa00f342473c28a4b2bd31c88b0b88a89629 Mon Sep 17 00:00:00 2001 From: Thomas Guillem <thomas@gllm.fr> Date: Fri, 15 Dec 2023 16:22:39 +0100 Subject: [PATCH] jni: fix leak after SetObjectArrayElement() SetObjectArrayElement() is creating its own ref, we need to release our local one after this call. --- libvlc/jni/libvlcjni-media.c | 2 ++ libvlc/jni/libvlcjni-mediadiscoverer.c | 1 + libvlc/jni/libvlcjni-mediaplayer.c | 6 ++++++ libvlc/jni/libvlcjni-rendererdiscoverer.c | 1 + 4 files changed, 10 insertions(+) diff --git a/libvlc/jni/libvlcjni-media.c b/libvlc/jni/libvlcjni-media.c index e9c1d1b..0161db8 100644 --- a/libvlc/jni/libvlcjni-media.c +++ b/libvlc/jni/libvlcjni-media.c @@ -535,6 +535,7 @@ tracklist_to_jobjectArray(JNIEnv *env, libvlc_media_tracklist_t *tracklist) jobject jtrack = media_track_to_jobject(env, track); (*env)->SetObjectArrayElement(env, array, i, jtrack); + (*env)->DeleteLocalRef(env, jtrack); } return array; @@ -712,6 +713,7 @@ Java_org_videolan_libvlc_Media_nativeGetSlaves(JNIEnv *env, jobject thiz) p_slave->i_type, p_slave->i_priority, juri); (*env)->SetObjectArrayElement(env, array, i, jslave); + (*env)->DeleteLocalRef(env, jslave); (*env)->DeleteLocalRef(env, juri); } diff --git a/libvlc/jni/libvlcjni-mediadiscoverer.c b/libvlc/jni/libvlcjni-mediadiscoverer.c index f42c3c9..899df59 100644 --- a/libvlc/jni/libvlcjni-mediadiscoverer.c +++ b/libvlc/jni/libvlcjni-mediadiscoverer.c @@ -139,6 +139,7 @@ Java_org_videolan_libvlc_MediaDiscoverer_nativeList(JNIEnv *env, jobject thiz, jobject jservice = service_to_object(env, pp_services[i]); (*env)->SetObjectArrayElement(env, array, i, jservice); + (*env)->DeleteLocalRef(env, jservice); } error: diff --git a/libvlc/jni/libvlcjni-mediaplayer.c b/libvlc/jni/libvlcjni-mediaplayer.c index 51a2bfc..4e1538e 100644 --- a/libvlc/jni/libvlcjni-mediaplayer.c +++ b/libvlc/jni/libvlcjni-mediaplayer.c @@ -658,7 +658,10 @@ Java_org_videolan_libvlc_MediaPlayer_nativeGetTitles(JNIEnv *env, jobject thiz) jobject jtitle = mediaplayer_title_to_object(env, pp_titles[i]); if (jtitle) + { (*env)->SetObjectArrayElement(env, array, i, jtitle); + (*env)->DeleteLocalRef(env, jtitle); + } } error: @@ -719,7 +722,10 @@ Java_org_videolan_libvlc_MediaPlayer_nativeGetChapters(JNIEnv *env, jobject jchapter = mediaplayer_chapter_to_object(env, pp_chapters[i]); if (jchapter) + { (*env)->SetObjectArrayElement(env, array, i, jchapter); + (*env)->DeleteLocalRef(env, jchapter); + } } error: diff --git a/libvlc/jni/libvlcjni-rendererdiscoverer.c b/libvlc/jni/libvlcjni-rendererdiscoverer.c index aa3e6cc..8505707 100644 --- a/libvlc/jni/libvlcjni-rendererdiscoverer.c +++ b/libvlc/jni/libvlcjni-rendererdiscoverer.c @@ -188,6 +188,7 @@ Java_org_videolan_libvlc_RendererDiscoverer_nativeList(JNIEnv *env, jobject thiz jobject jservice = service_to_object(env, pp_services[i]); (*env)->SetObjectArrayElement(env, array, i, jservice); + (*env)->DeleteLocalRef(env, jservice); } error: -- GitLab