From patchwork Tue Jan 30 12:43:25 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: wm4 X-Patchwork-Id: 7450 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.2.156.27 with SMTP id q27csp296892jak; Tue, 30 Jan 2018 04:43:33 -0800 (PST) X-Google-Smtp-Source: AH8x225v157ScljOFDxhK5HpthLK2cAD5uH4UIQ4+tpQrtedmIJF1HABlGo+PwsfCMfGf2Kr5xZu X-Received: by 10.223.156.197 with SMTP id h5mr21760818wre.17.1517316213645; Tue, 30 Jan 2018 04:43:33 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1517316213; cv=none; d=google.com; s=arc-20160816; b=y1PD56Ey5yeyB//UIJqnxTgW5oJmubD1dWj9rV70B4iiB9nXbdBu1grxnOBGJlQ1H5 Y+OOKT7c3Lsryvv44/+tPUyU+8MZi6Vo5G5obbSd/DMqz32pp544V7i/mTPOMtETvDsr U+3NfGAroMaZritixnFXhpZbVpd+tYkHTN19UVw1c++KKP7IVlOklU71hAZ+LiQvjY3a t0m6AcA0RvDnTRNXVZVHWYxd70qgP8Bhn9Xe4W0mpWpbScFLnhfL78ArQ4XVRCswucUh p8A2iAxfOFpW6+9GaxL+9annUzDI25lWvzVZXzBeGtg64o9CTczOQbZGnYA0bOXxmPVB II7g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:message-id:date:to:from:dkim-signature :delivered-to:arc-authentication-results; bh=AWryzHL7TqhY0sBZf//ZXIZceGhxoGaBYkK8Il5W1D8=; b=ITfPxEMi88RsJbPTc2ZDGujKZV2SvbXObtQ5DkOEbwatIUSMc5FnnlD6NfN2GaSrqS Xbu6M0pOpdSg5cRHfTj4WwiYWenJzPfu4itIR0KOzfaxaMdE/6Bwb5+p2rr6JBFbAvDU tH3FpZs1EZQwnFqhKULpcn4TUd1OHYhqdaxYfJNVM4xp1ekbgFWxIzoD3cQX3niInMlr Lmvkx8GrmexskksEoIdWkc2RCD+GMpz4kU6h3CBqLg5NuNgQHAUKatyypqoKlHQDGJus fGs23ohHgSj+Zy4W+ZPV0m1ChUvPWxCUnlOQFE6c7lekF9AAEPA9iBRER7m5382Y7EWT v/FQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@googlemail.com header.s=20161025 header.b=tgwAUhhT; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=googlemail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id o21si8036334wrf.105.2018.01.30.04.43.32; Tue, 30 Jan 2018 04:43:33 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@googlemail.com header.s=20161025 header.b=tgwAUhhT; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=googlemail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id B6BAA689800; Tue, 30 Jan 2018 14:43:26 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm0-f45.google.com (mail-wm0-f45.google.com [74.125.82.45]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 097576806AF for ; Tue, 30 Jan 2018 14:43:20 +0200 (EET) Received: by mail-wm0-f45.google.com with SMTP id g1so851867wmg.2 for ; Tue, 30 Jan 2018 04:43:26 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlemail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=+0N83VAs5LRI/elZjgLduI07BltCcbXamBrn5F2Mq98=; b=tgwAUhhT7JJfOpFe0dymmPwRwDM1XTc2FXML44P/Dsjtj1o2uja32fINqk1+hP0yDm LC3D9eQDWSSVM/U2puSW/SVU8peVPHg3xn19IJ9vZbc6ftW84BkFqb2dkhxZBs0lTaPy 56+YZSTDDdLKzdNMr5xZDk/9u6DRx63VLMLN2av0ZOcu9CSIyIi88k303bQbX+ByH+18 Xnwo0BaAmcdpcyDe9oqUdw1oAjnZl0pIhm/+uDzk06jb9ODMD8SDuDZU9uiw8HefGPoH CYBCXOh/yi8xxNLDWgkAQFCisu8NI0LAfWMzWCHmwF9dESSfw3iIihQaB/yncuTpIizV lYTw== 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; bh=+0N83VAs5LRI/elZjgLduI07BltCcbXamBrn5F2Mq98=; b=bN1HDVwwd4gRilxHc/KFCLJoGKsz2gwH/jTBVlADUwurCrmy7xVwpuctG7/5MMlqkY C7M38ZA83w6TOsR+nS1DmYa7QGucqRG0M+85b4i5ryNNRH90L/fRNn2tqbJYiJOmsnvL B86fhBisNxpwjvuiJle/oH7kXpUvVYyu20eB4X3D/Gar/o7KU14GjCPvzs3kRauy0YQa 0HwehKW6u805S1BYlyVVQeeW9g50Mgwd1uwCTJ+S76fcFwZlJmFHjnR22mC+aBGm3bF9 hiQgCBzlpXldhwGI6lebSlyM0xoiSSwTtd7NfAvTtGiEbuBRWRQtlSODlrMNydhzHNN9 pieQ== X-Gm-Message-State: AKwxytdKRpOygSz7Q17ruoWrHnAx87McqHK9jwFlBKfo2rQPlSYNQAGZ 5+YMG+lunsBbfuQfwBmDGnPpfQ== X-Received: by 10.28.179.9 with SMTP id c9mr18330379wmf.99.1517316205385; Tue, 30 Jan 2018 04:43:25 -0800 (PST) Received: from debian.speedport.ip (p2003006CCD4EDC572181ACA05874A32F.dip0.t-ipconnect.de. [2003:6c:cd4e:dc57:2181:aca0:5874:a32f]) by smtp.googlemail.com with ESMTPSA id d20sm8629085wrd.67.2018.01.30.04.43.23 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 30 Jan 2018 04:43:24 -0800 (PST) From: wm4 To: ffmpeg-devel@ffmpeg.org Date: Tue, 30 Jan 2018 13:43:25 +0100 Message-Id: <20180130124325.1310-1-nfxjfg@googlemail.com> X-Mailer: git-send-email 2.15.1 Subject: [FFmpeg-devel] [PATCH] id3v2: fix unsynchronization 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: wm4 MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" The ID3v2 "unsynchronization scheme" requires replacing any 0xFF 0x00 sequences with 0xFF. This has to be done on every byte of the source data, while the current code skipped a byte after a replacement. This meant 0xFF 0x00 0xFF 00 was translated to 0xFF 0xFF 0x00 instead of 0xFF 0xFF. It feels a bit messy to do this correctly with the avio use. But fortunately, this translation can be done in-place, so we can just do it in memory. Inspired by what taglib does. --- Sample (which had corrupted cover art, displays fine with the fix): https://0x0.st/sbQ9.bin (unfortunately a bit too large for FATE) --- libavformat/id3v2.c | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/libavformat/id3v2.c b/libavformat/id3v2.c index b80178d67a..f7de26a1d8 100644 --- a/libavformat/id3v2.c +++ b/libavformat/id3v2.c @@ -976,19 +976,21 @@ static void id3v2_parse(AVIOContext *pb, AVDictionary **metadata, } } if (unsync || tunsync) { - int64_t end = avio_tell(pb) + tlen; - uint8_t *b; - - b = buffer; - while (avio_tell(pb) < end && b - buffer < tlen && !pb->eof_reached) { - *b++ = avio_r8(pb); - if (*(b - 1) == 0xff && avio_tell(pb) < end - 1 && - b - buffer < tlen && - !pb->eof_reached ) { - uint8_t val = avio_r8(pb); - *b++ = val ? val : avio_r8(pb); - } + uint8_t *b = buffer; + uint8_t *t = buffer; + uint8_t *end = t + tlen; + + if (avio_read(pb, buffer, tlen) != tlen) { + av_log(s, AV_LOG_ERROR, "Failed to read tag data\n"); + goto seek; } + + while (t != end) { + *b++ = *t++; + if (t != end && t[-1] == 0xff && !t[0]) + t++; + } + ffio_init_context(&pb_local, buffer, b - buffer, 0, NULL, NULL, NULL, NULL); tlen = b - buffer;