From patchwork Sun Jul 19 19:36:18 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andriy Gelman X-Patchwork-Id: 21193 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 2C31044BB8E for ; Sun, 19 Jul 2020 23:07:44 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 0C04068B94D; Sun, 19 Jul 2020 23:07:44 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qt1-f170.google.com (mail-qt1-f170.google.com [209.85.160.170]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 6462368B937 for ; Sun, 19 Jul 2020 23:07:37 +0300 (EEST) Received: by mail-qt1-f170.google.com with SMTP id x62so11534258qtd.3 for ; Sun, 19 Jul 2020 13:07:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=C12i2LDJg6kDvFVvzEW9WdvAcDntnqkuHEkGC0+6EGs=; b=CaFr+Krc9rnxoSIZGCcM8DWRyQ9a3ZULQZOli7Gi3zpaxTBjlmt9osO0T3IhjG/Hio EekhmgKiW7Qu5cksk/0X4/mHUPGTIYTDno3KR04vB7VKuK0tXSjqYKDNzMTwdUGxfphc QaVfeSK2qKzpIXjGSEQwF8rve+3EUbT3gf9yIloNxVxHZ4HbSWdE1aUbS19oFDq7SNlz /7ll+j6FYWLC053YQ7r0zWSnAfWkSP1zYTOsXsJGpyLeXnz2bQm+hGZIV4JU4s9svmJx y7WryjZLKN2hpkSP8iMMmNxDfODS5B376T6s1+YTsDH+TpRbgcYkOnTvHQaCNuiDL/av 3lmg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=C12i2LDJg6kDvFVvzEW9WdvAcDntnqkuHEkGC0+6EGs=; b=WVPA1kGBUh0DYTZzNo2BBmhdtX1BtPRvPoMuv5BDk5Ud9TP8Sr/nqiJInCRW6RgfvZ 2NiLHF7/6RHrHQ7Vrl0QQlCq0jObauF0QgM/dLjrYCVsnelKmmGIGWLlU49jfIPUbMRc qve36JBSzOWYvujUj5ItcsbFzRmSinZm3JEpXTbglVS/dV3mumj7b98kDczADlgJ4gzw BHo4mY1wlNzSw8AibuI7FDE54rs/8tZDnXkr/4RQ7v2U5+MzC7Dw7ni8Ti+8L+TLjtJ7 YCdhe6kzu9J3uFSXKAYWuI+9b7JZ46m4RHBTkrVHps+qTjr7oGfU7jm90s0LcVSLrhmS RnIQ== X-Gm-Message-State: AOAM531Q3B0w7uMAB6Cnf6KAU4fTmENttWwUCIyCc1EQDKBHtnbMZ6ZV OQNyucM1LPDhP9GyicdIGTUxrxjN X-Google-Smtp-Source: ABdhPJzySRr/5Y+oZvFVqGb2wqO2a5BrmJKssLhczJDWHTFZhAIcwOxLSpJ1wgzF31o6xpjxq/vlNA== X-Received: by 2002:aed:2199:: with SMTP id l25mr20407041qtc.309.1595187386104; Sun, 19 Jul 2020 12:36:26 -0700 (PDT) Received: from localhost.localdomain (c-71-232-27-28.hsd1.ma.comcast.net. [71.232.27.28]) by smtp.gmail.com with ESMTPSA id b142sm6907270qkc.37.2020.07.19.12.36.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 19 Jul 2020 12:36:25 -0700 (PDT) From: Andriy Gelman X-Google-Original-From: Andriy Gelman To: ffmpeg-devel@ffmpeg.org Date: Sun, 19 Jul 2020 15:36:18 -0400 Message-Id: <20200719193618.60977-1-andriy.gelman@gmail.com> X-Mailer: git-send-email 2.27.0 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v3] avcodec/v4l2_m2m: adapt to call close() on init fail X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Cc: Andriy Gelman Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" From: Andriy Gelman This fixes several mem leaks when init of encoder/decoder failed. Fixes ticket #8285 Signed-off-by: Andriy Gelman --- - Changes in v3 rebased and moved av_packet_unref(&s->buf_pkt) to v4l2_m2m_destroy_context() to be consistent with another patch libavcodec/v4l2_m2m.c | 6 ++++++ libavcodec/v4l2_m2m_dec.c | 10 ++-------- libavcodec/v4l2_m2m_enc.c | 1 + 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/libavcodec/v4l2_m2m.c b/libavcodec/v4l2_m2m.c index d8d872ea09..944c1a2823 100644 --- a/libavcodec/v4l2_m2m.c +++ b/libavcodec/v4l2_m2m.c @@ -330,6 +330,7 @@ static void v4l2_m2m_destroy_context(void *opaque, uint8_t *context) close(s->fd); av_frame_free(&s->frame); + av_packet_unref(&s->buf_pkt); av_free(s); } @@ -339,6 +340,10 @@ int ff_v4l2_m2m_codec_end(V4L2m2mPriv *priv) V4L2m2mContext *s = priv->context; int ret; + if (!s) + return 0; + + if (s->fd >= 0) { ret = ff_v4l2_context_set_status(&s->output, VIDIOC_STREAMOFF); if (ret) av_log(s->avctx, AV_LOG_ERROR, "VIDIOC_STREAMOFF %s\n", s->output.name); @@ -346,6 +351,7 @@ int ff_v4l2_m2m_codec_end(V4L2m2mPriv *priv) ret = ff_v4l2_context_set_status(&s->capture, VIDIOC_STREAMOFF); if (ret) av_log(s->avctx, AV_LOG_ERROR, "VIDIOC_STREAMOFF %s\n", s->capture.name); + } ff_v4l2_context_release(&s->output); diff --git a/libavcodec/v4l2_m2m_dec.c b/libavcodec/v4l2_m2m_dec.c index b038efed9c..ab07c0a24a 100644 --- a/libavcodec/v4l2_m2m_dec.c +++ b/libavcodec/v4l2_m2m_dec.c @@ -205,9 +205,6 @@ static av_cold int v4l2_decode_init(AVCodecContext *avctx) ret = ff_v4l2_m2m_codec_init(priv); if (ret) { av_log(avctx, AV_LOG_ERROR, "can't configure decoder\n"); - s->self_ref = NULL; - av_buffer_unref(&priv->context_ref); - return ret; } @@ -216,10 +213,7 @@ static av_cold int v4l2_decode_init(AVCodecContext *avctx) static av_cold int v4l2_decode_close(AVCodecContext *avctx) { - V4L2m2mPriv *priv = avctx->priv_data; - V4L2m2mContext *s = priv->context; - av_packet_unref(&s->buf_pkt); - return ff_v4l2_m2m_codec_end(priv); + return ff_v4l2_m2m_codec_end(avctx->priv_data); } #define OFFSET(x) offsetof(V4L2m2mPriv, x) @@ -254,7 +248,7 @@ static const AVOption options[] = { .close = v4l2_decode_close, \ .bsfs = bsf_name, \ .capabilities = AV_CODEC_CAP_HARDWARE | AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AVOID_PROBING, \ - .caps_internal = FF_CODEC_CAP_SETS_PKT_DTS, \ + .caps_internal = FF_CODEC_CAP_SETS_PKT_DTS | FF_CODEC_CAP_INIT_CLEANUP, \ .wrapper_name = "v4l2m2m", \ } diff --git a/libavcodec/v4l2_m2m_enc.c b/libavcodec/v4l2_m2m_enc.c index 56df4286ad..af0ed1e306 100644 --- a/libavcodec/v4l2_m2m_enc.c +++ b/libavcodec/v4l2_m2m_enc.c @@ -429,6 +429,7 @@ static const AVCodecDefault v4l2_m2m_defaults[] = { .close = v4l2_encode_close, \ .defaults = v4l2_m2m_defaults, \ .capabilities = AV_CODEC_CAP_HARDWARE | AV_CODEC_CAP_DELAY, \ + .caps_internal = FF_CODEC_CAP_INIT_CLEANUP, \ .wrapper_name = "v4l2m2m", \ }