From 224bb46fb857dab589597bdab302ba8ba012008c Mon Sep 17 00:00:00 2001 From: Matthieu Bouron Date: Sun, 21 May 2017 16:48:30 +0200 Subject: [PATCH] lavc/mediacodec_wrapper: fix local reference leaks --- libavcodec/mediacodec_wrapper.c | 37 +++++++++++++++++++++++---------- 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/libavcodec/mediacodec_wrapper.c b/libavcodec/mediacodec_wrapper.c index 43fbb511fd..5e1beed43a 100644 --- a/libavcodec/mediacodec_wrapper.c +++ b/libavcodec/mediacodec_wrapper.c @@ -608,6 +608,7 @@ FFAMediaFormat *ff_AMediaFormat_new(void) { JNIEnv *env = NULL; FFAMediaFormat *format = NULL; + jobject object = NULL; format = av_mallocz(sizeof(FFAMediaFormat)); if (!format) { @@ -625,23 +626,27 @@ FFAMediaFormat *ff_AMediaFormat_new(void) goto fail; } - format->object = (*env)->NewObject(env, format->jfields.mediaformat_class, format->jfields.init_id); - if (!format->object) { + object = (*env)->NewObject(env, format->jfields.mediaformat_class, format->jfields.init_id); + if (!object) { goto fail; } - format->object = (*env)->NewGlobalRef(env, format->object); + format->object = (*env)->NewGlobalRef(env, object); if (!format->object) { goto fail; } - return format; fail: - ff_jni_reset_jfields(env, &format->jfields, jni_amediaformat_mapping, 1, format); + if (object) { + (*env)->DeleteLocalRef(env, object); + } - av_freep(&format); + if (!format->object) { + ff_jni_reset_jfields(env, &format->jfields, jni_amediaformat_mapping, 1, format); + av_freep(&format); + } - return NULL; + return format; } static FFAMediaFormat *ff_AMediaFormat_newFromObject(void *object) @@ -1562,6 +1567,7 @@ uint8_t* ff_AMediaCodec_getInputBuffer(FFAMediaCodec* codec, size_t idx, size_t JNIEnv *env = NULL; jobject buffer = NULL; + jobject input_buffers = NULL; JNI_GET_ENV_OR_RETURN(env, codec, NULL); @@ -1572,12 +1578,12 @@ uint8_t* ff_AMediaCodec_getInputBuffer(FFAMediaCodec* codec, size_t idx, size_t } } else { if (!codec->input_buffers) { - codec->input_buffers = (*env)->CallObjectMethod(env, codec->object, codec->jfields.get_input_buffers_id); + input_buffers = (*env)->CallObjectMethod(env, codec->object, codec->jfields.get_input_buffers_id); if (ff_jni_exception_check(env, 1, codec) < 0) { goto fail; } - codec->input_buffers = (*env)->NewGlobalRef(env, codec->input_buffers); + codec->input_buffers = (*env)->NewGlobalRef(env, input_buffers); if (ff_jni_exception_check(env, 1, codec) < 0) { goto fail; } @@ -1596,6 +1602,10 @@ fail: (*env)->DeleteLocalRef(env, buffer); } + if (input_buffers) { + (*env)->DeleteLocalRef(env, input_buffers); + } + return ret; } @@ -1605,6 +1615,7 @@ uint8_t* ff_AMediaCodec_getOutputBuffer(FFAMediaCodec* codec, size_t idx, size_t JNIEnv *env = NULL; jobject buffer = NULL; + jobject output_buffers = NULL; JNI_GET_ENV_OR_RETURN(env, codec, NULL); @@ -1615,12 +1626,12 @@ uint8_t* ff_AMediaCodec_getOutputBuffer(FFAMediaCodec* codec, size_t idx, size_t } } else { if (!codec->output_buffers) { - codec->output_buffers = (*env)->CallObjectMethod(env, codec->object, codec->jfields.get_output_buffers_id); + output_buffers = (*env)->CallObjectMethod(env, codec->object, codec->jfields.get_output_buffers_id); if (ff_jni_exception_check(env, 1, codec) < 0) { goto fail; } - codec->output_buffers = (*env)->NewGlobalRef(env, codec->output_buffers); + codec->output_buffers = (*env)->NewGlobalRef(env, output_buffers); if (ff_jni_exception_check(env, 1, codec) < 0) { goto fail; } @@ -1639,6 +1650,10 @@ fail: (*env)->DeleteLocalRef(env, buffer); } + if (output_buffers) { + (*env)->DeleteLocalRef(env, output_buffers); + } + return ret; } -- GitLab