From patchwork Sun Mar 22 03:47:39 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 18321 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 DADF944BCD9 for ; Sun, 22 Mar 2020 05:48:37 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id C173768B4AB; Sun, 22 Mar 2020 05:48:37 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm1-f66.google.com (mail-wm1-f66.google.com [209.85.128.66]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id A4A3368B3CB for ; Sun, 22 Mar 2020 05:48:30 +0200 (EET) Received: by mail-wm1-f66.google.com with SMTP id 26so6207064wmk.1 for ; Sat, 21 Mar 2020 20:48:30 -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:in-reply-to:references :mime-version:content-transfer-encoding; bh=0kSCVTN7xTbUIdvvswS2+ishV7DtdsoHk2UMJUa6uFU=; b=pnnB2Swr5KPSPuuZniNbTGrWALoTOEra2MkU/zVjsM/5lQMpd/Gyxh8onZi8ygATll WngQAxRNgH04ne3eqQrwvMnNx9mac/6CMzNVYzHt2ynoyrG9w/gnrOFYblzhAbDGRCvf ONZJtBXFhTvl/OYA+xxDWOpb2Eyi54+qGQ67QeuhQT0T9FD/905X0TbMztt3OOLDe7uS pXKylTyfNafHTzwbl0sdYkgLyM9BpACsf3ASrC/wpVSmWRewAor1z4tqKg57HMKpjJLr WazdTudFDu6FSHEyNWoPp8LbCZNdPBzRVQfqXsTPo0pLmLkKsdzwHaDt21uFLLU+DgJd y4CA== 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:in-reply-to :references:mime-version:content-transfer-encoding; bh=0kSCVTN7xTbUIdvvswS2+ishV7DtdsoHk2UMJUa6uFU=; b=fMgPnINjzEwVp32pVPvi/pxMpEEx+JCaScv4DqDkJUoCyD+7ScSzFiz/pnt6xpdrDL 0Sox0SGpcXSOn/zxIlA5K9G0PxIbdgi98HRlxlNgG2lR8/h+oqtgc200cqBRKWCMCgXj 1BmaykTGxSOnT/jMQ0nb+cz3iUJ+MqnaxXg21C1fb779k4Vi3wVi7B1t+sdTJXlflaMq J1Vcq6ClRhT/RSa5nfPi6+ixLflYBSlrkriskq9nLc4d+i2z/mrFVvuLijgsFHSMMQIU 1/2iGR1o0sscxm+xnI7ViJ5WeV7A6UWJOj6ERxcpF496RUZ2ZUbINLn162jDqi+SrUgZ pgFA== X-Gm-Message-State: ANhLgQ1OL7X13QaWVLNO5rpt/pp4hW+2x2TJYbT+SCnLNkyKPQirvNJd FQ2e/igKqlsCQm8tAPuMmJ40ck6f X-Google-Smtp-Source: ADFU+vsrL7WwtyXyyS0PD58hRAPIQ88PHmKcOPsxxkAPG5fgjf8kbJcZsCdwtenQm77SFf1TMqg/PQ== X-Received: by 2002:a7b:cc96:: with SMTP id p22mr2906095wma.118.1584848909518; Sat, 21 Mar 2020 20:48:29 -0700 (PDT) Received: from sblaptop.fritz.box (ipbcc1ab57.dynamic.kabel-deutschland.de. [188.193.171.87]) by smtp.gmail.com with ESMTPSA id k204sm1530371wma.17.2020.03.21.20.48.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 21 Mar 2020 20:48:28 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Sun, 22 Mar 2020 04:47:39 +0100 Message-Id: <20200322034756.29907-4-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200322034756.29907-1-andreas.rheinhardt@gmail.com> References: <20200322034756.29907-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 04/21] avformat: Redo cleanup of demuxer upon read_header() failure 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: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" If reading the header fails, the demuxer's read_close() function (if existing) is not called automatically; instead several demuxers call it via "goto fail" in read_header(). This commit intends to change this by adding a flag to AVInputFormat that can be used to set on a per-AVInputFormat basis whether read_close() should be called generically after an error during read_header(). The flag controlling this behaviour has been added because it might be unsafe to call read_close() generally (e.g. this might lead to read_close() being called twice and this might e.g. lead to double-frees if av_free() instead of av_freep() is used; or a size field has not been reset after freeing the elements (see the mov demuxer for an example of this)). Yet the intention is to check and fix all demuxers and make the flag redundant in the medium run. The flag has been added to a new internal field of AVInputFormat, flags_internal. When it has become redundant, it can be removed again at the next major version bump. Signed-off-by: Andreas Rheinhardt --- libavformat/avformat.h | 7 +++++++ libavformat/utils.c | 11 +++++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/libavformat/avformat.h b/libavformat/avformat.h index 9b9b634ec3..50b90788b1 100644 --- a/libavformat/avformat.h +++ b/libavformat/avformat.h @@ -780,6 +780,13 @@ typedef struct AVInputFormat { * @see avdevice_capabilities_free() for more details. */ int (*free_device_capabilities)(struct AVFormatContext *s, struct AVDeviceCapabilitiesQuery *caps); + +#define FF_INPUTFORMAT_HEADER_CLEANUP 0x0001 /**< read_close() should be called + on read_header() failure */ + /** + * Can use flags: FF_INPUTFORMAT_HEADER_CLEANUP + */ + int flags_internal; } AVInputFormat; /** * @} diff --git a/libavformat/utils.c b/libavformat/utils.c index a58e47fabc..87807a7841 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -400,8 +400,12 @@ int av_demuxer_open(AVFormatContext *ic) { if (ic->iformat->read_header) { err = ic->iformat->read_header(ic); - if (err < 0) + if (err < 0) { + if (ic->iformat->read_close && + ic->iformat->flags_internal & FF_INPUTFORMAT_HEADER_CLEANUP) + ic->iformat->read_close(ic); return err; + } } if (ic->pb && !ic->internal->data_offset) @@ -628,8 +632,11 @@ FF_ENABLE_DEPRECATION_WARNINGS if (!(s->flags&AVFMT_FLAG_PRIV_OPT) && s->iformat->read_header) - if ((ret = s->iformat->read_header(s)) < 0) + if ((ret = s->iformat->read_header(s)) < 0) { + if (s->iformat->flags_internal & FF_INPUTFORMAT_HEADER_CLEANUP) + goto close; goto fail; + } if (!s->metadata) { s->metadata = s->internal->id3v2_meta;