From patchwork Fri Mar 27 02:25:14 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 18420 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 4A405449924 for ; Fri, 27 Mar 2020 04:25:50 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 3431168B860; Fri, 27 Mar 2020 04:25:50 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f48.google.com (mail-wr1-f48.google.com [209.85.221.48]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id A3BF768B84F for ; Fri, 27 Mar 2020 04:25:43 +0200 (EET) Received: by mail-wr1-f48.google.com with SMTP id m17so9610514wrw.11 for ; Thu, 26 Mar 2020 19:25:43 -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=3OCyLzGs+mE7o0+T6PA3hGxeRLwQ4GrznQpoNYMR/IM=; b=hlEIiZDCSDLEMHOIioO3kfJBiChypdquK6TyuML9cOHvNYtPhdXWIvMCT3h2DSqxl+ WNEWsUIoN4wT9vEE8777Au08c6XCL50d3wOhqK5Fy4jUeX19om9mZddB7DjZR/vAOtyH qR7w+JWyF2Z1xPoXAfa1AFZ2WRECFsHiCj2ifHCEbLrGydAYLrGj1CgbJmDnPNA8Algi +dcK9MrC9yzNa3cHfeOxdRWWflvhcfJ5xlalLMJwPkJTphQG1lvLlLc0RgBR0VSXHRem TqM/mBd398rtwROBhqTajwny+j0dwZEAMyP1h7yNhHKaP6mddgH819Y/Th147Oc6FKr1 VcYw== 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=3OCyLzGs+mE7o0+T6PA3hGxeRLwQ4GrznQpoNYMR/IM=; b=i/U5fIvWe3ie+zwL129Q7x7kjXGgLvbD0+DfdKuZsojnkWu2Ptn399JkroHKTed/Uk 4pKGpdhGSFCSlqtB7kpcCniyGyPTcBu4kd4L7FD+oiFLpsIZfaR6iqnMY/ylZW8gTKeE k8SR9hHA/4ylsvWfp8EBQYiUzkHyE3SCETY+5VIDl+mCtUA2cLVQg7t0AJi3GYpV9gCh Tb4V7bvNnDJ8NnxJIHdNnw+7uSGGSDoS4JYzx67XAyvCl+9YRcMH7cjHVeSOlug2hJcJ 17ELV5AVIpVEe6zmojwywpiay4IOOUpn7bxewVhbG6mC3qwe9Jv4Qwx7hR5kb4waNRVs nGUQ== X-Gm-Message-State: ANhLgQ24RkZLfH7ZA5nzWjWSIyrC+uKNRN+j60O0bQOWlLojm52D/rfM gdsL1u5gAHBw9qfeHbL7Wc9Lvo11 X-Google-Smtp-Source: ADFU+vsmr47XNds9h07+0vU5Jfv3d4UQaXoFV2B9bcEmILzk60ZxPXNpIlgXPzleKQ8EHP4OQ5Wdmw== X-Received: by 2002:adf:bbca:: with SMTP id z10mr12385788wrg.34.1585275942786; Thu, 26 Mar 2020 19:25:42 -0700 (PDT) Received: from sblaptop.fritz.box (ipbcc1ab57.dynamic.kabel-deutschland.de. [188.193.171.87]) by smtp.gmail.com with ESMTPSA id r15sm6542773wra.19.2020.03.26.19.25.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 26 Mar 2020 19:25:42 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Fri, 27 Mar 2020 03:25:14 +0100 Message-Id: <20200327022514.27554-2-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200327022514.27554-1-andreas.rheinhardt@gmail.com> References: <158521659210.17802.7969245110754925761@lain.red.khirnov.net> <20200327022514.27554-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 2/2] avcodec/avcodec, avpacket: Return blank packet on av_packet_ref() 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" Up until now, it was completely unspecified what the content of the destination packet dst was on error. Depending upon where the error happened calling av_packet_unref() on dst might be dangerous. This commit changes this by making sure that dst is blank on error, so unreferencing it again is safe (and still pointless). This behaviour is documented. Signed-off-by: Andreas Rheinhardt --- doc/APIchanges | 4 ++++ libavcodec/avcodec.h | 3 ++- libavcodec/avpacket.c | 7 ++++--- libavcodec/version.h | 2 +- 4 files changed, 11 insertions(+), 5 deletions(-) diff --git a/doc/APIchanges b/doc/APIchanges index 8eeaec2028..f2bb2d242b 100644 --- a/doc/APIchanges +++ b/doc/APIchanges @@ -15,6 +15,10 @@ libavutil: 2017-10-21 API changes, most recent first: +2020-03-27 - xxxxxxxxxx - lavc 58.77.100 - avcodec.h + av_packet_ref() now guarantees to return the destination packet + in a blank state on error. + 2020-03-10 - xxxxxxxxxx - lavc 58.75.100 - avcodec.h Add AV_PKT_DATA_ICC_PROFILE. diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index f918d20a61..8fc0ad92c9 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -4651,7 +4651,8 @@ void av_packet_free_side_data(AVPacket *pkt); * @param dst Destination packet. Will be completely overwritten. * @param src Source packet * - * @return 0 on success, a negative AVERROR on error. + * @return 0 on success, a negative AVERROR on error. On error, dst + * will be blank (as if returned by av_packet_alloc()). */ int av_packet_ref(AVPacket *dst, const AVPacket *src); diff --git a/libavcodec/avpacket.c b/libavcodec/avpacket.c index 132567bc2d..c622718a45 100644 --- a/libavcodec/avpacket.c +++ b/libavcodec/avpacket.c @@ -610,12 +610,13 @@ int av_packet_ref(AVPacket *dst, const AVPacket *src) { int ret; + dst->buf = NULL; + ret = av_packet_copy_props(dst, src); if (ret < 0) - return ret; + goto fail; if (!src->buf) { - dst->buf = NULL; ret = packet_alloc(&dst->buf, src->size); if (ret < 0) goto fail; @@ -637,7 +638,7 @@ int av_packet_ref(AVPacket *dst, const AVPacket *src) return 0; fail: - av_packet_free_side_data(dst); + av_packet_unref(dst); return ret; } diff --git a/libavcodec/version.h b/libavcodec/version.h index 1f19b67adc..7e01d9526f 100644 --- a/libavcodec/version.h +++ b/libavcodec/version.h @@ -28,7 +28,7 @@ #include "libavutil/version.h" #define LIBAVCODEC_VERSION_MAJOR 58 -#define LIBAVCODEC_VERSION_MINOR 76 +#define LIBAVCODEC_VERSION_MINOR 77 #define LIBAVCODEC_VERSION_MICRO 100 #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \