From patchwork Sat Nov 13 21:04:47 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Michael Niedermayer X-Patchwork-Id: 31397 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:d206:0:0:0:0:0 with SMTP id q6csp3674241iob; Sat, 13 Nov 2021 13:06:18 -0800 (PST) X-Google-Smtp-Source: ABdhPJyPsJCNaD2ey3ygCXObd3IbiSC88sFz4AD1WQAp8ktADqE5rflIS1EK05DLwjW56XFe7xcw X-Received: by 2002:a17:907:628b:: with SMTP id nd11mr28575061ejc.114.1636837577836; Sat, 13 Nov 2021 13:06:17 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1636837577; cv=none; d=google.com; s=arc-20160816; b=KHizrHy/QBZOCMBvZCXehZE36DhZ5QJ9PtFU0a5f4YBQ9LXF6WjFcJDGxFF5syIcul ZNAdEqWCWIwm3641w+Sp/0h4p+v0QkWqvklbzZIO0Lz1wC4JB3h6ANBj2p/O/UGHfPdp dJHlXaDCb8ram+hwMHUAXGECvLHxqHik3dhqXyiAheztFKlx6RnjoBBVAKg8hzDfyDK0 3stsE8qqi21IHRII4sViz06ktb3SAFJJqcCeHh8pxttm2mwurDNoByy2fe3uqYVd3aX0 LIysUNJkWpJ6coS2zA3QAzS9EDl1p8v5r1O+9Ko77e/gSOGK91XtR5Yy59WQxv52XdjV 8C1Q== 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:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:message-id:date:to:from:delivered-to; bh=n3DD3W0b7d1ms3GD1DliEwr6Mf6VBjkm7JnaFxajExQ=; b=Cd43H2/5vqXgcOVEqtRHt7vyALMZzXnnu1aUSyjdlgWLD3XTIykIjOhcv3nmeBj8dI omGY0lRdIjBibsEY6iSnilaUSPdTkAVPfIi2vHzmEJy3pNxTfqV2a3KxZkgFb6HMYcCZ PjMCi1Szo6NGTIwNnYyiFh6yBBYc3jFBsuWGoMRPvCtsbAgrCZDXUsQnuqS790za+Bzs L/pUbHPCeq0kbP5FXcyRdVTXMf0Oil3VWUFUuIfsz0WhDThOepNh4Cva2E0WnRfO5NzV eB9EttR6vMwMe0ziwkroYx2VRqKsFA0F2U3pej1wacCh0VH+nZX8bFoxGAjb0gIbQE37 IZ9Q== ARC-Authentication-Results: i=1; mx.google.com; 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 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id hs41si23151983ejc.681.2021.11.13.13.05.54; Sat, 13 Nov 2021 13:06:17 -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; 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 Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id B64AF68AD15; Sat, 13 Nov 2021 23:05:50 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from vie01a-dmta-pe02-2.mx.upcmail.net (vie01a-dmta-pe02-2.mx.upcmail.net [62.179.121.158]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 7EA5F689BB4 for ; Sat, 13 Nov 2021 23:05:48 +0200 (EET) Received: from [172.31.216.235] (helo=vie01a-pemc-psmtp-pe12.mail.upcmail.net) by vie01a-dmta-pe02.mx.upcmail.net with esmtp (Exim 4.92) (envelope-from ) id 1mm0Dc-006XMJ-0H for ffmpeg-devel@ffmpeg.org; Sat, 13 Nov 2021 22:05:48 +0100 Received: from localhost ([213.47.68.29]) by vie01a-pemc-psmtp-pe12.mail.upcmail.net with ESMTP id m0CdmqYERSgGFm0CdmUmRD; Sat, 13 Nov 2021 22:04:47 +0100 X-Env-Mailfrom: michael@niedermayer.cc X-Env-Rcptto: ffmpeg-devel@ffmpeg.org X-SourceIP: 213.47.68.29 X-CNFS-Analysis: v=2.3 cv=f8Q2+96M c=1 sm=1 tr=0 a=2hcxjKEKjp0CzLx6oWAm4g==:117 a=2hcxjKEKjp0CzLx6oWAm4g==:17 a=MKtGQD3n3ToA:10 a=1oJP67jkp3AA:10 a=GEAsPZ9sns4A:10 a=ZZnuYtJkoWoA:10 a=t3SimwyMuchAJkN3hSYA:9 From: Michael Niedermayer To: FFmpeg development discussions and patches Date: Sat, 13 Nov 2021 22:04:47 +0100 Message-Id: <20211113210447.28681-1-michael@niedermayer.cc> X-Mailer: git-send-email 2.17.1 X-CMAE-Envelope: MS4wfCd0Vy89oPolMRjoPbuJKBniRS1TMTlcUZ1B7Lu2iKqeVfEyHLT2IJbXfZjjpjhS1E5X479mFqNZRnO69Rrmnrvui0mwLDZOMw7Ri0h4JFJ+PRUlv8yN 4tWxbGqJEFm2vtRQSeH/9bGVAhH2bHWwDDsM+ricxVMqC4vyZwAczjIi Subject: [FFmpeg-devel] [PATCH] avcodec/vqavideo: Use GetByteContext and check for end X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 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 MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: LXx5nd4m3qGv Fixes: out of array access Fixes: Timeout Fixes: 40481/clusterfuzz-testcase-minimized-ffmpeg_AV_CODEC_ID_VQA_fuzzer-6502647583080448 Signed-off-by: Michael Niedermayer --- libavcodec/vqavideo.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/libavcodec/vqavideo.c b/libavcodec/vqavideo.c index 5466e25cdf1..755abf6bafa 100644 --- a/libavcodec/vqavideo.c +++ b/libavcodec/vqavideo.c @@ -633,7 +633,7 @@ static int vqa_decode_frame_hicolor(VqaContext *s, AVFrame *frame) int vptr_chunk = -1; int vprz_chunk = -1; - const unsigned char *stream; + GetByteContext gb_stream; while (bytestream2_get_bytes_left(&s->gb) >= 8) { chunk_type = bytestream2_get_be32u(&s->gb); @@ -722,7 +722,7 @@ static int vqa_decode_frame_hicolor(VqaContext *s, AVFrame *frame) /* now uncompress the per-row RLE of the decode buffer and draw the blocks in framebuffer */ - stream = (unsigned char*)s->decode_buffer; + bytestream2_init(&gb_stream, s->decode_buffer, s->decode_buffer_size); for (int y_pos = 0; y_pos < s->height; y_pos += s->vector_height) { int x_pos = 0; @@ -730,9 +730,14 @@ static int vqa_decode_frame_hicolor(VqaContext *s, AVFrame *frame) while (x_pos < s->width) { int vector_index = 0; int count = 0; - uint16_t code = bytestream_get_le16(&stream); + uint16_t code; int type; + if (bytestream2_get_bytes_left(&gb_stream) < 1) + return AVERROR_INVALIDDATA; + + code = bytestream2_get_le16(&gb_stream); + type = code >> 13; code &= 0x1fff; @@ -747,7 +752,7 @@ static int vqa_decode_frame_hicolor(VqaContext *s, AVFrame *frame) count = 1; } else if (type < 7) { vector_index = code; - count = *stream++; + count = bytestream2_get_byte(&gb_stream); } else { av_log(s->avctx, AV_LOG_ERROR, " unknown type in VPTR chunk (%d)\n",type); return AVERROR_INVALIDDATA; @@ -776,7 +781,7 @@ static int vqa_decode_frame_hicolor(VqaContext *s, AVFrame *frame) /* we might want to read the next block index from stream */ if ((type == 2) && count > 0) { - vector_index = bytestream_get_byte(&stream); + vector_index = bytestream2_get_byte(&gb_stream); } x_pos += 4;