From patchwork Fri Oct 11 17:36:38 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 15703 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 8948D449276 for ; Fri, 11 Oct 2019 20:38:27 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 62A80689A24; Fri, 11 Oct 2019 20:38:27 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qt1-f195.google.com (mail-qt1-f195.google.com [209.85.160.195]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id CBDD9689A12 for ; Fri, 11 Oct 2019 20:38:20 +0300 (EEST) Received: by mail-qt1-f195.google.com with SMTP id n7so14982550qtb.6 for ; Fri, 11 Oct 2019 10:38:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:mime-version :content-transfer-encoding; bh=eRzX7rxQq5BfE0QlVobXN2x1hOZl4rldLfd2w7EW9MQ=; b=qaqI0En+fhEaGVBYjwWHfGQFafsUjNhFHK0IPN+S1jiR+hhJ5nW2c1g2pHKFdOCZZw 5aoduOirbVT7jM6qsS2+la5mAq/mrxWcc+yE1FSJ5PW6JOHRNUFr5vpGEbeyLJLpDtur +ZXThovL/fr9LGLya1TyoLwPVcA+opO2EhkXlkidDZSHwqi/hQRvfYDVzPi4dyNd7sfe ioy3KZFknTk0GyqogVtq3eIRHU14iUmK+JSYGJE9cRfmO9p9n3t7lyuYf3dzK3QGIa9T bTEl1AquRbQSuYl/HO0wGcF92XMbrhXVE9goakoAjlsU9e/WKZtIsb7dXLdCXDVdf2Zt NUCg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:mime-version :content-transfer-encoding; bh=eRzX7rxQq5BfE0QlVobXN2x1hOZl4rldLfd2w7EW9MQ=; b=AW9FpPJR10UKz8zeKUFuA9OvON/MNNod3Epx+9444xPbT2c91GrDYszWCsG5+WV5J1 QyzTvEB2csBe8hKdvc5D9sk4LglpmIk0z1ZTuoW2iiwqQojSKxR2DP58pn4/s4V0LOSo AZPJvxrToRbK8t48UMjbpTmcLn/3g4EglKsPq6EEOOpNVOZxBlTbzIbI2QUtoDpNLKNr HeTzflw6sWWnPM2vTm7VeQcM/ZQSGSTPMhODKZqf0A0orWYVmLLe8dw2kyKTt/nuJLX+ rcghH+fdSkBlN7V78FlsV57khr9F33h+Gwdg2WDh0vBIRuLjcSm+Vqb7/Fcen/hMMSuV qeSQ== X-Gm-Message-State: APjAAAWGKtUIq27mqS0tYn9uG3mj5/reQqv+o43t9JT5H2HJG6RmcI7q 9agsxielHIEEWcz5nT9aQS3p67/4 X-Google-Smtp-Source: APXvYqwRbJU3PiuH8L4YGESZ++Uh0QYCkT8MUax9G0OiUpXiEVJvq3bZEH5Z3iC+Pv/2Qu8QBzp0PQ== X-Received: by 2002:ac8:fda:: with SMTP id f26mr18301227qtk.34.1570815499030; Fri, 11 Oct 2019 10:38:19 -0700 (PDT) Received: from localhost.localdomain ([191.84.228.126]) by smtp.gmail.com with ESMTPSA id x55sm5491133qta.74.2019.10.11.10.38.18 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 11 Oct 2019 10:38:18 -0700 (PDT) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Fri, 11 Oct 2019 14:36:38 -0300 Message-Id: <20191011173639.2080-1-jamrial@gmail.com> X-Mailer: git-send-email 2.23.0 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] avformat/dv: free all allocated structs on dv_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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Also propagate proper AVERROR codes while at it. Fixes ticket #8230. Signed-off-by: James Almer --- libavformat/dv.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/libavformat/dv.c b/libavformat/dv.c index eb44e0acb6..e99422d4b5 100644 --- a/libavformat/dv.c +++ b/libavformat/dv.c @@ -495,16 +495,18 @@ static int dv_read_header(AVFormatContext *s) { unsigned state, marker_pos = 0; RawDVContext *c = s->priv_data; + int ret; c->dv_demux = avpriv_dv_init_demux(s); if (!c->dv_demux) - return -1; + return AVERROR(ENOMEM); state = avio_rb32(s->pb); while ((state & 0xffffff7f) != 0x1f07003f) { if (avio_feof(s->pb)) { av_log(s, AV_LOG_ERROR, "Cannot find DV header.\n"); - return -1; + ret = AVERROR_INVALIDDATA; + goto fail; } if (state == 0x003f0700 || state == 0xff3f0700) marker_pos = avio_tell(s->pb); @@ -518,8 +520,10 @@ static int dv_read_header(AVFormatContext *s) AV_WB32(c->buf, state); if (avio_read(s->pb, c->buf + 4, DV_PROFILE_BYTES - 4) != DV_PROFILE_BYTES - 4 || - avio_seek(s->pb, -DV_PROFILE_BYTES, SEEK_CUR) < 0) - return AVERROR(EIO); + avio_seek(s->pb, -DV_PROFILE_BYTES, SEEK_CUR) < 0) { + ret = AVERROR(EIO); + goto fail; + } c->dv_demux->sys = av_dv_frame_profile(c->dv_demux->sys, c->buf, @@ -527,7 +531,8 @@ static int dv_read_header(AVFormatContext *s) if (!c->dv_demux->sys) { av_log(s, AV_LOG_ERROR, "Can't determine profile of DV input stream.\n"); - return -1; + ret = AVERROR_INVALIDDATA; + goto fail; } s->bit_rate = av_rescale_q(c->dv_demux->sys->frame_size, @@ -538,6 +543,11 @@ static int dv_read_header(AVFormatContext *s) dv_read_timecode(s); return 0; + +fail: + av_freep(&c->dv_demux); + + return ret; } static int dv_read_packet(AVFormatContext *s, AVPacket *pkt)