From patchwork Wed Mar 17 16:32:00 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 26427 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 B0B2144BA1E for ; Wed, 17 Mar 2021 18:32:19 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 6EBF268B02A; Wed, 17 Mar 2021 18:32:19 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-ej1-f42.google.com (mail-ej1-f42.google.com [209.85.218.42]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 6F5B968AF00 for ; Wed, 17 Mar 2021 18:32:13 +0200 (EET) Received: by mail-ej1-f42.google.com with SMTP id r17so3580703ejy.13 for ; Wed, 17 Mar 2021 09:32:13 -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:reply-to:mime-version :content-transfer-encoding; bh=1D/m5nThmcxRqJ4zHWDheOS5k1zMcRWwcMmALYZ3F+8=; b=djxNbrUkHRQGDZELNgR5TnxNHHg+qgg6SRyGlJd9CIrG+STES3XG9dEWFegjieOSNg kvxEBJ8ZdbPi8XHEssyn4KIMKCdZx755KS3b73irG2Hs+c+3tacwY1F7y9a9s/+iyQa8 llNig9cOCmz8QO3vuqz6+FT/pooCXsKMIROYL23R3mTI3DK1ZiVsoMKsv7/wUSse4BNA +uKdmpNsJPVrO39pH+OcVo9YH4IwSUCf14DaJIKWrQxQYrn8SRAbfRvK9CH9YNOcG2ck 9eu3eK/j++J+Co7hfTUthHNSkmx6zld1pudp3zcdWG/LlKUQu66s7lv5n5YL9iPtR4l+ 4nCQ== 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:reply-to :mime-version:content-transfer-encoding; bh=1D/m5nThmcxRqJ4zHWDheOS5k1zMcRWwcMmALYZ3F+8=; b=r8n4aX/DE0LXe63yCum9GRl9jZIwcxdzWiftrFz5YT4KAljrQAERoIITIj4FMDcxFL V8AqzV/PR8a8h2tyNtRQN1B0Po8oOAiY+ZDiwmIHyyO2q3RMuCWGSnLm8TcGqY7hc628 4MX73lDp2cQ3FSPJwcspeXRTzOSw56sWlUxesc0OfX8CtMi2NXm/+9LBixiwbCM7Nj69 kawQOVC4q/sVSuW5wSfie0oModqlIIVEsEUP26THY2AjR6ehbhmV0AzGFwsNFHpJLl52 oMRWOb0eNJikWUkvSNqJQSlYHZegVkj8PyMkpXML6x4gyETynEPi0TgbQZyZJ+8Y2dj6 PiRw== X-Gm-Message-State: AOAM531g9HPJD1iW1SblL+K0rz4NGXc43ZEIh7oxhYrh0GgLyVrnDA11 GsDGeGJVJJWJCP8Jap9XKwIWskAgWxlWNw== X-Google-Smtp-Source: ABdhPJxlNmJo5bMeQ0yK21K90Zy++x8qSS465pNaPlvwrZnfDvridKAEPMMvWtMvEXwP5JD6WAEWEg== X-Received: by 2002:a17:906:1c41:: with SMTP id l1mr36121907ejg.299.1615998732691; Wed, 17 Mar 2021 09:32:12 -0700 (PDT) Received: from sblaptop.fritz.box (ipbcc08960.dynamic.kabel-deutschland.de. [188.192.137.96]) by smtp.gmail.com with ESMTPSA id gx2sm6518382ejc.82.2021.03.17.09.32.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 17 Mar 2021 09:32:12 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Wed, 17 Mar 2021 17:32:00 +0100 Message-Id: <20210317163202.672493-1-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.27.0 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 1/3] avcodec/pngdec: Use internal AVBPrint string when parsing chunks 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" One saves an allocation in case the string fits into the buffer. Signed-off-by: Andreas Rheinhardt --- 5663301560d77486c7f7c03c1aa5f542fab23c24 caused a regression that makes some png files lose their metadata, because decode_idat_chunk() unrefs the frame that the metadata has been attached to. I therefore tested these commits with the aforementioned commit reverted. libavcodec/pngdec.c | 27 ++++++++++----------------- 1 file changed, 10 insertions(+), 17 deletions(-) diff --git a/libavcodec/pngdec.c b/libavcodec/pngdec.c index a5a71ef161..6b9fdf5a22 100644 --- a/libavcodec/pngdec.c +++ b/libavcodec/pngdec.c @@ -517,7 +517,7 @@ static int decode_text_chunk(PNGDecContext *s, uint32_t length, int compressed, const uint8_t *data_end = data + length; const uint8_t *keyword = data; const uint8_t *keyword_end = memchr(keyword, 0, data_end - keyword); - uint8_t *kw_utf8 = NULL, *text, *txt_utf8 = NULL; + uint8_t *kw_utf8 = NULL, *txt_utf8 = NULL; unsigned text_len; AVBPrint bp; @@ -533,19 +533,16 @@ static int decode_text_chunk(PNGDecContext *s, uint32_t length, int compressed, return AVERROR_INVALIDDATA; if ((ret = decode_zbuf(&bp, data, data_end)) < 0) return ret; + data = bp.str; text_len = bp.len; - ret = av_bprint_finalize(&bp, (char **)&text); - if (ret < 0) - return ret; } else { - text = (uint8_t *)data; - text_len = data_end - text; + text_len = data_end - data; } kw_utf8 = iso88591_to_utf8(keyword, keyword_end - keyword); - txt_utf8 = iso88591_to_utf8(text, text_len); - if (text != data) - av_free(text); + txt_utf8 = iso88591_to_utf8(data, text_len); + if (compressed) + av_bprint_finalize(&bp, NULL); if (!(kw_utf8 && txt_utf8)) { av_free(kw_utf8); av_free(txt_utf8); @@ -851,7 +848,7 @@ static int decode_trns_chunk(AVCodecContext *avctx, PNGDecContext *s, static int decode_iccp_chunk(PNGDecContext *s, int length, AVFrame *f) { int ret, cnt = 0; - uint8_t *data, profile_name[82]; + uint8_t profile_name[82]; AVBPrint bp; AVFrameSideData *sd; @@ -873,19 +870,15 @@ static int decode_iccp_chunk(PNGDecContext *s, int length, AVFrame *f) if ((ret = decode_zbuf(&bp, s->gb.buffer, s->gb.buffer + length)) < 0) return ret; - ret = av_bprint_finalize(&bp, (char **)&data); - if (ret < 0) - return ret; - sd = av_frame_new_side_data(f, AV_FRAME_DATA_ICC_PROFILE, bp.len); if (!sd) { - av_free(data); + av_bprint_finalize(&bp, NULL); return AVERROR(ENOMEM); } + memcpy(sd->data, bp.str, bp.len); + av_bprint_finalize(&bp, NULL); av_dict_set(&sd->metadata, "name", profile_name, 0); - memcpy(sd->data, data, bp.len); - av_free(data); /* ICC compressed data and CRC */ bytestream2_skip(&s->gb, length + 4);