[FFmpeg-devel] [PATCH 1/3] lavc/mediacodec_wrapper: fix local reference leaks
Matthieu Bouron
matthieu.bouron at gmail.com
Tue May 23 14:32:02 EEST 2017
On Sun, May 21, 2017 at 06:15:29PM +0200, Matthieu Bouron wrote:
> ---
> 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;
> }
>
> --
> 2.12.0
>
Patch applied.
--
Matthieu B.
More information about the ffmpeg-devel
mailing list