From patchwork Wed Apr 29 02:54:21 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andriy Gelman X-Patchwork-Id: 19350 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 6A23E44B3E0 for ; Wed, 29 Apr 2020 05:54:42 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 4332468BE16; Wed, 29 Apr 2020 05:54:42 +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 C1CB968BE0C for ; Wed, 29 Apr 2020 05:54:35 +0300 (EEST) Received: by mail-qt1-f170.google.com with SMTP id s30so737142qth.2 for ; Tue, 28 Apr 2020 19:54:35 -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=gGcy43LisSiHjUpo3uXqUiuSxU0FaADGIlkBfAXe8Zs=; b=pwgk7yhOIMJTbiTNJ+Dpf7eNBnLWv6k+o1N16LnIVAAcVQoiJU8/Ctog6siA+8wd2Y HKccEMDYxtNEML1TYqUsn0dZZGNbKpzNms/mt7eXKp604O0/w410wKkVHENLaRbdEtBt gyQUxxpi3tmJy/nLMj7QwHM+LlCn690tdRDPPpOJgfiSgwUmYvEMUP2lrVSllLzbsOxM RoEjEBJOHfp4WysLR7B5lec/QMWVcaX843urDdqKPHfEJWmH0wEYd9vYRujRccDvDvYF mFllDbQXMjjZJQGQ7okCNTgJgVPQw3MQeHUWS0wM+8kqiTjEquUh1RT4nZEs8asHmpDK uUog== 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=gGcy43LisSiHjUpo3uXqUiuSxU0FaADGIlkBfAXe8Zs=; b=oOOZK7lflPB+/YmKl+Or/+z2oKm5j++6lqqWC9NihINqbCDlUF2KntbDqs3/NT2lDf uJaT5nSwIgSZjQv0+Cn8xYZs46BDOMb9EZn11wK2NIpxyRZvQzpQJnr871PAlfACI1u+ Pr6T7HJlsaVP1cCeK0V19aDll6Qy91dspRZGApZHSv3+lcBDiK0zt1qhh1IDuNjc+abB EPatlICqMfG0p9YvFHWQXRCoLhqzIn0ZsGrSPPs/xvIxmqZqEnJEkcC6lmkNjpmneG9K IFZN2N0tVKP7uzd6nN9pMrhJR5Aur+H8RWFw7jfey3vkzkGvtZDHMrFBCkl5yCEj8lvK EBhQ== X-Gm-Message-State: AGi0PuYOVPC/F2uD2QAtP5NQVslNpzYT/nPPZa2CFcAPqulGwYt5sOoK D793//SzfB4qAGa+4NfWxh1bcGB5 X-Google-Smtp-Source: APiQypJmwQut1ymMiFKTustnUEFeuFtEFs6nPan0/VJlUDcGomVh8c3C4WFBunhcnD/ulWlpQopOHQ== X-Received: by 2002:ac8:f10:: with SMTP id e16mr30968923qtk.89.1588128873893; Tue, 28 Apr 2020 19:54:33 -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 x22sm9187040qtr.57.2020.04.28.19.54.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 28 Apr 2020 19:54:33 -0700 (PDT) From: Andriy Gelman X-Google-Original-From: Andriy Gelman To: ffmpeg-devel@ffmpeg.org Date: Tue, 28 Apr 2020 22:54:21 -0400 Message-Id: <20200429025421.9270-1-andriy.gelman@gmail.com> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2] 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 v2: - Use FF_CODEC_CAP_INIT_CLEANUP This patch supersedes: https://patchwork.ffmpeg.org/project/ffmpeg/patch/20200310045541.13048-1-andriy.gelman@gmail.com/ https://patchwork.ffmpeg.org/project/ffmpeg/patch/20200310045541.13048-2-andriy.gelman@gmail.com/ libavcodec/v4l2_m2m.c | 8 ++++++++ libavcodec/v4l2_m2m_dec.c | 10 ++-------- libavcodec/v4l2_m2m_enc.c | 2 ++ 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/libavcodec/v4l2_m2m.c b/libavcodec/v4l2_m2m.c index e48b3a8ccf..bfea70ff0c 100644 --- a/libavcodec/v4l2_m2m.c +++ b/libavcodec/v4l2_m2m.c @@ -338,6 +338,13 @@ int ff_v4l2_m2m_codec_end(V4L2m2mPriv *priv) V4L2m2mContext *s = priv->context; int ret; + if (!s) + return 0; + + if (av_codec_is_decoder(s->avctx->codec)) + av_packet_unref(&s->buf_pkt); + + 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); @@ -345,6 +352,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 3e17e0fcac..a2ea0ff73a 100644 --- a/libavcodec/v4l2_m2m_dec.c +++ b/libavcodec/v4l2_m2m_dec.c @@ -212,9 +212,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; } @@ -223,10 +220,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) @@ -261,7 +255,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 8454e2326c..97c937fdf9 100644 --- a/libavcodec/v4l2_m2m_enc.c +++ b/libavcodec/v4l2_m2m_enc.c @@ -25,6 +25,7 @@ #include #include #include "libavcodec/avcodec.h" +#include "libavcodec/internal.h" #include "libavutil/pixdesc.h" #include "libavutil/pixfmt.h" #include "libavutil/opt.h" @@ -391,6 +392,7 @@ static const AVOption options[] = { .receive_packet = v4l2_receive_packet, \ .close = v4l2_encode_close, \ .capabilities = AV_CODEC_CAP_HARDWARE | AV_CODEC_CAP_DELAY, \ + .caps_internal = FF_CODEC_CAP_INIT_CLEANUP, \ .wrapper_name = "v4l2m2m", \ };