Patch attached. - Andreas
From e4ca407ca3ccbea4177ec89048e1b38833b86e36 Mon Sep 17 00:00:00 2001 From: Andreas Rheinhardt <andreas.rheinha...@outlook.com> Date: Mon, 21 Apr 2025 19:54:38 +0200 Subject: [PATCH] avformat: Use ffio_read_size() where appropriate
Signed-off-by: Andreas Rheinhardt <andreas.rheinha...@outlook.com> --- libavformat/argo_brp.c | 37 ++++++++++++++++--------------------- libavformat/flacdec.c | 5 ++--- libavformat/ilbc.c | 7 +++++-- libavformat/ipmovie.c | 7 +++++-- libavformat/mm.c | 11 +++++++---- libavformat/mpeg.c | 6 +++--- libavformat/mxfdec.c | 19 +++++++++++++------ libavformat/qcp.c | 7 +++++-- libavformat/rmdec.c | 15 +++++++++------ libavformat/takdec.c | 12 ++++++------ libavformat/vividas.c | 5 +++-- libavformat/vqf.c | 15 +++++++-------- libavformat/wavdec.c | 7 +++++-- libavformat/wtvdec.c | 7 +++++-- 14 files changed, 91 insertions(+), 69 deletions(-) diff --git a/libavformat/argo_brp.c b/libavformat/argo_brp.c index 94b404b5d0..9d898d3193 100644 --- a/libavformat/argo_brp.c +++ b/libavformat/argo_brp.c @@ -21,6 +21,7 @@ */ #include "avformat.h" +#include "avio_internal.h" #include "demux.h" #include "internal.h" #include "libavutil/intreadwrite.h" @@ -139,12 +140,10 @@ static int read_extradata(AVFormatContext *s, const ArgoBRPStreamHeader *hdr, av_assert0(bufsz >= size); - if ((ret = avio_read(s->pb, buf, size)) < 0) + ret = ffio_read_size(s->pb, buf, size); + if (ret < 0) return ret; - if (ret != size) - return AVERROR(EIO); - return 0; } @@ -155,10 +154,9 @@ static int argo_brp_read_header(AVFormatContext *s) ArgoBRPDemuxContext *brp = s->priv_data; uint8_t buf[FFMAX(BRP_MIN_BUFFER_SIZE, ASF_MIN_BUFFER_SIZE)]; - if ((ret = avio_read(pb, buf, BRP_FILE_HEADER_SIZE)) < 0) + ret = ffio_read_size(pb, buf, BRP_FILE_HEADER_SIZE); + if (ret < 0) return ret; - else if (ret != BRP_FILE_HEADER_SIZE) - return AVERROR(EIO); brp->fhdr.magic = AV_RL32(buf + 0); brp->fhdr.num_streams = AV_RL32(buf + 4); @@ -181,10 +179,9 @@ static int argo_brp_read_header(AVFormatContext *s) if (!(st = avformat_new_stream(s, NULL))) return AVERROR(ENOMEM); - if ((ret = avio_read(pb, buf, BRP_STREAM_HEADER_SIZE)) < 0) + ret = ffio_read_size(pb, buf, BRP_STREAM_HEADER_SIZE); + if (ret < 0) return ret; - else if (ret != BRP_STREAM_HEADER_SIZE) - return AVERROR(EIO); hdr->codec_id = AV_RL32(buf + 0); hdr->id = AV_RL32(buf + 4); @@ -286,10 +283,9 @@ static int argo_brp_read_header(AVFormatContext *s) av_log(s, AV_LOG_TRACE, "Searching %d blocks for BASF...", BRP_BASF_LOOKAHEAD); for (i = 0; i < BRP_BASF_LOOKAHEAD; i++) { - if ((ret = avio_read(pb, buf, BRP_BLOCK_HEADER_SIZE)) < 0) + ret = ffio_read_size(pb, buf, BRP_BLOCK_HEADER_SIZE); + if (ret < 0) return ret; - else if (ret != BRP_BLOCK_HEADER_SIZE) - return AVERROR(EIO); blk.stream_id = AV_RL32(buf + 0); blk.start_ms = AV_RL32(buf + 4); @@ -313,10 +309,9 @@ static int argo_brp_read_header(AVFormatContext *s) if (blk.size < ASF_CHUNK_HEADER_SIZE) return AVERROR_INVALIDDATA; - if ((ret = avio_read(pb, buf, ASF_CHUNK_HEADER_SIZE)) < 0) + ret = ffio_read_size(pb, buf, BRP_BLOCK_HEADER_SIZE); + if (ret < 0) return ret; - else if (ret != ASF_CHUNK_HEADER_SIZE) - return AVERROR(EIO); ff_argo_asf_parse_chunk_header(&brp->basf.ckhdr, buf); @@ -358,10 +353,9 @@ static int argo_brp_read_packet(AVFormatContext *s, AVPacket *pkt) ArgoASFChunkHeader ckhdr; int ret; - if ((ret = avio_read(s->pb, buf, BRP_BLOCK_HEADER_SIZE)) < 0) + ret = ffio_read_size(s->pb, buf, BRP_BLOCK_HEADER_SIZE); + if (ret < 0) return ret; - else if (ret != BRP_BLOCK_HEADER_SIZE) - return AVERROR(EIO); blk.stream_id = AV_RL32(buf + 0); blk.start_ms = AV_RL32(buf + 4); @@ -380,8 +374,9 @@ static int argo_brp_read_packet(AVFormatContext *s, AVPacket *pkt) if (blk.size < ASF_CHUNK_HEADER_SIZE) return AVERROR_INVALIDDATA; - if (avio_read(s->pb, buf, ASF_CHUNK_HEADER_SIZE) != ASF_CHUNK_HEADER_SIZE) - return AVERROR_INVALIDDATA; + ret = ffio_read_size(s->pb, buf, ASF_CHUNK_HEADER_SIZE); + if (ret < 0) + return ret; ff_argo_asf_parse_chunk_header(&ckhdr, buf); diff --git a/libavformat/flacdec.c b/libavformat/flacdec.c index 1c18556c3d..fc90c01ddf 100644 --- a/libavformat/flacdec.c +++ b/libavformat/flacdec.c @@ -25,6 +25,7 @@ #include "libavcodec/bytestream.h" #include "libavcodec/flac.h" #include "avformat.h" +#include "avio_internal.h" #include "demux.h" #include "flac_picture.h" #include "internal.h" @@ -100,11 +101,9 @@ static int flac_read_header(AVFormatContext *s) if (!buffer) { return AVERROR(ENOMEM); } - ret = avio_read(s->pb, buffer, metadata_size); + ret = ffio_read_size(s->pb, buffer, metadata_size); if (ret < 0) { RETURN_ERROR(ret); - } else if (ret != metadata_size) { - RETURN_ERROR(AVERROR_EOF); } break; /* skip metadata block for unsupported types */ diff --git a/libavformat/ilbc.c b/libavformat/ilbc.c index 6c441c21bf..8f0cd3ffff 100644 --- a/libavformat/ilbc.c +++ b/libavformat/ilbc.c @@ -22,6 +22,7 @@ #include "config_components.h" #include "avformat.h" +#include "avio_internal.h" #include "demux.h" #include "internal.h" #include "mux.h" @@ -60,9 +61,11 @@ static int ilbc_read_header(AVFormatContext *s) AVIOContext *pb = s->pb; AVStream *st; uint8_t header[9]; + int ret; - if (avio_read(pb, header, 9) != 9) - return AVERROR_INVALIDDATA; + ret = ffio_read_size(pb, header, 9); + if (ret < 0) + return ret; st = avformat_new_stream(s, NULL); if (!st) diff --git a/libavformat/ipmovie.c b/libavformat/ipmovie.c index 3701be276f..5a8abde842 100644 --- a/libavformat/ipmovie.c +++ b/libavformat/ipmovie.c @@ -35,6 +35,7 @@ #include "libavutil/channel_layout.h" #include "libavutil/intreadwrite.h" #include "avformat.h" +#include "avio_internal.h" #include "demux.h" #include "internal.h" @@ -611,11 +612,13 @@ static int ipmovie_read_header(AVFormatContext *s) unsigned char chunk_preamble[CHUNK_PREAMBLE_SIZE]; int chunk_type, i; uint8_t signature_buffer[sizeof(signature)]; + int ret; ipmovie->avf = s; - if (avio_read(pb, signature_buffer, sizeof(signature_buffer)) != sizeof(signature_buffer)) - return AVERROR_INVALIDDATA; + ret = ffio_read_size(pb, signature_buffer, sizeof(signature_buffer)); + if (ret < 0) + return ret; while (memcmp(signature_buffer, signature, sizeof(signature))) { memmove(signature_buffer, signature_buffer + 1, sizeof(signature_buffer) - 1); signature_buffer[sizeof(signature_buffer) - 1] = avio_r8(pb); diff --git a/libavformat/mm.c b/libavformat/mm.c index 13717b3254..4e69da0519 100644 --- a/libavformat/mm.c +++ b/libavformat/mm.c @@ -34,6 +34,7 @@ #include "libavutil/channel_layout.h" #include "libavutil/intreadwrite.h" #include "avformat.h" +#include "avio_internal.h" #include "demux.h" #include "internal.h" @@ -144,8 +145,9 @@ static int read_packet(AVFormatContext *s, if (avio_feof(pb)) return AVERROR_EOF; - if (avio_read(pb, preamble, MM_PREAMBLE_SIZE) != MM_PREAMBLE_SIZE) - return AVERROR(EIO); + ret = ffio_read_size(pb, preamble, MM_PREAMBLE_SIZE); + if (ret < 0) + return ret; type = AV_RL16(&preamble[0]); length = AV_RL16(&preamble[2]); @@ -163,8 +165,9 @@ static int read_packet(AVFormatContext *s, if ((ret = av_new_packet(pkt, length + MM_PREAMBLE_SIZE)) < 0) return ret; memcpy(pkt->data, preamble, MM_PREAMBLE_SIZE); - if (avio_read(pb, pkt->data + MM_PREAMBLE_SIZE, length) != length) - return AVERROR(EIO); + ret = ffio_read_size(pb, pkt->data + MM_PREAMBLE_SIZE, length); + if (ret < 0) + return ret; pkt->size = length + MM_PREAMBLE_SIZE; pkt->stream_index = 0; if (type!=MM_TYPE_PALETTE) diff --git a/libavformat/mpeg.c b/libavformat/mpeg.c index 4d732aaf86..a7a2ef78e6 100644 --- a/libavformat/mpeg.c +++ b/libavformat/mpeg.c @@ -566,9 +566,9 @@ redo: static const unsigned char avs_seqh[4] = { 0, 0, 1, 0xb0 }; unsigned char buf[8]; - ret = avio_read(s->pb, buf, 8); - if (ret != 8) - return AVERROR_INVALIDDATA; + ret = ffio_read_size(s->pb, buf, 8); + if (ret < 0) + return ret; avio_seek(s->pb, -8, SEEK_CUR); if (!memcmp(buf, avs_seqh, 4) && (buf[6] != 0 || buf[7] != 1)) codec_id = AV_CODEC_ID_CAVS; diff --git a/libavformat/mxfdec.c b/libavformat/mxfdec.c index 1978b2cec5..0eed13d850 100644 --- a/libavformat/mxfdec.c +++ b/libavformat/mxfdec.c @@ -62,6 +62,7 @@ #include "libavutil/opt.h" #include "avformat.h" #include "avlanguage.h" +#include "avio_internal.h" #include "demux.h" #include "internal.h" #include "mxf.h" @@ -659,6 +660,7 @@ static int mxf_decrypt_triplet(AVFormatContext *s, AVPacket *pkt, KLVPacket *klv uint64_t plaintext_size; uint8_t ivec[16]; uint8_t tmpbuf[16]; + int ret; int index; int body_sid; @@ -696,8 +698,9 @@ static int mxf_decrypt_triplet(AVFormatContext *s, AVPacket *pkt, KLVPacket *klv if (size < 32 || size - 32 < orig_size || (int)orig_size != orig_size) return AVERROR_INVALIDDATA; avio_read(pb, ivec, 16); - if (avio_read(pb, tmpbuf, 16) != 16) - return AVERROR_INVALIDDATA; + ret = ffio_read_size(pb, tmpbuf, 16); + if (ret < 16) + return ret; if (mxf->aesc) av_aes_crypt(mxf->aesc, tmpbuf, tmpbuf, 1, ivec, 1); if (memcmp(tmpbuf, checkv, 16)) @@ -753,6 +756,7 @@ static int mxf_read_partition_pack(void *arg, AVIOContext *pb, int tag, int size uint64_t footer_partition; uint32_t nb_essence_containers; uint64_t this_partition; + int ret; if (mxf->partitions_count >= INT_MAX / 2) return AVERROR_INVALIDDATA; @@ -818,9 +822,10 @@ static int mxf_read_partition_pack(void *arg, AVIOContext *pb, int tag, int size if (partition->body_offset < 0) return AVERROR_INVALIDDATA; - if (avio_read(pb, op, sizeof(UID)) != sizeof(UID)) { + ret = ffio_read_size(pb, op, sizeof(UID)); + if (ret < 0) { av_log(mxf->fc, AV_LOG_ERROR, "Failed reading UID\n"); - return AVERROR_INVALIDDATA; + return ret; } nb_essence_containers = avio_rb32(pb); @@ -1552,12 +1557,14 @@ static int mxf_read_indirect_value(void *arg, AVIOContext *pb, int size) { MXFTaggedValue *tagged_value = arg; uint8_t key[17]; + int ret; if (size <= 17) return 0; - if (avio_read(pb, key, 17) != 17) - return AVERROR_INVALIDDATA; + ret = ffio_read_size(pb, key, 17); + if (ret < 0) + return ret; /* TODO: handle other types of of indirect values */ if (memcmp(key, mxf_indirect_value_utf16le, 17) == 0) { return mxf_read_utf16le_string(pb, size - 17, &tagged_value->value); diff --git a/libavformat/qcp.c b/libavformat/qcp.c index 13a479a11e..288e321e89 100644 --- a/libavformat/qcp.c +++ b/libavformat/qcp.c @@ -30,6 +30,7 @@ #include "libavutil/channel_layout.h" #include "libavutil/intreadwrite.h" #include "avformat.h" +#include "avio_internal.h" #include "demux.h" #include "riff.h" @@ -94,6 +95,7 @@ static int qcp_read_header(AVFormatContext *s) QCPContext *c = s->priv_data; AVStream *st = avformat_new_stream(s, NULL); uint8_t buf[16]; + int ret; int i; unsigned nb_rates; @@ -105,8 +107,9 @@ static int qcp_read_header(AVFormatContext *s) st->codecpar->codec_type = AVMEDIA_TYPE_AUDIO; st->codecpar->ch_layout = (AVChannelLayout)AV_CHANNEL_LAYOUT_MONO; - if (avio_read(pb, buf, 16) != 16) - return AVERROR_INVALIDDATA; + ret = ffio_read_size(pb, buf, 16); + if (ret < 0) + return ret; if (is_qcelp_13k_guid(buf)) { st->codecpar->codec_id = AV_CODEC_ID_QCELP; } else if (!memcmp(buf, guid_evrc, 16)) { diff --git a/libavformat/rmdec.c b/libavformat/rmdec.c index 793b29bd18..85643a358f 100644 --- a/libavformat/rmdec.c +++ b/libavformat/rmdec.c @@ -188,8 +188,9 @@ static int rm_read_audio_stream_info(AVFormatContext *s, AVIOContext *pb, st->codecpar->ch_layout.nb_channels = avio_rb16(pb); if (version == 5) { ast->deint_id = avio_rl32(pb); - if (avio_read(pb, buf, 4) != 4) - return AVERROR_INVALIDDATA; + ret = ffio_read_size(pb, buf, 4); + if (ret < 0) + return ret; buf[4] = 0; } else { AV_WL32(buf, 0); @@ -816,10 +817,11 @@ static int rm_assemble_video_frame(AVFormatContext *s, AVIOContext *pb, pkt->data[0] = 0; AV_WL32(pkt->data + 1, 1); AV_WL32(pkt->data + 5, 0); - if ((ret = avio_read(pb, pkt->data + 9, len)) != len) { + ret = ffio_read_size(pb, pkt->data + 9, len); + if (ret < 0) { av_packet_unref(pkt); av_log(s, AV_LOG_ERROR, "Failed to read %d bytes\n", len); - return ret < 0 ? ret : AVERROR(EIO); + return ret; } return 0; } @@ -856,8 +858,9 @@ static int rm_assemble_video_frame(AVFormatContext *s, AVIOContext *pb, av_log(s, AV_LOG_ERROR, "outside videobufsize\n"); return 1; } - if (avio_read(pb, vst->pkt.data + vst->videobufpos, len) != len) - return AVERROR(EIO); + ret = ffio_read_size(pb, vst->pkt.data + vst->videobufpos, len); + if (ret < 0) + return ret; vst->videobufpos += len; rm->remaining_len-= len; diff --git a/libavformat/takdec.c b/libavformat/takdec.c index e6de269b05..b8f76aaa67 100644 --- a/libavformat/takdec.c +++ b/libavformat/takdec.c @@ -96,10 +96,10 @@ static int tak_read_header(AVFormatContext *s) memset(buffer + size - 3, 0, AV_INPUT_BUFFER_PADDING_SIZE); ffio_init_checksum(pb, tak_check_crc, 0xCE04B7U); - ret = avio_read(pb, buffer, size - 3); - if (ret != size - 3) { + ret = ffio_read_size(pb, buffer, size - 3); + if (ret < 0) { av_freep(&buffer); - return ret < 0 ? ret : AVERROR_INVALIDDATA; + return ret; } if (ffio_get_checksum(s->pb) != avio_rb24(pb)) { av_log(s, AV_LOG_ERROR, "%d metadata block CRC error.\n", type); @@ -117,9 +117,9 @@ static int tak_read_header(AVFormatContext *s) if (size != 19) return AVERROR_INVALIDDATA; ffio_init_checksum(pb, tak_check_crc, 0xCE04B7U); - ret = avio_read(pb, md5, 16); - if (ret != 16) - return ret < 0 ? ret : AVERROR_INVALIDDATA; + ret = ffio_read_size(pb, md5, 16); + if (ret < 0) + return ret; if (ffio_get_checksum(s->pb) != avio_rb24(pb)) { av_log(s, AV_LOG_ERROR, "MD5 metadata block CRC error.\n"); if (s->error_recognition & AV_EF_EXPLODE) diff --git a/libavformat/vividas.c b/libavformat/vividas.c index bec4ad7cec..dd25539201 100644 --- a/libavformat/vividas.c +++ b/libavformat/vividas.c @@ -567,8 +567,9 @@ static int viv_read_header(AVFormatContext *s) v = avio_r8(pb); avio_seek(pb, v, SEEK_CUR); - if (avio_read(pb, keybuffer, 187) != 187) - return AVERROR_INVALIDDATA; + ret = ffio_read_size(pb, keybuffer, 187); + if (ret < 0) + return ret; key = decode_key(keybuffer); viv->sb_key = key; diff --git a/libavformat/vqf.c b/libavformat/vqf.c index fbe54739cd..053720ea22 100644 --- a/libavformat/vqf.c +++ b/libavformat/vqf.c @@ -20,6 +20,7 @@ */ #include "avformat.h" +#include "avio_internal.h" #include "demux.h" #include "internal.h" #include "libavutil/intreadwrite.h" @@ -65,10 +66,10 @@ static int add_metadata(AVFormatContext *s, uint32_t tag, if (!buf) return AVERROR(ENOMEM); - ret = avio_read(s->pb, buf, len); - if (ret < 0 || ret != len) { + ret = ffio_read_size(s->pb, buf, len); + if (ret < 0) { av_free(buf); - return ret < 0 ? ret : AVERROR_INVALIDDATA; + return ret; } buf[len] = 0; AV_WL32(key, tag); @@ -259,11 +260,9 @@ static int vqf_read_packet(AVFormatContext *s, AVPacket *pkt) pkt->data[0] = 8 - c->remaining_bits; // Number of bits to skip pkt->data[1] = c->last_frame_bits; - ret = avio_read(s->pb, pkt->data+2, size); - - if (ret != size) { - return AVERROR(EIO); - } + ret = ffio_read_size(s->pb, pkt->data + 2, size); + if (ret < 0) + return ret; c->last_frame_bits = pkt->data[size+1]; c->remaining_bits = (size << 3) - c->frame_bit_len + c->remaining_bits; diff --git a/libavformat/wavdec.c b/libavformat/wavdec.c index ae6ff0e022..dc7e49abc4 100644 --- a/libavformat/wavdec.c +++ b/libavformat/wavdec.c @@ -872,9 +872,12 @@ static int w64_read_header(AVFormatContext *s) WAVDemuxContext *wav = s->priv_data; AVStream *st; uint8_t guid[16]; - int ret; + int ret = ffio_read_size(pb, guid, 16); + + if (ret < 0) + return ret; - if (avio_read(pb, guid, 16) != 16 || memcmp(guid, ff_w64_guid_riff, 16)) + if (memcmp(guid, ff_w64_guid_riff, 16)) return AVERROR_INVALIDDATA; /* riff + wave + fmt + sizes */ diff --git a/libavformat/wtvdec.c b/libavformat/wtvdec.c index 21c9649869..9d26e35e22 100644 --- a/libavformat/wtvdec.c +++ b/libavformat/wtvdec.c @@ -34,6 +34,7 @@ #include "libavutil/mem.h" #include "libavutil/time_internal.h" #include "avformat.h" +#include "avio_internal.h" #include "demux.h" #include "internal.h" #include "wtv.h" @@ -774,6 +775,7 @@ static int parse_chunks(AVFormatContext *s, int mode, int64_t seekts, int *len_p { WtvContext *wtv = s->priv_data; AVIOContext *pb = wtv->pb; + int ret; while (!avio_feof(pb)) { ff_asf_guid g; int len, sid, consumed; @@ -846,8 +848,9 @@ static int parse_chunks(AVFormatContext *s, int mode, int64_t seekts, int *len_p } buf_size = FFMIN(len - consumed, sizeof(buf)); - if (avio_read(pb, buf, buf_size) != buf_size) - return AVERROR_INVALIDDATA; + ret = ffio_read_size(pb, buf, buf_size); + if (ret < 0) + return ret; consumed += buf_size; ff_parse_mpeg2_descriptor(s, st, 0, &pbuf, buf + buf_size, NULL, 0, 0, NULL); } -- 2.45.2
_______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".