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