PR #20929 opened by James Almer (jamrial) URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/20929 Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/20929.patch
Demuxers should not generate this error code when they encounter truncated or otherwise invalid files. It's an error code the underlying protocol should generate when there are legitimate reading errors. >From 5f7debca6029e184bb5e1a65f890de98cc4f7c83 Mon Sep 17 00:00:00 2001 From: James Almer <[email protected]> Date: Sat, 15 Nov 2025 15:21:25 -0300 Subject: [PATCH 1/2] avformat: don't return EIO errors on invalid data Demuxers should not generate this error code when they encounter truncated or otherwise invalid files. It's a code the underlying protocol should generate when there are legitimate reading errors. Signed-off-by: James Almer <[email protected]> --- libavformat/4xm.c | 8 +++++--- libavformat/aacdec.c | 4 ++-- libavformat/aaxdec.c | 7 ++++--- libavformat/adxdec.c | 2 +- libavformat/aiffdec.c | 2 +- libavformat/alp.c | 5 ++--- libavformat/apc.c | 7 +++++-- libavformat/ape.c | 2 +- libavformat/apm.c | 5 ++--- libavformat/argo_asf.c | 9 +++------ libavformat/argo_cvg.c | 9 +++------ libavformat/avs.c | 16 +++++++-------- libavformat/bethsoftvid.c | 21 +++++++++---------- libavformat/bfi.c | 2 +- libavformat/bink.c | 14 ++++++------- libavformat/binka.c | 2 +- libavformat/bintext.c | 39 ++++++++++++++++++------------------ libavformat/bit.c | 5 ++--- libavformat/bmv.c | 5 +++-- libavformat/brstm.c | 9 +++++---- libavformat/c93.c | 13 ++++++------ libavformat/cafdec.c | 11 +++++----- libavformat/cinedec.c | 2 +- libavformat/dfa.c | 4 ++-- libavformat/dsicin.c | 2 +- libavformat/dss.c | 7 +++++-- libavformat/dv.c | 14 +++++++------ libavformat/dxa.c | 10 ++++----- libavformat/electronicarts.c | 2 +- libavformat/filmstripdec.c | 2 +- libavformat/flic.c | 25 +++++++++-------------- libavformat/gifdec.c | 2 +- libavformat/gsmdec.c | 2 +- libavformat/hca.c | 7 ++++--- libavformat/icoenc.c | 2 +- libavformat/idcin.c | 6 +++--- libavformat/idroqdec.c | 29 ++++++++++++--------------- libavformat/iff.c | 10 +++++---- libavformat/img2dec.c | 9 ++++----- libavformat/img2enc.c | 3 +-- libavformat/ingenientdec.c | 2 +- libavformat/ipmovie.c | 7 +++---- libavformat/iss.c | 2 +- libavformat/jvdec.c | 2 +- libavformat/libmodplug.c | 2 +- libavformat/lmlm4.c | 2 +- libavformat/mca.c | 2 +- libavformat/mgsts.c | 4 ++-- libavformat/mlvdec.c | 4 ++-- libavformat/mmst.c | 8 ++++---- libavformat/mpc.c | 2 +- libavformat/mtv.c | 5 +++-- libavformat/mvdec.c | 4 ++-- libavformat/mvi.c | 2 +- libavformat/ncdec.c | 4 ++-- libavformat/nuv.c | 2 +- libavformat/pdvdec.c | 2 +- libavformat/pp_bnk.c | 7 +++---- libavformat/psxstr.c | 17 ++++++++-------- libavformat/pva.c | 10 ++++----- libavformat/qoadec.c | 6 +++--- libavformat/redspark.c | 2 +- libavformat/rl2.c | 2 +- libavformat/rmdec.c | 6 +++--- libavformat/rpl.c | 18 ++++++++++------- libavformat/segafilm.c | 24 ++++++++++++---------- libavformat/sierravmd.c | 19 +++++++----------- libavformat/siff.c | 4 ++-- libavformat/smush.c | 2 +- libavformat/soxdec.c | 6 ++++-- libavformat/swfdec.c | 4 ++-- libavformat/thp.c | 4 ++-- libavformat/tiertexseq.c | 13 +++++++----- libavformat/ty.c | 2 +- libavformat/vc1test.c | 2 +- libavformat/vividas.c | 12 +++++------ libavformat/voc_packet.c | 2 +- libavformat/vpk.c | 7 ++++--- libavformat/wavarc.c | 4 ++-- libavformat/wc3movie.c | 15 +++++++------- libavformat/westwood_aud.c | 17 ++++++++-------- libavformat/westwood_vqa.c | 18 ++++++++--------- libavformat/wsddec.c | 6 ++++-- libavformat/wtvdec.c | 2 +- libavformat/wvdec.c | 7 ++++--- libavformat/xmv.c | 19 +++++++++--------- libavformat/yuv4mpegdec.c | 2 +- libavformat/yuv4mpegenc.c | 2 +- 88 files changed, 330 insertions(+), 322 deletions(-) diff --git a/libavformat/4xm.c b/libavformat/4xm.c index 218ea837c5..686e1db4be 100644 --- a/libavformat/4xm.c +++ b/libavformat/4xm.c @@ -32,6 +32,7 @@ #include "libavutil/mem.h" #include "libavcodec/internal.h" #include "avformat.h" +#include "avio_internal.h" #include "demux.h" #include "internal.h" @@ -239,9 +240,10 @@ static int fourxm_read_header(AVFormatContext *s) header = av_malloc(header_size); if (!header) return AVERROR(ENOMEM); - if (avio_read(pb, header, header_size) != header_size) { + ret = ffio_read_size(pb, header, header_size); + if (ret < 0) { av_free(header); - return AVERROR(EIO); + return ret; } /* take the lazy approach and search for any and all vtrk and strk chunks */ @@ -312,7 +314,7 @@ static int fourxm_read_packet(AVFormatContext *s, fourcc_tag = AV_RL32(&header[0]); size = AV_RL32(&header[4]); if (avio_feof(pb)) - return AVERROR(EIO); + return AVERROR_INVALIDDATA; switch (fourcc_tag) { case LIST_TAG: /* this is a good time to bump the video pts */ diff --git a/libavformat/aacdec.c b/libavformat/aacdec.c index 38ac9dcbe7..fef3c69f0b 100644 --- a/libavformat/aacdec.c +++ b/libavformat/aacdec.c @@ -175,7 +175,7 @@ retry: return ret; if (ret < ADTS_HEADER_SIZE) - return AVERROR(EIO); + return AVERROR_INVALIDDATA; if ((AV_RB16(pkt->data) >> 4) != 0xfff) { // Parse all the ID3 headers between frames @@ -184,7 +184,7 @@ retry: av_assert2(append > 0); ret = av_append_packet(s->pb, pkt, append); if (ret != append) - return AVERROR(EIO); + return AVERROR_INVALIDDATA; if (!ff_id3v2_match(pkt->data, ID3v2_DEFAULT_MAGIC)) { av_packet_unref(pkt); ret = adts_aac_resync(s); diff --git a/libavformat/aaxdec.c b/libavformat/aaxdec.c index 40a088a35b..9926be0f4b 100644 --- a/libavformat/aaxdec.c +++ b/libavformat/aaxdec.c @@ -345,9 +345,10 @@ static int aax_read_packet(AVFormatContext *s, AVPacket *pkt) extradata = av_malloc(extradata_size + AV_INPUT_BUFFER_PADDING_SIZE); if (!extradata) return AVERROR(ENOMEM); - if (avio_read(pb, extradata, extradata_size) != extradata_size) { + ret = ffio_read_size(pb, extradata, extradata_size); + if (ret < 0) { av_free(extradata); - return AVERROR(EIO); + return ret; } memset(extradata + extradata_size, 0, AV_INPUT_BUFFER_PADDING_SIZE); } @@ -356,7 +357,7 @@ static int aax_read_packet(AVFormatContext *s, AVPacket *pkt) ret = av_get_packet(pb, pkt, size); if (ret != size) { av_free(extradata); - return ret < 0 ? ret : AVERROR(EIO); + return ret < 0 ? ret : AVERROR_INVALIDDATA; } pkt->duration = 1; pkt->stream_index = 0; diff --git a/libavformat/adxdec.c b/libavformat/adxdec.c index 00b652315f..b9936799f9 100644 --- a/libavformat/adxdec.c +++ b/libavformat/adxdec.c @@ -75,7 +75,7 @@ static int adx_read_packet(AVFormatContext *s, AVPacket *pkt) av_shrink_packet(pkt, size); pkt->flags &= ~AV_PKT_FLAG_CORRUPT; } else if (ret < size) { - return AVERROR(EIO); + return AVERROR_INVALIDDATA; } else { size = ret; } diff --git a/libavformat/aiffdec.c b/libavformat/aiffdec.c index d9d580bdb5..ff47d8dc7b 100644 --- a/libavformat/aiffdec.c +++ b/libavformat/aiffdec.c @@ -60,7 +60,7 @@ static int64_t get_tag(AVIOContext *pb, uint32_t * tag) int64_t size; if (avio_feof(pb)) - return AVERROR(EIO); + return AVERROR_INVALIDDATA; *tag = avio_rl32(pb); size = avio_rb32(pb); diff --git a/libavformat/alp.c b/libavformat/alp.c index ad8e160223..18cc636296 100644 --- a/libavformat/alp.c +++ b/libavformat/alp.c @@ -24,6 +24,7 @@ #include "libavutil/channel_layout.h" #include "avformat.h" +#include "avio_internal.h" #include "demux.h" #include "internal.h" #include "mux.h" @@ -90,10 +91,8 @@ static int alp_read_header(AVFormatContext *s) return AVERROR_INVALIDDATA; } - if ((ret = avio_read(s->pb, hdr->adpcm, sizeof(hdr->adpcm))) < 0) + if ((ret = ffio_read_size(s->pb, hdr->adpcm, sizeof(hdr->adpcm))) < 0) return ret; - else if (ret != sizeof(hdr->adpcm)) - return AVERROR(EIO); if (strncmp("ADPCM", hdr->adpcm, sizeof(hdr->adpcm)) != 0) return AVERROR_INVALIDDATA; diff --git a/libavformat/apc.c b/libavformat/apc.c index d24f57d021..da3d80bb9e 100644 --- a/libavformat/apc.c +++ b/libavformat/apc.c @@ -73,8 +73,11 @@ static int apc_read_header(AVFormatContext *s) static int apc_read_packet(AVFormatContext *s, AVPacket *pkt) { - if (av_get_packet(s->pb, pkt, MAX_READ_SIZE) <= 0) - return AVERROR(EIO); + int ret = av_get_packet(s->pb, pkt, MAX_READ_SIZE); + if (ret < 0) + return ret; + else if (ret == 0) + return AVERROR_INVALIDDATA; pkt->stream_index = 0; return 0; } diff --git a/libavformat/ape.c b/libavformat/ape.c index f86ca5e894..7e6bf12961 100644 --- a/libavformat/ape.c +++ b/libavformat/ape.c @@ -395,7 +395,7 @@ static int ape_read_packet(AVFormatContext * s, AVPacket * pkt) av_log(s, AV_LOG_ERROR, "invalid packet size: %8"PRId64"\n", ape->frames[ape->currentframe].size); ape->currentframe++; - return AVERROR(EIO); + return AVERROR_INVALIDDATA; } ret = av_new_packet(pkt, ape->frames[ape->currentframe].size + extra_size); diff --git a/libavformat/apm.c b/libavformat/apm.c index b3716c1d80..76ae9fd844 100644 --- a/libavformat/apm.c +++ b/libavformat/apm.c @@ -23,6 +23,7 @@ #include "config_components.h" #include "avformat.h" +#include "avio_internal.h" #include "demux.h" #include "internal.h" #include "mux.h" @@ -153,10 +154,8 @@ static int apm_read_header(AVFormatContext *s) (int64_t)par->sample_rate * par->bits_per_coded_sample; - if ((ret = avio_read(s->pb, buf, APM_FILE_EXTRADATA_SIZE)) < 0) + if ((ret = ffio_read_size(s->pb, buf, APM_FILE_EXTRADATA_SIZE)) < 0) return ret; - else if (ret != APM_FILE_EXTRADATA_SIZE) - return AVERROR(EIO); apm_parse_extradata(&extradata, buf); diff --git a/libavformat/argo_asf.c b/libavformat/argo_asf.c index e08f029f80..116367516a 100644 --- a/libavformat/argo_asf.c +++ b/libavformat/argo_asf.c @@ -24,6 +24,7 @@ #include "libavutil/avstring.h" #include "avformat.h" +#include "avio_internal.h" #include "demux.h" #include "internal.h" #include "mux.h" @@ -188,10 +189,8 @@ static int argo_asf_read_header(AVFormatContext *s) if (!(st = avformat_new_stream(s, NULL))) return AVERROR(ENOMEM); - if ((ret = avio_read(pb, buf, ASF_FILE_HEADER_SIZE)) < 0) + if ((ret = ffio_read_size(pb, buf, ASF_FILE_HEADER_SIZE)) < 0) return ret; - else if (ret != ASF_FILE_HEADER_SIZE) - return AVERROR(EIO); ff_argo_asf_parse_file_header(&asf->fhdr, buf); @@ -205,10 +204,8 @@ static int argo_asf_read_header(AVFormatContext *s) if ((ret = avio_skip(pb, asf->fhdr.chunk_offset - ASF_FILE_HEADER_SIZE)) < 0) return ret; - if ((ret = avio_read(pb, buf, ASF_CHUNK_HEADER_SIZE)) < 0) + if ((ret = ffio_read_size(pb, buf, ASF_CHUNK_HEADER_SIZE)) < 0) return ret; - else if (ret != ASF_CHUNK_HEADER_SIZE) - return AVERROR(EIO); ff_argo_asf_parse_chunk_header(&asf->ckhdr, buf); diff --git a/libavformat/argo_cvg.c b/libavformat/argo_cvg.c index 03ae6fa59e..932ec8b966 100644 --- a/libavformat/argo_cvg.c +++ b/libavformat/argo_cvg.c @@ -25,6 +25,7 @@ #include "libavutil/avstring.h" #include "libavutil/channel_layout.h" #include "avformat.h" +#include "avio_internal.h" #include "demux.h" #include "internal.h" #include "mux.h" @@ -139,10 +140,8 @@ static int argo_cvg_read_checksum(AVIOContext *pb, const ArgoCVGHeader *cvg, uin return ret; /* NB: Not using avio_rl32() because no error checking. */ - if ((ret = avio_read(pb, buf, sizeof(buf))) < 0) + if ((ret = ffio_read_size(pb, buf, sizeof(buf))) < 0) return ret; - else if (ret != sizeof(buf)) - return AVERROR(EIO); if ((ret = avio_seek(pb, ARGO_CVG_HEADER_SIZE, SEEK_SET)) < 0) return ret; @@ -163,10 +162,8 @@ static int argo_cvg_read_header(AVFormatContext *s) if (!(st = avformat_new_stream(s, NULL))) return AVERROR(ENOMEM); - if ((ret = avio_read(s->pb, buf, ARGO_CVG_HEADER_SIZE)) < 0) + if ((ret = ffio_read_size(s->pb, buf, ARGO_CVG_HEADER_SIZE)) < 0) return ret; - else if (ret != ARGO_CVG_HEADER_SIZE) - return AVERROR(EIO); ctx->header.size = AV_RL32(buf + 0); ctx->header.loop = AV_RL32(buf + 4); diff --git a/libavformat/avs.c b/libavformat/avs.c index 3cd814836b..84cd1267e6 100644 --- a/libavformat/avs.c +++ b/libavformat/avs.c @@ -26,6 +26,7 @@ */ #include "avformat.h" +#include "avio_internal.h" #include "demux.h" #include "voc.h" @@ -113,10 +114,9 @@ avs_read_video_packet(AVFormatContext * s, AVPacket * pkt, pkt->data[palette_size + 1] = type; pkt->data[palette_size + 2] = size & 0xFF; pkt->data[palette_size + 3] = (size >> 8) & 0xFF; - ret = avio_read(s->pb, pkt->data + palette_size + 4, size - 4) + 4; - if (ret < size) { - return AVERROR(EIO); - } + ret = ffio_read_size(s->pb, pkt->data + palette_size + 4, size - 4) + 4; + if (ret < 0) + return ret; pkt->size = ret + palette_size; pkt->stream_index = avs->st_video->index; @@ -168,7 +168,7 @@ static int avs_read_packet(AVFormatContext * s, AVPacket * pkt) while (1) { if (avs->remaining_frame_size <= 0) { if (!avio_rl16(s->pb)) /* found EOF */ - return AVERROR(EIO); + return AVERROR_INVALIDDATA; avs->remaining_frame_size = avio_rl16(s->pb) - 4; } @@ -184,9 +184,9 @@ static int avs_read_packet(AVFormatContext * s, AVPacket * pkt) case AVS_PALETTE: if (size - 4 > sizeof(palette)) return AVERROR_INVALIDDATA; - ret = avio_read(s->pb, palette, size - 4); - if (ret < size - 4) - return AVERROR(EIO); + ret = ffio_read_size(s->pb, palette, size - 4); + if (ret < 0) + return ret; palette_size = size; break; diff --git a/libavformat/bethsoftvid.c b/libavformat/bethsoftvid.c index e3c4758f30..f118f668f1 100644 --- a/libavformat/bethsoftvid.c +++ b/libavformat/bethsoftvid.c @@ -32,6 +32,7 @@ #include "libavutil/intreadwrite.h" #include "libavutil/mem.h" #include "avformat.h" +#include "avio_internal.h" #include "demux.h" #include "internal.h" #include "libavcodec/bethsoftvideo.h" @@ -147,10 +148,9 @@ static int read_frame(BVID_DemuxContext *vid, AVIOContext *pb, AVPacket *pkt, // set the y offset if it exists (decoder header data should be in data section) if(block_type == VIDEO_YOFF_P_FRAME){ - if (avio_read(pb, &vidbuf_start[vidbuf_nbytes], 2) != 2) { - ret = AVERROR(EIO); + ret = ffio_read_size(pb, &vidbuf_start[vidbuf_nbytes], 2); + if (ret < 0) goto fail; - } vidbuf_nbytes += 2; } @@ -170,10 +170,9 @@ static int read_frame(BVID_DemuxContext *vid, AVIOContext *pb, AVPacket *pkt, if(block_type == VIDEO_I_FRAME) vidbuf_start[vidbuf_nbytes++] = avio_r8(pb); } else if(code){ // plain sequence - if (avio_read(pb, &vidbuf_start[vidbuf_nbytes], code) != code) { - ret = AVERROR(EIO); + ret = ffio_read_size(pb, &vidbuf_start[vidbuf_nbytes], code); + if (ret < 0) goto fail; - } vidbuf_nbytes += code; } bytes_copied += code & 0x7F; @@ -238,9 +237,9 @@ static int vid_read_packet(AVFormatContext *s, av_log(s, AV_LOG_WARNING, "discarding unused palette\n"); vid->has_palette = 0; } - if (avio_read(pb, vid->palette, BVID_PALETTE_SIZE) != BVID_PALETTE_SIZE) { - return AVERROR(EIO); - } + ret_value = ffio_read_size(pb, vid->palette, BVID_PALETTE_SIZE); + if (ret_value < 0) + return ret_value; vid->has_palette = 1; return vid_read_packet(s, pkt); @@ -268,7 +267,7 @@ static int vid_read_packet(AVFormatContext *s, if (ret_value < 0) return ret_value; av_log(s, AV_LOG_ERROR, "incomplete audio block\n"); - return AVERROR(EIO); + return AVERROR_INVALIDDATA; } pkt->stream_index = vid->audio_index; pkt->duration = audio_length; @@ -284,7 +283,7 @@ static int vid_read_packet(AVFormatContext *s, if(vid->nframes != 0) av_log(s, AV_LOG_VERBOSE, "reached terminating character but not all frames read.\n"); vid->is_finished = 1; - return AVERROR(EIO); + return AVERROR_INVALIDDATA; default: av_log(s, AV_LOG_ERROR, "unknown block (character = %c, decimal = %d, hex = %x)!!!\n", block_type, block_type, block_type); diff --git a/libavformat/bfi.c b/libavformat/bfi.c index 06bf5d2c17..e6ae726404 100644 --- a/libavformat/bfi.c +++ b/libavformat/bfi.c @@ -131,7 +131,7 @@ static int bfi_read_packet(AVFormatContext * s, AVPacket * pkt) uint32_t state = 0; while(state != MKTAG('S','A','V','I')){ if (avio_feof(pb)) - return AVERROR(EIO); + return AVERROR_INVALIDDATA; state = 256*state + avio_r8(pb); } /* Now that the chunk's location is confirmed, we proceed... */ diff --git a/libavformat/bink.c b/libavformat/bink.c index 0632d390a2..18eaeba738 100644 --- a/libavformat/bink.c +++ b/libavformat/bink.c @@ -120,13 +120,13 @@ static int read_header(AVFormatContext *s) if (vst->duration > 1000000) { av_log(s, AV_LOG_ERROR, "invalid header: more than 1000000 frames\n"); - return AVERROR(EIO); + return AVERROR_INVALIDDATA; } if (avio_rl32(pb) > bink->file_size) { av_log(s, AV_LOG_ERROR, "invalid header: largest frame size greater than file size\n"); - return AVERROR(EIO); + return AVERROR_INVALIDDATA; } avio_skip(pb, 4); @@ -140,7 +140,7 @@ static int read_header(AVFormatContext *s) av_log(s, AV_LOG_ERROR, "invalid header: invalid fps (%"PRIu32"/%"PRIu32")\n", fps_num, fps_den); - return AVERROR(EIO); + return AVERROR_INVALIDDATA; } avpriv_set_pts_info(vst, 64, fps_den, fps_num); vst->avg_frame_rate = av_inv_q(vst->time_base); @@ -162,7 +162,7 @@ static int read_header(AVFormatContext *s) av_log(s, AV_LOG_ERROR, "invalid header: more than "AV_STRINGIFY(BINK_MAX_AUDIO_TRACKS)" audio tracks (%"PRIu32")\n", bink->num_audio_tracks); - return AVERROR(EIO); + return AVERROR_INVALIDDATA; } signature = (vst->codecpar->codec_tag & 0xFFFFFF); @@ -217,7 +217,7 @@ static int read_header(AVFormatContext *s) if (next_pos <= pos) { av_log(s, AV_LOG_ERROR, "invalid frame index table\n"); - return AVERROR(EIO); + return AVERROR_INVALIDDATA; } if ((ret = av_add_index_entry(vst, pos, i, next_pos - pos, 0, keyframe ? AVINDEX_KEYFRAME : 0)) < 0) @@ -253,7 +253,7 @@ static int read_packet(AVFormatContext *s, AVPacket *pkt) av_log(s, AV_LOG_ERROR, "could not find index entry for frame %"PRId64"\n", bink->video_pts); - return AVERROR(EIO); + return AVERROR_INVALIDDATA; } bink->remain_packet_size = sti->index_entries[index_entry].size; @@ -267,7 +267,7 @@ static int read_packet(AVFormatContext *s, AVPacket *pkt) av_log(s, AV_LOG_ERROR, "frame %"PRId64": audio size in header (%"PRIu32") > size of packet left (%"PRIu32")\n", bink->video_pts, audio_size, bink->remain_packet_size); - return AVERROR(EIO); + return AVERROR_INVALIDDATA; } bink->remain_packet_size -= 4 + audio_size; bink->current_track++; diff --git a/libavformat/binka.c b/libavformat/binka.c index cc5f2555ca..df853890c1 100644 --- a/libavformat/binka.c +++ b/libavformat/binka.c @@ -75,7 +75,7 @@ static int binka_read_packet(AVFormatContext *s, AVPacket *pkt) avio_skip(pb, 2); pkt_size = avio_rl16(pb) + 4; if (pkt_size <= 4) - return AVERROR(EIO); + return AVERROR_INVALIDDATA; ret = av_new_packet(pkt, pkt_size); if (ret < 0) return ret; diff --git a/libavformat/bintext.c b/libavformat/bintext.c index c96c14ccd9..5439323cb3 100644 --- a/libavformat/bintext.c +++ b/libavformat/bintext.c @@ -36,6 +36,7 @@ #include "libavutil/opt.h" #include "libavutil/parseutils.h" #include "avformat.h" +#include "avio_internal.h" #include "demux.h" #include "internal.h" #include "sauce.h" @@ -99,8 +100,8 @@ static int next_tag_read(AVFormatContext *avctx, uint64_t *fsize) return AVERROR_INVALIDDATA; avio_seek(pb, start_pos - 256, SEEK_SET); - if (avio_read(pb, buf, sizeof(next_magic)) != sizeof(next_magic)) - return -1; + if ((len = ffio_read_size(pb, buf, sizeof(next_magic))) < 0) + return len; if (memcmp(buf, next_magic, sizeof(next_magic))) return -1; if (avio_r8(pb) != 0x01) @@ -244,8 +245,8 @@ static int xbin_read_header(AVFormatContext *s) return ret; st->codecpar->extradata[0] = fontheight; st->codecpar->extradata[1] = flags; - if (avio_read(pb, st->codecpar->extradata + 2, st->codecpar->extradata_size - 2) < 0) - return AVERROR(EIO); + if ((ret = ffio_read_size(pb, st->codecpar->extradata + 2, st->codecpar->extradata_size - 2)) < 0) + return ret; if (pb->seekable & AVIO_SEEKABLE_NORMAL) { int64_t fsize = avio_size(pb); @@ -281,13 +282,13 @@ static int adf_read_header(AVFormatContext *s) st->codecpar->extradata[0] = 16; st->codecpar->extradata[1] = BINTEXT_PALETTE|BINTEXT_FONT; - if (avio_read(pb, st->codecpar->extradata + 2, 24) < 0) - return AVERROR(EIO); + if ((ret = ffio_read_size(pb, st->codecpar->extradata + 2, 24)) < 0) + return ret; avio_skip(pb, 144); - if (avio_read(pb, st->codecpar->extradata + 2 + 24, 24) < 0) - return AVERROR(EIO); - if (avio_read(pb, st->codecpar->extradata + 2 + 48, 4096) < 0) - return AVERROR(EIO); + if ((ret = ffio_read_size(pb, st->codecpar->extradata + 2 + 24, 24)) < 0) + return ret; + if ((ret = ffio_read_size(pb, st->codecpar->extradata + 2 + 48, 4096)) < 0) + return ret; if (pb->seekable & AVIO_SEEKABLE_NORMAL) { int got_width = 0; @@ -330,7 +331,7 @@ static int idf_read_header(AVFormatContext *s) int64_t fsize; if (!(pb->seekable & AVIO_SEEKABLE_NORMAL)) - return AVERROR(EIO); + return AVERROR_INVALIDDATA; st = init_stream(s); if (!st) @@ -349,10 +350,10 @@ static int idf_read_header(AVFormatContext *s) avio_seek(pb, bin->fsize + 12, SEEK_SET); - if (avio_read(pb, st->codecpar->extradata + 2 + 48, 4096) < 0) - return AVERROR(EIO); - if (avio_read(pb, st->codecpar->extradata + 2, 48) < 0) - return AVERROR(EIO); + if ((ret = ffio_read_size(pb, st->codecpar->extradata + 2 + 48, 4096)) < 0) + return ret; + if ((ret = ffio_read_size(pb, st->codecpar->extradata + 2, 48)) < 0) + return ret; ff_sauce_read(s, &bin->fsize, &got_width, 0); if (st->codecpar->width < 8) @@ -371,15 +372,15 @@ static int read_packet(AVFormatContext *s, if (bin->fsize > 0) { if (av_get_packet(s->pb, pkt, bin->fsize) < 0) - return AVERROR(EIO); + return AVERROR_INVALIDDATA; bin->fsize = -1; /* done */ } else if (!bin->fsize) { if (avio_feof(s->pb)) - return AVERROR(EIO); + return AVERROR_INVALIDDATA; if (av_get_packet(s->pb, pkt, bin->chars_per_frame) < 0) - return AVERROR(EIO); + return AVERROR_INVALIDDATA; } else { - return AVERROR(EIO); + return AVERROR_INVALIDDATA; } pkt->flags |= AV_PKT_FLAG_KEY; diff --git a/libavformat/bit.c b/libavformat/bit.c index 5c3eb31c57..1f3dc31f38 100644 --- a/libavformat/bit.c +++ b/libavformat/bit.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" @@ -93,11 +94,9 @@ static int read_packet(AVFormatContext *s, if(packet_size > MAX_FRAME_SIZE) return AVERROR_INVALIDDATA; - ret = avio_read(pb, (uint8_t*)buf, (8 * packet_size) * sizeof(uint16_t)); + ret = ffio_read_size(pb, (uint8_t*)buf, (8 * packet_size) * sizeof(uint16_t)); if(ret<0) return ret; - if(ret != 8 * packet_size * sizeof(uint16_t)) - return AVERROR(EIO); if ((ret = av_new_packet(pkt, packet_size)) < 0) return ret; diff --git a/libavformat/bmv.c b/libavformat/bmv.c index 84ab2aac5a..db2b4076c0 100644 --- a/libavformat/bmv.c +++ b/libavformat/bmv.c @@ -22,6 +22,7 @@ #include "libavutil/channel_layout.h" #include "libavutil/mem.h" #include "avformat.h" +#include "avio_internal.h" #include "demux.h" #include "internal.h" @@ -88,8 +89,8 @@ static int bmv_read_packet(AVFormatContext *s, AVPacket *pkt) if ((err = av_reallocp(&c->packet, c->size + 1)) < 0) return err; c->packet[0] = type; - if (avio_read(s->pb, c->packet + 1, c->size) != c->size) - return AVERROR(EIO); + if ((err = ffio_read_size(s->pb, c->packet + 1, c->size)) < 0) + return err; if (type & BMV_AUDIO) { int audio_size = c->packet[1] * 65 + 1; if (audio_size >= c->size) { diff --git a/libavformat/brstm.c b/libavformat/brstm.c index d29004155b..3fe19fff72 100644 --- a/libavformat/brstm.c +++ b/libavformat/brstm.c @@ -23,6 +23,7 @@ #include "libavutil/mem.h" #include "libavcodec/bytestream.h" #include "avformat.h" +#include "avio_internal.h" #include "demux.h" #include "internal.h" @@ -425,11 +426,11 @@ static int read_packet(AVFormatContext *s, AVPacket *pkt) (b->current_block - 1), 4 * channels); for (i = 0; i < channels; i++) { - ret = avio_read(s->pb, dst, size); + ret = ffio_read_size(s->pb, dst, size); dst += size; avio_skip(s->pb, skip); - if (ret != size) { - return AVERROR(EIO); + if (ret < 0) { + return ret; } } pkt->duration = samples; @@ -441,7 +442,7 @@ static int read_packet(AVFormatContext *s, AVPacket *pkt) pkt->stream_index = 0; if (ret != size) - ret = AVERROR(EIO); + ret = AVERROR_INVALIDDATA; return ret; } diff --git a/libavformat/c93.c b/libavformat/c93.c index 933fe4a99e..1fbc093612 100644 --- a/libavformat/c93.c +++ b/libavformat/c93.c @@ -20,6 +20,7 @@ */ #include "avformat.h" +#include "avio_internal.h" #include "demux.h" #include "internal.h" #include "voc.h" @@ -157,9 +158,9 @@ static int read_packet(AVFormatContext *s, AVPacket *pkt) pkt->data[0] = 0; pkt->size = datasize + 1; - ret = avio_read(pb, pkt->data + 1, datasize); - if (ret < datasize) { - return AVERROR(EIO); + ret = ffio_read_size(pb, pkt->data + 1, datasize); + if (ret < 0) { + return ret; } datasize = avio_rl16(pb); /* palette size */ @@ -169,9 +170,9 @@ static int read_packet(AVFormatContext *s, AVPacket *pkt) return AVERROR_INVALIDDATA; } pkt->data[0] |= C93_HAS_PALETTE; - ret = avio_read(pb, pkt->data + pkt->size, datasize); - if (ret < datasize) { - return AVERROR(EIO); + ret = ffio_read_size(pb, pkt->data + pkt->size, datasize); + if (ret < 0) { + return ret; } pkt->size += 768; } diff --git a/libavformat/cafdec.c b/libavformat/cafdec.c index 5d7dbe8f41..99ae041364 100644 --- a/libavformat/cafdec.c +++ b/libavformat/cafdec.c @@ -28,6 +28,7 @@ #include <inttypes.h> #include "avformat.h" +#include "avio_internal.h" #include "demux.h" #include "internal.h" #include "isom.h" @@ -142,9 +143,9 @@ static int read_kuki_chunk(AVFormatContext *s, int64_t size) avio_skip(pb, size); return AVERROR_INVALIDDATA; } - if (avio_read(pb, preamble, ALAC_PREAMBLE) != ALAC_PREAMBLE) { + if ((ret = ffio_read_size(pb, preamble, ALAC_PREAMBLE)) < 0) { av_log(s, AV_LOG_ERROR, "failed to read preamble\n"); - return AVERROR_INVALIDDATA; + return ret; } if ((ret = ff_alloc_extradata(st->codecpar, ALAC_HEADER)) < 0) @@ -443,7 +444,7 @@ static int read_packet(AVFormatContext *s, AVPacket *pkt) if (!left) return AVERROR_EOF; if (left < 0) - return AVERROR(EIO); + return AVERROR_INVALIDDATA; } pkt_frames = caf->frames_per_packet; @@ -461,12 +462,12 @@ static int read_packet(AVFormatContext *s, AVPacket *pkt) pkt_size = caf->num_bytes - sti->index_entries[caf->packet_cnt].pos; pkt_frames = st->duration - sti->index_entries[caf->packet_cnt].timestamp; } else { - return AVERROR(EIO); + return AVERROR_INVALIDDATA; } } if (pkt_size == 0 || pkt_frames == 0 || pkt_size > left) - return AVERROR(EIO); + return AVERROR_INVALIDDATA; res = av_get_packet(pb, pkt, pkt_size); if (res < 0) diff --git a/libavformat/cinedec.c b/libavformat/cinedec.c index cd13f132c3..7bbf198b19 100644 --- a/libavformat/cinedec.c +++ b/libavformat/cinedec.c @@ -354,7 +354,7 @@ static int cine_read_seek(AVFormatContext *avctx, int stream_index, int64_t time return AVERROR(ENOSYS); if (!(avctx->pb->seekable & AVIO_SEEKABLE_NORMAL)) - return AVERROR(EIO); + return AVERROR(ENOSYS); cine->pts = timestamp; return 0; diff --git a/libavformat/dfa.c b/libavformat/dfa.c index 1d78c348b1..580e3ddd24 100644 --- a/libavformat/dfa.c +++ b/libavformat/dfa.c @@ -89,7 +89,7 @@ static int dfa_read_packet(AVFormatContext *s, AVPacket *pkt) return AVERROR_EOF; if (av_get_packet(pb, pkt, 12) != 12) - return AVERROR(EIO); + return AVERROR_INVALIDDATA; while (!avio_feof(pb)) { if (!first) { ret = av_append_packet(pb, pkt, 12); @@ -101,7 +101,7 @@ static int dfa_read_packet(AVFormatContext *s, AVPacket *pkt) frame_size = AV_RL32(pkt->data + pkt->size - 8); if (frame_size > INT_MAX - 4) { av_log(s, AV_LOG_ERROR, "Too large chunk size: %"PRIu32"\n", frame_size); - return AVERROR(EIO); + return AVERROR_INVALIDDATA; } if (AV_RL32(pkt->data + pkt->size - 12) == MKTAG('E', 'O', 'F', 'R')) { if (frame_size) { diff --git a/libavformat/dsicin.c b/libavformat/dsicin.c index 6eff38e010..d74197f7bb 100644 --- a/libavformat/dsicin.c +++ b/libavformat/dsicin.c @@ -153,7 +153,7 @@ static int cin_read_frame_header(CinDemuxContext *cin, AVIOContext *pb) { hdr->audio_frame_size = avio_rl32(pb); if (avio_feof(pb) || pb->error) - return AVERROR(EIO); + return AVERROR_INVALIDDATA; if (avio_rl32(pb) != 0xAA55AA55) return AVERROR_INVALIDDATA; diff --git a/libavformat/dss.c b/libavformat/dss.c index 47c8f49d67..8109f6d287 100644 --- a/libavformat/dss.c +++ b/libavformat/dss.c @@ -116,6 +116,7 @@ static int dss_read_header(AVFormatContext *s) DSSDemuxContext *ctx = s->priv_data; AVIOContext *pb = s->pb; AVStream *st; + int64_t ret64; int ret, version; st = avformat_new_stream(s, NULL); @@ -164,8 +165,10 @@ static int dss_read_header(AVFormatContext *s) /* Jump over header */ - if (avio_seek(pb, ctx->dss_header_size, SEEK_SET) != ctx->dss_header_size) - return AVERROR(EIO); + if ((ret64 = avio_seek(pb, ctx->dss_header_size, SEEK_SET)) < 0) + return (int)ret64; + if (ret64 != ctx->dss_header_size) + return AVERROR_INVALIDDATA; ctx->counter = 0; ctx->swap = 0; diff --git a/libavformat/dv.c b/libavformat/dv.c index 8af0d5a652..84677284bd 100644 --- a/libavformat/dv.c +++ b/libavformat/dv.c @@ -33,6 +33,7 @@ #include <time.h> #include "avformat.h" +#include "avio_internal.h" #include "demux.h" #include "internal.h" #include "libavcodec/dv_profile.h" @@ -576,6 +577,7 @@ static int dv_read_header(AVFormatContext *s) { unsigned state, marker_pos = 0; RawDVContext *c = s->priv_data; + int64_t ret64; int ret; if ((ret = dv_init_demux(s, &c->dv_demux)) < 0) @@ -598,10 +600,10 @@ static int dv_read_header(AVFormatContext *s) } AV_WB32(c->buf, state); - if (avio_read(s->pb, c->buf + 4, DV_PROFILE_BYTES - 4) != DV_PROFILE_BYTES - 4 || - avio_seek(s->pb, -DV_PROFILE_BYTES, SEEK_CUR) < 0) { - return AVERROR(EIO); - } + if ((ret = ffio_read_size(s->pb, c->buf + 4, DV_PROFILE_BYTES - 4)) < 0) + return ret; + if ((ret64 = avio_seek(s->pb, -DV_PROFILE_BYTES, SEEK_CUR)) < 0) + return (int)ret64; c->dv_demux.sys = av_dv_frame_profile(c->dv_demux.sys, c->buf, @@ -633,13 +635,13 @@ static int dv_read_packet(AVFormatContext *s, AVPacket *pkt) int ret; int64_t pos = avio_tell(s->pb); if (!c->dv_demux.sys) - return AVERROR(EIO); + return AVERROR_INVALIDDATA; size = c->dv_demux.sys->frame_size; ret = avio_read(s->pb, c->buf, size); if (ret < 0) { return ret; } else if (ret == 0) { - return AVERROR(EIO); + return AVERROR_INVALIDDATA; } size = avpriv_dv_produce_packet(&c->dv_demux, pkt, c->buf, size, pos); diff --git a/libavformat/dxa.c b/libavformat/dxa.c index 56b19a7fca..76bc7a543d 100644 --- a/libavformat/dxa.c +++ b/libavformat/dxa.c @@ -23,6 +23,7 @@ #include "libavutil/intreadwrite.h" #include "avformat.h" +#include "avio_internal.h" #include "demux.h" #include "internal.h" #include "riff.h" @@ -170,7 +171,7 @@ static int dxa_read_packet(AVFormatContext *s, AVPacket *pkt) ret = av_get_packet(s->pb, pkt, size); pkt->stream_index = 1; if(ret != size) - return AVERROR(EIO); + return AVERROR_INVALIDDATA; c->bytes_left -= size; c->wavpos = avio_tell(s->pb); return 0; @@ -214,10 +215,9 @@ static int dxa_read_packet(AVFormatContext *s, AVPacket *pkt) if (ret < 0) return ret; memcpy(pkt->data + pal_size, buf, DXA_EXTRA_SIZE); - ret = avio_read(s->pb, pkt->data + DXA_EXTRA_SIZE + pal_size, size); - if(ret != size){ - return AVERROR(EIO); - } + ret = ffio_read_size(s->pb, pkt->data + DXA_EXTRA_SIZE + pal_size, size); + if (ret < 0) + return ret; if(pal_size) memcpy(pkt->data, pal, pal_size); pkt->stream_index = 0; c->frames--; diff --git a/libavformat/electronicarts.c b/libavformat/electronicarts.c index 04acf3a409..74a050fec6 100644 --- a/libavformat/electronicarts.c +++ b/libavformat/electronicarts.c @@ -537,7 +537,7 @@ static int ea_read_header(AVFormatContext *s) AVStream *st; if (process_ea_header(s)<=0) - return AVERROR(EIO); + return AVERROR_INVALIDDATA; if (init_video_stream(s, &ea->video) || init_video_stream(s, &ea->alpha)) return AVERROR(ENOMEM); diff --git a/libavformat/filmstripdec.c b/libavformat/filmstripdec.c index 5ce0af234c..1a3f45f61c 100644 --- a/libavformat/filmstripdec.c +++ b/libavformat/filmstripdec.c @@ -43,7 +43,7 @@ static int read_header(AVFormatContext *s) AVStream *st; if (!(s->pb->seekable & AVIO_SEEKABLE_NORMAL)) - return AVERROR(EIO); + return AVERROR(ENOSYS); avio_seek(pb, avio_size(pb) - 36, SEEK_SET); if (avio_rb32(pb) != RAND_TAG) { diff --git a/libavformat/flic.c b/libavformat/flic.c index 41dfb4f39e..01cd4698cf 100644 --- a/libavformat/flic.c +++ b/libavformat/flic.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" @@ -97,8 +98,8 @@ static int flic_read_header(AVFormatContext *s) flic->frame_number = 0; /* load the whole header and pull out the width and height */ - if (avio_read(pb, header, FLIC_HEADER_SIZE) != FLIC_HEADER_SIZE) - return AVERROR(EIO); + if ((ret = ffio_read_size(pb, header, FLIC_HEADER_SIZE)) < 0) + return ret; magic_number = AV_RL16(&header[4]); speed = AV_RL32(&header[0x10]); @@ -131,9 +132,9 @@ static int flic_read_header(AVFormatContext *s) memcpy(st->codecpar->extradata, header, FLIC_HEADER_SIZE); /* peek at the preamble to detect TFTD videos - they seem to always start with an audio chunk */ - if (avio_read(pb, preamble, FLIC_PREAMBLE_SIZE) != FLIC_PREAMBLE_SIZE) { + if ((ret = ffio_read_size(pb, preamble, FLIC_PREAMBLE_SIZE)) < 0) { av_log(s, AV_LOG_ERROR, "Failed to peek at preamble\n"); - return AVERROR(EIO); + return ret; } avio_seek(pb, -FLIC_PREAMBLE_SIZE, SEEK_CUR); @@ -206,11 +207,8 @@ static int flic_read_packet(AVFormatContext *s, while (!packet_read && !avio_feof(pb)) { - if ((ret = avio_read(pb, preamble, FLIC_PREAMBLE_SIZE)) != - FLIC_PREAMBLE_SIZE) { - ret = AVERROR(EIO); + if ((ret = ffio_read_size(pb, preamble, FLIC_PREAMBLE_SIZE)) < 0) break; - } size = AV_RL32(&preamble[0]); magic = AV_RL16(&preamble[4]); @@ -222,11 +220,8 @@ static int flic_read_packet(AVFormatContext *s, pkt->stream_index = flic->video_stream_index; pkt->pos = pos; memcpy(pkt->data, preamble, FLIC_PREAMBLE_SIZE); - ret = avio_read(pb, pkt->data + FLIC_PREAMBLE_SIZE, + ret = ffio_read_size(pb, pkt->data + FLIC_PREAMBLE_SIZE, size - FLIC_PREAMBLE_SIZE); - if (ret != size - FLIC_PREAMBLE_SIZE) { - ret = AVERROR(EIO); - } pkt->flags = flic->frame_number == 0 ? AV_PKT_FLAG_KEY : 0; pkt->pts = flic->frame_number; if (flic->frame_number == 0) @@ -243,12 +238,10 @@ static int flic_read_packet(AVFormatContext *s, pkt->stream_index = flic->audio_stream_index; pkt->pos = pos; pkt->flags = AV_PKT_FLAG_KEY; - ret = avio_read(pb, pkt->data, size); + ret = ffio_read_size(pb, pkt->data, size); - if (ret != size) { - ret = AVERROR(EIO); + if (ret < 0) break; - } packet_read = 1; } else { diff --git a/libavformat/gifdec.c b/libavformat/gifdec.c index d5f06adc64..20836bfd8d 100644 --- a/libavformat/gifdec.c +++ b/libavformat/gifdec.c @@ -216,7 +216,7 @@ static int gif_read_header(AVFormatContext *s) skip: /* jump to start because gif decoder needs header data too */ if (avio_seek(pb, pos - 6, SEEK_SET) != pos - 6) - return AVERROR(EIO); + return AVERROR_INVALIDDATA; /* GIF format operates with time in "hundredths of second", * therefore timebase is 1/100 */ diff --git a/libavformat/gsmdec.c b/libavformat/gsmdec.c index 10fba212e9..649d67c009 100644 --- a/libavformat/gsmdec.c +++ b/libavformat/gsmdec.c @@ -63,7 +63,7 @@ static int gsm_read_packet(AVFormatContext *s, AVPacket *pkt) ret = av_get_packet(s->pb, pkt, size); if (ret < GSM_BLOCK_SIZE) { - return ret < 0 ? ret : AVERROR(EIO); + return ret < 0 ? ret : AVERROR_INVALIDDATA; } pkt->duration = 1; pkt->pts = pkt->pos / GSM_BLOCK_SIZE; diff --git a/libavformat/hca.c b/libavformat/hca.c index 713082f8b0..e24a21e081 100644 --- a/libavformat/hca.c +++ b/libavformat/hca.c @@ -24,6 +24,7 @@ #include "libavcodec/bytestream.h" #include "avformat.h" +#include "avio_internal.h" #include "demux.h" #include "internal.h" @@ -76,9 +77,9 @@ static int hca_read_header(AVFormatContext *s) if (ret < 0) return ret; - ret = avio_read(pb, par->extradata + 8, par->extradata_size - 8 - 10); - if (ret < par->extradata_size - 8 - 10) - return AVERROR(EIO); + ret = ffio_read_size(pb, par->extradata + 8, par->extradata_size - 8 - 10); + if (ret < 0) + return AVERROR_INVALIDDATA; AV_WL32(par->extradata, MKTAG('H', 'C', 'A', 0)); AV_WB16(par->extradata + 4, version); AV_WB16(par->extradata + 6, data_offset); diff --git a/libavformat/icoenc.c b/libavformat/icoenc.c index 7a7d839d84..9eba9e7926 100644 --- a/libavformat/icoenc.c +++ b/libavformat/icoenc.c @@ -122,7 +122,7 @@ static int ico_write_packet(AVFormatContext *s, AVPacket *pkt) if (ico->current_image >= ico->nb_images) { av_log(s, AV_LOG_ERROR, "ICO already contains %d images\n", ico->current_image); - return AVERROR(EIO); + return AVERROR_INVALIDDATA; } image = &ico->images[ico->current_image++]; diff --git a/libavformat/idcin.c b/libavformat/idcin.c index 561715d3d9..e2064acac3 100644 --- a/libavformat/idcin.c +++ b/libavformat/idcin.c @@ -267,7 +267,7 @@ static int idcin_read_packet(AVFormatContext *s, if (idcin->next_chunk_is_video) { command = avio_rl32(pb); if (command == 2) { - return AVERROR(EIO); + return AVERROR_INVALIDDATA; } else if (command == 1) { /* trigger a palette change */ ret = avio_read(pb, palette_buffer, 768); @@ -275,7 +275,7 @@ static int idcin_read_packet(AVFormatContext *s, return ret; } else if (ret != 768) { av_log(s, AV_LOG_ERROR, "incomplete packet\n"); - return AVERROR(EIO); + return AVERROR_INVALIDDATA; } /* scale the palette as necessary */ palette_scale = 2; @@ -312,7 +312,7 @@ static int idcin_read_packet(AVFormatContext *s, return ret; else if (ret != chunk_size) { av_log(s, AV_LOG_ERROR, "incomplete packet\n"); - return AVERROR(EIO); + return AVERROR_INVALIDDATA; } if (command == 1) { uint8_t *pal; diff --git a/libavformat/idroqdec.c b/libavformat/idroqdec.c index 67bc1246e6..9c3aaec260 100644 --- a/libavformat/idroqdec.c +++ b/libavformat/idroqdec.c @@ -74,11 +74,11 @@ static int roq_read_header(AVFormatContext *s) RoqDemuxContext *roq = s->priv_data; AVIOContext *pb = s->pb; unsigned char preamble[RoQ_CHUNK_PREAMBLE_SIZE]; + int ret; /* get the main header */ - if (avio_read(pb, preamble, RoQ_CHUNK_PREAMBLE_SIZE) != - RoQ_CHUNK_PREAMBLE_SIZE) - return AVERROR(EIO); + if ((ret = ffio_read_size(pb, preamble, RoQ_CHUNK_PREAMBLE_SIZE)) < 0) + return ret; roq->frame_rate = AV_RL16(&preamble[6]); /* init private context parameters */ @@ -111,9 +111,8 @@ static int roq_read_packet(AVFormatContext *s, return AVERROR_EOF; /* get the next chunk preamble */ - if ((ret = avio_read(pb, preamble, RoQ_CHUNK_PREAMBLE_SIZE)) != - RoQ_CHUNK_PREAMBLE_SIZE) - return AVERROR(EIO); + if ((ret = ffio_read_size(pb, preamble, RoQ_CHUNK_PREAMBLE_SIZE)) < 0) + return ret; chunk_type = AV_RL16(&preamble[0]); chunk_size = AV_RL32(&preamble[2]); @@ -135,8 +134,8 @@ static int roq_read_packet(AVFormatContext *s, st->codecpar->codec_id = AV_CODEC_ID_ROQ; st->codecpar->codec_tag = 0; /* no fourcc */ - if (avio_read(pb, preamble, RoQ_CHUNK_PREAMBLE_SIZE) != RoQ_CHUNK_PREAMBLE_SIZE) - return AVERROR(EIO); + if ((ret = ffio_read_size(pb, preamble, RoQ_CHUNK_PREAMBLE_SIZE)) < 0) + return ret; st->codecpar->width = roq->width = AV_RL16(preamble); st->codecpar->height = roq->height = AV_RL16(preamble + 2); break; @@ -152,9 +151,8 @@ static int roq_read_packet(AVFormatContext *s, codebook_offset = avio_tell(pb) - RoQ_CHUNK_PREAMBLE_SIZE; codebook_size = chunk_size; avio_skip(pb, codebook_size); - if (avio_read(pb, preamble, RoQ_CHUNK_PREAMBLE_SIZE) != - RoQ_CHUNK_PREAMBLE_SIZE) - return AVERROR(EIO); + if ((ret = ffio_read_size(pb, preamble, RoQ_CHUNK_PREAMBLE_SIZE)) < 0) + return ret; chunk_size = AV_RL32(&preamble[2]) + RoQ_CHUNK_PREAMBLE_SIZE * 2 + codebook_size; @@ -167,7 +165,7 @@ static int roq_read_packet(AVFormatContext *s, /* load up the packet */ ret= av_get_packet(pb, pkt, chunk_size); if (ret != chunk_size) - return AVERROR(EIO); + return AVERROR_INVALIDDATA; pkt->stream_index = roq->video_stream_index; pkt->pts = roq->video_pts++; @@ -220,11 +218,10 @@ static int roq_read_packet(AVFormatContext *s, } pkt->pos= avio_tell(pb); - ret = avio_read(pb, pkt->data + RoQ_CHUNK_PREAMBLE_SIZE, + ret = ffio_read_size(pb, pkt->data + RoQ_CHUNK_PREAMBLE_SIZE, chunk_size); - if (ret != chunk_size) { - return AVERROR(EIO); - } + if (ret < 0) + return ret; packet_read = 1; break; diff --git a/libavformat/iff.c b/libavformat/iff.c index 44ba5a9023..fc40ef1aea 100644 --- a/libavformat/iff.c +++ b/libavformat/iff.c @@ -37,6 +37,7 @@ #include "libavutil/mem.h" #include "libavcodec/bytestream.h" #include "avformat.h" +#include "avio_internal.h" #include "demux.h" #include "id3v2.h" #include "internal.h" @@ -135,13 +136,14 @@ static int get_metadata(AVFormatContext *s, const unsigned data_size) { uint8_t *buf = ((data_size + 1) == 0) ? NULL : av_malloc(data_size + 1); + int res; if (!buf) return AVERROR(ENOMEM); - if (avio_read(s->pb, buf, data_size) != data_size) { + if ((res = ffio_read_size(s->pb, buf, data_size)) < 0) { av_free(buf); - return AVERROR(EIO); + return res; } buf[data_size] = 0; av_dict_set(&s->metadata, tag, buf, AV_DICT_DONT_STRDUP_VAL); @@ -563,10 +565,10 @@ static int iff_read_header(AVFormatContext *s) data_size + IFF_EXTRA_VIDEO_SIZE); if (res < 0) return res; - if (avio_read(pb, stv->codecpar->extradata + IFF_EXTRA_VIDEO_SIZE, data_size) < 0) { + if ((res = avio_read(pb, stv->codecpar->extradata + IFF_EXTRA_VIDEO_SIZE, data_size)) < 0) { av_freep(&stv->codecpar->extradata); stv->codecpar->extradata_size = 0; - return AVERROR(EIO); + return res; } break; diff --git a/libavformat/img2dec.c b/libavformat/img2dec.c index 789f8b94c9..78bfc2c58d 100644 --- a/libavformat/img2dec.c +++ b/libavformat/img2dec.c @@ -400,13 +400,13 @@ int ff_img_read_packet(AVFormatContext *s1, AVPacket *pkt) !s->loop && !s->split_planes) { f[i] = s1->pb; - } else if (s1->io_open(s1, &f[i], filename.str, AVIO_FLAG_READ, NULL) < 0) { + } else if ((res = s1->io_open(s1, &f[i], filename.str, AVIO_FLAG_READ, NULL)) < 0) { if (i >= 1) break; av_log(s1, AV_LOG_ERROR, "Could not open file : %s\n", filename.str); av_bprint_finalize(&filename, NULL); - return AVERROR(EIO); + return res; } size[i] = avio_size(f[i]); @@ -465,10 +465,9 @@ int ff_img_read_packet(AVFormatContext *s1, AVPacket *pkt) if (s->ts_from_file) { struct stat img_stat; av_assert0(!s->is_pipe); // The ts_from_file option is not supported by piped input demuxers - if (stat(filename.str, &img_stat)) { - res = AVERROR(EIO); + res = stat(filename.str, &img_stat); + if (res) goto fail; - } pkt->pts = (int64_t)img_stat.st_mtime; #if HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC if (s->ts_from_file == 2) diff --git a/libavformat/img2enc.c b/libavformat/img2enc.c index d14bc5ea3f..fb51151090 100644 --- a/libavformat/img2enc.c +++ b/libavformat/img2enc.c @@ -194,9 +194,8 @@ static int write_packet(AVFormatContext *s, AVPacket *pkt) goto fail; } } - if (s->io_open(s, &pb[i], tmp[i] ? tmp[i] : filename.str, AVIO_FLAG_WRITE, &options) < 0) { + if ((ret = s->io_open(s, &pb[i], tmp[i] ? tmp[i] : filename.str, AVIO_FLAG_WRITE, &options)) < 0) { av_log(s, AV_LOG_ERROR, "Could not open file : %s\n", tmp[i] ? tmp[i] : filename.str); - ret = AVERROR(EIO); goto fail; } if (options) { diff --git a/libavformat/ingenientdec.c b/libavformat/ingenientdec.c index 63624372a6..64b5e8a407 100644 --- a/libavformat/ingenientdec.c +++ b/libavformat/ingenientdec.c @@ -39,7 +39,7 @@ static int ingenient_read_packet(AVFormatContext *s, AVPacket *pkt) int ret, size, w, h, unk1, unk2; if (avio_rl32(s->pb) != MKTAG('M', 'J', 'P', 'G')) - return AVERROR(EIO); // FIXME + return AVERROR_INVALIDDATA; // FIXME size = avio_rl32(s->pb); diff --git a/libavformat/ipmovie.c b/libavformat/ipmovie.c index 5a8abde842..1ef357e088 100644 --- a/libavformat/ipmovie.c +++ b/libavformat/ipmovie.c @@ -639,9 +639,8 @@ static int ipmovie_read_header(AVFormatContext *s) /* peek ahead to the next chunk-- if it is an init audio chunk, process * it; if it is the first video chunk, this is a silent file */ - if (avio_read(pb, chunk_preamble, CHUNK_PREAMBLE_SIZE) != - CHUNK_PREAMBLE_SIZE) - return AVERROR(EIO); + if ((ret = ffio_read_size(pb, chunk_preamble, CHUNK_PREAMBLE_SIZE)) < 0) + return ret; chunk_type = AV_RL16(&chunk_preamble[2]); avio_seek(pb, -CHUNK_PREAMBLE_SIZE, SEEK_CUR); @@ -688,7 +687,7 @@ static int ipmovie_read_packet(AVFormatContext *s, if (ret == CHUNK_BAD) ret = AVERROR_INVALIDDATA; else if (ret == CHUNK_EOF) - ret = AVERROR(EIO); + ret = AVERROR_INVALIDDATA; else if (ret == CHUNK_NOMEM) ret = AVERROR(ENOMEM); else if (ret == CHUNK_END || ret == CHUNK_SHUTDOWN) diff --git a/libavformat/iss.c b/libavformat/iss.c index 7a68fcaf63..b0e17994d4 100644 --- a/libavformat/iss.c +++ b/libavformat/iss.c @@ -136,7 +136,7 @@ static int iss_read_packet(AVFormatContext *s, AVPacket *pkt) int ret = av_get_packet(s->pb, pkt, iss->packet_size); if(ret != iss->packet_size) - return AVERROR(EIO); + return AVERROR_INVALIDDATA; pkt->stream_index = 0; pkt->pts = avio_tell(s->pb) - iss->sample_start_pos; diff --git a/libavformat/jvdec.c b/libavformat/jvdec.c index c4580b6a01..4f4566f64b 100644 --- a/libavformat/jvdec.c +++ b/libavformat/jvdec.c @@ -217,7 +217,7 @@ static int read_packet(AVFormatContext *s, AVPacket *pkt) if (s->pb->eof_reached) return AVERROR_EOF; - return AVERROR(EIO); + return AVERROR_INVALIDDATA; } static int read_seek(AVFormatContext *s, int stream_index, diff --git a/libavformat/libmodplug.c b/libavformat/libmodplug.c index 680a5fe9bc..01566d121e 100644 --- a/libavformat/libmodplug.c +++ b/libavformat/libmodplug.c @@ -348,7 +348,7 @@ static int modplug_read_packet(AVFormatContext *s, AVPacket *pkt) pkt->size = ModPlug_Read(modplug->f, pkt->data, AUDIO_PKT_SIZE); if (pkt->size <= 0) { - return pkt->size == 0 ? AVERROR_EOF : AVERROR(EIO); + return pkt->size == 0 ? AVERROR_EOF : AVERROR_EXTERNAL; } return 0; } diff --git a/libavformat/lmlm4.c b/libavformat/lmlm4.c index cec2f7ca05..aeb5580620 100644 --- a/libavformat/lmlm4.c +++ b/libavformat/lmlm4.c @@ -103,7 +103,7 @@ static int lmlm4_read_packet(AVFormatContext *s, AVPacket *pkt) frame_size = packet_size - 8; if ((ret = av_get_packet(pb, pkt, frame_size)) <= 0) - return ret < 0 ? ret : AVERROR(EIO); + return ret < 0 ? ret : AVERROR_INVALIDDATA; avio_skip(pb, padding); diff --git a/libavformat/mca.c b/libavformat/mca.c index e707de3c3b..74a33e25c3 100644 --- a/libavformat/mca.c +++ b/libavformat/mca.c @@ -105,7 +105,7 @@ static int read_header(AVFormatContext *s) if (version <= 4) { // version <= 4 needs to use the file size to calculate the offsets if (file_size < 0) { - return AVERROR(EIO); + return AVERROR_INVALIDDATA; } if (file_size - data_size > UINT32_MAX) return AVERROR_INVALIDDATA; diff --git a/libavformat/mgsts.c b/libavformat/mgsts.c index 07ea66163c..f8392888bd 100644 --- a/libavformat/mgsts.c +++ b/libavformat/mgsts.c @@ -44,7 +44,7 @@ static int read_header(AVFormatContext *s) avio_skip(pb, 4); chunk_size = avio_rb32(pb); if (chunk_size != 80) - return AVERROR(EIO); + return AVERROR_INVALIDDATA; avio_skip(pb, 20); st = avformat_new_stream(s, 0); @@ -84,7 +84,7 @@ static int read_packet(AVFormatContext *s, AVPacket *pkt) payload_size = avio_rb32(pb); if (chunk_size < payload_size + 16) - return AVERROR(EIO); + return AVERROR_INVALIDDATA; ret = av_get_packet(pb, pkt, payload_size); if (ret < 0) diff --git a/libavformat/mlvdec.c b/libavformat/mlvdec.c index a0d5e7fb55..3a5d211085 100644 --- a/libavformat/mlvdec.c +++ b/libavformat/mlvdec.c @@ -548,7 +548,7 @@ static int read_packet(AVFormatContext *avctx, AVPacket *pkt) index = av_index_search_timestamp(st, mlv->pts, AVSEEK_FLAG_ANY); if (index < 0) { av_log(avctx, AV_LOG_ERROR, "could not find index entry for frame %"PRId64"\n", mlv->pts); - return AVERROR(EIO); + return AVERROR_INVALIDDATA; } pb = mlv->pb[sti->index_entries[index].size]; @@ -611,7 +611,7 @@ static int read_seek(AVFormatContext *avctx, int stream_index, int64_t timestamp return AVERROR(ENOSYS); if (!(avctx->pb->seekable & AVIO_SEEKABLE_NORMAL)) - return AVERROR(EIO); + return AVERROR(ENOSYS); mlv->pts = timestamp; return 0; diff --git a/libavformat/mmst.c b/libavformat/mmst.c index e68606086e..115e0d3c60 100644 --- a/libavformat/mmst.c +++ b/libavformat/mmst.c @@ -275,7 +275,7 @@ static MMSSCPacketType get_tcp_server_response(MMSTContext *mmst) read_result, read_result < 0 ? strerror(AVUNERROR(read_result)) : "The server closed the connection"); - return read_result < 0 ? read_result : AVERROR(EIO); + return read_result < 0 ? read_result : AVERROR(EIO); } length_remaining= AV_RL32(mms->in_buffer+8) + 4; @@ -296,7 +296,7 @@ static MMSSCPacketType get_tcp_server_response(MMSTContext *mmst) length_remaining, read_result, read_result < 0 ? strerror(AVUNERROR(read_result)) : "The server closed the connection"); - return read_result < 0 ? read_result : AVERROR(EIO); + return read_result < 0 ? read_result : AVERROR(EIO); } packet_type= AV_RL16(mms->in_buffer+36); if (read_result >= 44 && (hr = AV_RL32(mms->in_buffer + 40))) { @@ -333,7 +333,7 @@ static MMSSCPacketType get_tcp_server_response(MMSTContext *mmst) length_remaining, read_result, read_result < 0 ? strerror(AVUNERROR(read_result)) : "The server closed the connection"); - return read_result < 0 ? read_result : AVERROR(EIO); + return read_result < 0 ? read_result : AVERROR(EIO); } // if we successfully read everything. @@ -611,7 +611,7 @@ static int mms_read(URLContext *h, uint8_t *buf, int size) av_log(h, AV_LOG_ERROR, "Incoming pktlen %d is larger than ASF pktsize %d\n", mms->remaining_in_len, mms->asf_packet_len); - result= AVERROR(EIO); + result= AVERROR_INVALIDDATA; } else { // copy the data to the packet buffer. result = ff_mms_read_data(mms, buf, size); diff --git a/libavformat/mpc.c b/libavformat/mpc.c index 1e0e170c7d..45ba76c703 100644 --- a/libavformat/mpc.c +++ b/libavformat/mpc.c @@ -171,7 +171,7 @@ static int mpc_read_packet(AVFormatContext *s, AVPacket *pkt) if(c->curbits) avio_seek(s->pb, -4, SEEK_CUR); if(ret < size){ - return ret < 0 ? ret : AVERROR(EIO); + return ret < 0 ? ret : AVERROR_INVALIDDATA; } pkt->size = ret + 4; diff --git a/libavformat/mtv.c b/libavformat/mtv.c index 01379a18e7..32e96995f6 100644 --- a/libavformat/mtv.c +++ b/libavformat/mtv.c @@ -105,6 +105,7 @@ static int mtv_read_header(AVFormatContext *s) AVIOContext *pb = s->pb; AVStream *st; unsigned int audio_subsegments; + int64_t ret64; avio_skip(pb, 3); mtv->file_size = avio_rl32(pb); @@ -190,8 +191,8 @@ static int mtv_read_header(AVFormatContext *s) // Jump over header - if(avio_seek(pb, MTV_HEADER_SIZE, SEEK_SET) != MTV_HEADER_SIZE) - return AVERROR(EIO); + if ((ret64 = avio_seek(pb, MTV_HEADER_SIZE, SEEK_SET)) != MTV_HEADER_SIZE) + return ret64 < 0 ? ret64 : AVERROR_INVALIDDATA; return 0; diff --git a/libavformat/mvdec.c b/libavformat/mvdec.c index aa45d23b39..113f133687 100644 --- a/libavformat/mvdec.c +++ b/libavformat/mvdec.c @@ -489,7 +489,7 @@ static int mv_read_packet(AVFormatContext *avctx, AVPacket *pkt) avio_skip(pb, index->pos - pos); else if (index->pos < pos) { if (!(pb->seekable & AVIO_SEEKABLE_NORMAL)) - return AVERROR(EIO); + return AVERROR(ENOSYS); ret = avio_seek(pb, index->pos, SEEK_SET); if (ret < 0) return ret; @@ -531,7 +531,7 @@ static int mv_read_seek(AVFormatContext *avctx, int stream_index, return AVERROR(ENOSYS); if (!(avctx->pb->seekable & AVIO_SEEKABLE_NORMAL)) - return AVERROR(EIO); + return AVERROR(ENOSYS); frame = av_index_search_timestamp(st, timestamp, flags); if (frame < 0) diff --git a/libavformat/mvi.c b/libavformat/mvi.c index 05aa25f348..42127bbb5d 100644 --- a/libavformat/mvi.c +++ b/libavformat/mvi.c @@ -119,7 +119,7 @@ static int read_packet(AVFormatContext *s, AVPacket *pkt) if (mvi->video_frame_size == 0) { mvi->video_frame_size = (mvi->get_int)(pb); if (mvi->audio_size_left == 0) - return AVERROR(EIO); + return AVERROR_INVALIDDATA; if (mvi->audio_size_counter + 512 > UINT64_MAX - mvi->audio_frame_size || mvi->audio_size_counter + 512 + mvi->audio_frame_size >= ((uint64_t)INT32_MAX) << MVI_FRAC_BITS) return AVERROR_INVALIDDATA; diff --git a/libavformat/ncdec.c b/libavformat/ncdec.c index 050d98bf5d..6eb693093a 100644 --- a/libavformat/ncdec.c +++ b/libavformat/ncdec.c @@ -69,7 +69,7 @@ static int nc_read_packet(AVFormatContext *s, AVPacket *pkt) uint32_t state=-1; while (state != NC_VIDEO_FLAG) { if (avio_feof(s->pb)) - return AVERROR(EIO); + return AVERROR_INVALIDDATA; state = (state<<8) + avio_r8(s->pb); } @@ -84,7 +84,7 @@ static int nc_read_packet(AVFormatContext *s, AVPacket *pkt) ret = av_get_packet(s->pb, pkt, size); if (ret != size) { - return AVERROR(EIO); + return AVERROR_INVALIDDATA; } pkt->stream_index = 0; diff --git a/libavformat/nuv.c b/libavformat/nuv.c index 49915ecf16..17a041b254 100644 --- a/libavformat/nuv.c +++ b/libavformat/nuv.c @@ -320,7 +320,7 @@ static int nuv_packet(AVFormatContext *s, AVPacket *pkt) } } - return AVERROR(EIO); + return AVERROR_INVALIDDATA; } /** diff --git a/libavformat/pdvdec.c b/libavformat/pdvdec.c index cd118f0e37..792188b019 100644 --- a/libavformat/pdvdec.c +++ b/libavformat/pdvdec.c @@ -112,7 +112,7 @@ static int pdv_read_packet(AVFormatContext *s, AVPacket *pkt) return AVERROR_EOF; if (p->current_frame >= sti->nb_index_entries) - return AVERROR(EIO); + return AVERROR_INVALIDDATA; pos = sti->index_entries[p->current_frame].pos; flags = sti->index_entries[p->current_frame].flags; diff --git a/libavformat/pp_bnk.c b/libavformat/pp_bnk.c index 5360b7c5d7..15bb49ea26 100644 --- a/libavformat/pp_bnk.c +++ b/libavformat/pp_bnk.c @@ -20,6 +20,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "avformat.h" +#include "avio_internal.h" #include "demux.h" #include "internal.h" #include "libavutil/intreadwrite.h" @@ -117,10 +118,8 @@ static int pp_bnk_read_header(AVFormatContext *s) uint8_t buf[FFMAX(PP_BNK_FILE_HEADER_SIZE, PP_BNK_TRACK_SIZE)]; PPBnkHeader hdr; - if ((ret = avio_read(s->pb, buf, PP_BNK_FILE_HEADER_SIZE)) < 0) + if ((ret = ffio_read_size(s->pb, buf, PP_BNK_FILE_HEADER_SIZE)) < 0) return ret; - else if (ret != PP_BNK_FILE_HEADER_SIZE) - return AVERROR(EIO); pp_bnk_parse_header(&hdr, buf); @@ -246,7 +245,7 @@ static int pp_bnk_read_packet(AVFormatContext *s, AVPacket *pkt) if ((ret = avio_seek(s->pb, trk->data_offset + trk->bytes_read, SEEK_SET)) < 0) return ret; else if (ret != trk->data_offset + trk->bytes_read) - return AVERROR(EIO); + return AVERROR_INVALIDDATA; size = FFMIN(trk->data_size - trk->bytes_read, PP_BNK_MAX_READ_SIZE); diff --git a/libavformat/psxstr.c b/libavformat/psxstr.c index 0dd4e8d377..d2066f501c 100644 --- a/libavformat/psxstr.c +++ b/libavformat/psxstr.c @@ -33,6 +33,7 @@ #include "libavutil/internal.h" #include "libavutil/intreadwrite.h" #include "avformat.h" +#include "avio_internal.h" #include "demux.h" #include "internal.h" @@ -134,11 +135,12 @@ static int str_read_header(AVFormatContext *s) StrDemuxContext *str = s->priv_data; unsigned char sector[RAW_CD_SECTOR_SIZE]; int start; + int ret; int i; /* skip over any RIFF header */ - if (avio_read(pb, sector, RIFF_HEADER_SIZE) != RIFF_HEADER_SIZE) - return AVERROR(EIO); + if ((ret = ffio_read_size(pb, sector, RIFF_HEADER_SIZE)) < 0) + return ret; if (AV_RL32(§or[0]) == RIFF_TAG) start = RIFF_HEADER_SIZE; else @@ -167,13 +169,10 @@ static int str_read_packet(AVFormatContext *s, AVStream *st; while (1) { - int read = avio_read(pb, sector, RAW_CD_SECTOR_SIZE); + int read = ffio_read_size(pb, sector, RAW_CD_SECTOR_SIZE); - if (read == AVERROR_EOF) - return AVERROR_EOF; - - if (read != RAW_CD_SECTOR_SIZE) - return AVERROR(EIO); + if (read < 0) + return read; channel = sector[0x11]; if (channel >= 32) @@ -287,7 +286,7 @@ static int str_read_packet(AVFormatContext *s, } if (avio_feof(pb)) - return AVERROR(EIO); + return AVERROR_INVALIDDATA; } } diff --git a/libavformat/pva.c b/libavformat/pva.c index 047c93c9c4..9de1a186a9 100644 --- a/libavformat/pva.c +++ b/libavformat/pva.c @@ -103,18 +103,18 @@ recover: if (syncword != PVA_MAGIC) { pva_log(s, AV_LOG_ERROR, "invalid syncword\n"); - return AVERROR(EIO); + return AVERROR_INVALIDDATA; } if (streamid != PVA_VIDEO_PAYLOAD && streamid != PVA_AUDIO_PAYLOAD) { pva_log(s, AV_LOG_ERROR, "invalid streamid\n"); - return AVERROR(EIO); + return AVERROR_INVALIDDATA; } if (reserved != 0x55) { pva_log(s, AV_LOG_WARNING, "expected reserved byte to be 0x55\n"); } if (length > PVA_MAX_PAYLOAD_LENGTH) { pva_log(s, AV_LOG_ERROR, "invalid payload length %u\n", length); - return AVERROR(EIO); + return AVERROR_INVALIDDATA; } if (streamid == PVA_VIDEO_PAYLOAD && pts_flag) { @@ -145,7 +145,7 @@ recover: "trying to recover\n"); avio_skip(pb, length - 9); if (!read_packet) - return AVERROR(EIO); + return AVERROR_INVALIDDATA; goto recover; } @@ -192,7 +192,7 @@ static int pva_read_packet(AVFormatContext *s, AVPacket *pkt) { if (read_part_of_packet(s, &pva_pts, &length, &streamid, 1) < 0 || (ret = av_get_packet(pb, pkt, length)) <= 0) - return AVERROR(EIO); + return AVERROR_INVALIDDATA; pkt->stream_index = streamid - 1; pkt->pts = pva_pts; diff --git a/libavformat/qoadec.c b/libavformat/qoadec.c index a9632c46c3..6f8fe111ad 100644 --- a/libavformat/qoadec.c +++ b/libavformat/qoadec.c @@ -93,9 +93,9 @@ static int qoa_read_packet(AVFormatContext *s, AVPacket *pkt) return ret; memcpy(pkt->data, hdr, sizeof(hdr)); - ret = avio_read(pb, pkt->data + sizeof(hdr), size - sizeof(hdr)); - if (ret != size - sizeof(hdr)) - return AVERROR(EIO); + ret = ffio_read_size(pb, pkt->data + sizeof(hdr), size - sizeof(hdr)); + if (ret < 0) + return ret; pkt->stream_index = 0; pkt->pos = pos; pkt->duration = duration; diff --git a/libavformat/redspark.c b/libavformat/redspark.c index 2642d7af67..fded46ab43 100644 --- a/libavformat/redspark.c +++ b/libavformat/redspark.c @@ -141,7 +141,7 @@ static int redspark_read_packet(AVFormatContext *s, AVPacket *pkt) ret = av_get_packet(s->pb, pkt, size); if (ret != size) { - return AVERROR(EIO); + return AVERROR_INVALIDDATA; } pkt->duration = 14; diff --git a/libavformat/rl2.c b/libavformat/rl2.c index aa59332783..e26e14f9cd 100644 --- a/libavformat/rl2.c +++ b/libavformat/rl2.c @@ -259,7 +259,7 @@ static int rl2_read_packet(AVFormatContext *s, /** fill the packet */ ret = av_get_packet(pb, pkt, sample->size); if(ret != sample->size){ - return AVERROR(EIO); + return AVERROR_INVALIDDATA; } pkt->stream_index = stream_id; diff --git a/libavformat/rmdec.c b/libavformat/rmdec.c index 85643a358f..2909698cda 100644 --- a/libavformat/rmdec.c +++ b/libavformat/rmdec.c @@ -569,7 +569,7 @@ static int rm_read_header(AVFormatContext *s) /* very old .ra format */ return rm_read_header_old(s); } else if (tag != MKTAG('.', 'R', 'M', 'F') && tag != MKTAG('.', 'R', 'M', 'P')) { - return AVERROR(EIO); + return AVERROR_INVALIDDATA; } tag_size = avio_rb32(pb); @@ -1064,7 +1064,7 @@ static int rm_read_packet(AVFormatContext *s, AVPacket *pkt) if (avio_feof(s->pb)) return AVERROR_EOF; if (len <= 0) - return AVERROR(EIO); + return AVERROR_INVALIDDATA; res = ff_rm_parse_packet (s, s->pb, st, st->priv_data, len, pkt, &seq, flags, timestamp); @@ -1410,7 +1410,7 @@ static int ivr_read_packet(AVFormatContext *s, AVPacket *pkt) } } else { av_log(s, AV_LOG_ERROR, "Unsupported opcode=%d at %"PRIX64"\n", opcode, avio_tell(pb) - 1); - return AVERROR(EIO); + return AVERROR_INVALIDDATA; } } diff --git a/libavformat/rpl.c b/libavformat/rpl.c index 781dabf7ba..06e3f354fc 100644 --- a/libavformat/rpl.c +++ b/libavformat/rpl.c @@ -313,7 +313,7 @@ static int rpl_read_header(AVFormatContext *s) } if (error) - return AVERROR(EIO); + return AVERROR_INVALIDDATA; return 0; } @@ -341,8 +341,9 @@ static int rpl_read_packet(AVFormatContext *s, AVPacket *pkt) index_entry = &sti->index_entries[rpl->chunk_number]; if (rpl->frame_in_part == 0) { - if (avio_seek(pb, index_entry->pos, SEEK_SET) < 0) - return AVERROR(EIO); + int64_t ret64 = avio_seek(pb, index_entry->pos, SEEK_SET); + if (ret64 < 0) + return (int)ret64; } if (stream->codecpar->codec_type == AVMEDIA_TYPE_VIDEO && @@ -350,17 +351,20 @@ static int rpl_read_packet(AVFormatContext *s, AVPacket *pkt) // We have to split Escape 124 frames because there are // multiple frames per chunk in Escape 124 samples. uint32_t frame_size; + int64_t ret64; avio_skip(pb, 4); /* flags */ frame_size = avio_rl32(pb); - if (avio_feof(pb) || avio_seek(pb, -8, SEEK_CUR) < 0 || !frame_size) - return AVERROR(EIO); + if (avio_feof(pb) || !frame_size) + return AVERROR_INVALIDDATA; + if ((ret64 = avio_seek(pb, -8, SEEK_CUR)) < 0) + return (int)ret64; ret = av_get_packet(pb, pkt, frame_size); if (ret < 0) return ret; if (ret != frame_size) - return AVERROR(EIO); + return AVERROR_INVALIDDATA; pkt->duration = 1; pkt->pts = index_entry->timestamp + rpl->frame_in_part; @@ -376,7 +380,7 @@ static int rpl_read_packet(AVFormatContext *s, AVPacket *pkt) if (ret < 0) return ret; if (ret != index_entry->size) - return AVERROR(EIO); + return AVERROR_INVALIDDATA; if (stream->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) { // frames_per_chunk should always be one here; the header diff --git a/libavformat/segafilm.c b/libavformat/segafilm.c index e72d872f96..2b853017db 100644 --- a/libavformat/segafilm.c +++ b/libavformat/segafilm.c @@ -30,6 +30,7 @@ #include "libavutil/intreadwrite.h" #include "libavutil/mem.h" #include "avformat.h" +#include "avio_internal.h" #include "demux.h" #include "internal.h" @@ -95,20 +96,21 @@ static int film_read_header(AVFormatContext *s) unsigned int data_offset; unsigned int audio_frame_counter; unsigned int video_frame_counter; + int ret; film->sample_table = NULL; /* load the main FILM header */ - if (avio_read(pb, scratch, 16) != 16) - return AVERROR(EIO); + if ((ret = ffio_read_size(pb, scratch, 16)) < 0) + return ret; data_offset = AV_RB32(&scratch[4]); film->version = AV_RB32(&scratch[8]); /* load the FDSC chunk */ if (film->version == 0) { /* special case for Lemmings .film files; 20-byte header */ - if (avio_read(pb, scratch, 20) != 20) - return AVERROR(EIO); + if ((ret = ffio_read_size(pb, scratch, 20)) < 0) + return ret; /* make some assumptions about the audio parameters */ film->audio_type = AV_CODEC_ID_PCM_S8; film->audio_samplerate = 22050; @@ -116,8 +118,8 @@ static int film_read_header(AVFormatContext *s) film->audio_bits = 8; } else { /* normal Saturn .cpk files; 32-byte header */ - if (avio_read(pb, scratch, 32) != 32) - return AVERROR(EIO); + if ((ret = ffio_read_size(pb, scratch, 32)) < 0) + return ret; film->audio_samplerate = AV_RB16(&scratch[24]); film->audio_channels = scratch[21]; film->audio_bits = scratch[22]; @@ -196,8 +198,8 @@ static int film_read_header(AVFormatContext *s) } /* load the sample table */ - if (avio_read(pb, scratch, 16) != 16) - return AVERROR(EIO); + if ((ret = ffio_read_size(pb, scratch, 16)) < 0) + return ret; if (AV_RB32(&scratch[0]) != STAB_TAG) return AVERROR_INVALIDDATA; film->base_clock = AV_RB32(&scratch[8]); @@ -217,8 +219,8 @@ static int film_read_header(AVFormatContext *s) audio_frame_counter = video_frame_counter = 0; for (i = 0; i < film->sample_count; i++) { /* load the next sample record and transfer it to an internal struct */ - if (avio_read(pb, scratch, 16) != 16) - return AVERROR(EIO); + if ((ret = ffio_read_size(pb, scratch, 16)) < 0) + return ret; film->sample_table[i].sample_offset = data_offset + AV_RB32(&scratch[0]); film->sample_table[i].sample_size = AV_RB32(&scratch[4]); @@ -294,7 +296,7 @@ static int film_read_packet(AVFormatContext *s, ret = av_get_packet(pb, pkt, sample->sample_size); if (ret != sample->sample_size) - ret = AVERROR(EIO); + ret = AVERROR_INVALIDDATA; pkt->stream_index = sample->stream; pkt->dts = sample->pts; diff --git a/libavformat/sierravmd.c b/libavformat/sierravmd.c index 2103ff64db..bb1d1c5df7 100644 --- a/libavformat/sierravmd.c +++ b/libavformat/sierravmd.c @@ -31,6 +31,7 @@ #include "libavutil/intreadwrite.h" #include "libavutil/mem.h" #include "avformat.h" +#include "avio_internal.h" #include "demux.h" #include "internal.h" #include "avio_internal.h" @@ -102,8 +103,8 @@ static int vmd_read_header(AVFormatContext *s) /* fetch the main header, including the 2 header length bytes */ avio_seek(pb, 0, SEEK_SET); - if (avio_read(pb, vmd->vmd_header, VMD_HEADER_SIZE) != VMD_HEADER_SIZE) - return AVERROR(EIO); + if ((ret = ffio_read_size(pb, vmd->vmd_header, VMD_HEADER_SIZE) < 0)) + return ret; width = AV_RL16(&vmd->vmd_header[12]); height = AV_RL16(&vmd->vmd_header[14]); @@ -192,11 +193,8 @@ static int vmd_read_header(AVFormatContext *s) ret = AVERROR(ENOMEM); goto error; } - if (avio_read(pb, raw_frame_table, raw_frame_table_size) != - raw_frame_table_size) { - ret = AVERROR(EIO); + if ((ret = ffio_read_size(pb, raw_frame_table, raw_frame_table_size)) < 0) goto error; - } total_frames = 0; for (i = 0; i < vmd->frame_count; i++) { @@ -279,21 +277,18 @@ static int vmd_read_packet(AVFormatContext *s, avio_seek(pb, frame->frame_offset, SEEK_SET); if(ffio_limit(pb, frame->frame_size) != frame->frame_size) - return AVERROR(EIO); + return AVERROR_INVALIDDATA; ret = av_new_packet(pkt, frame->frame_size + BYTES_PER_FRAME_RECORD); if (ret < 0) return ret; pkt->pos= avio_tell(pb); memcpy(pkt->data, frame->frame_record, BYTES_PER_FRAME_RECORD); if(vmd->is_indeo3 && frame->frame_record[0] == 0x02) - ret = avio_read(pb, pkt->data, frame->frame_size); + ret = ffio_read_size(pb, pkt->data, frame->frame_size); else - ret = avio_read(pb, pkt->data + BYTES_PER_FRAME_RECORD, + ret = ffio_read_size(pb, pkt->data + BYTES_PER_FRAME_RECORD, frame->frame_size); - if (ret != frame->frame_size) { - ret = AVERROR(EIO); - } pkt->stream_index = frame->stream_index; pkt->pts = frame->pts; av_log(s, AV_LOG_DEBUG, " dispatching %s frame with %d bytes and pts %"PRId64"\n", diff --git a/libavformat/siff.c b/libavformat/siff.c index b33746d51d..b0fff80b09 100644 --- a/libavformat/siff.c +++ b/libavformat/siff.c @@ -232,7 +232,7 @@ static int siff_read_packet(AVFormatContext *s, AVPacket *pkt) } else { int pktsize = av_get_packet(s->pb, pkt, c->sndsize - 4); if (pktsize < 0) - return AVERROR(EIO); + return AVERROR_INVALIDDATA; pkt->stream_index = 1; pkt->duration = pktsize; c->curstrm = 0; @@ -246,7 +246,7 @@ static int siff_read_packet(AVFormatContext *s, AVPacket *pkt) if (!pktsize) return AVERROR_EOF; if (pktsize <= 0) - return AVERROR(EIO); + return AVERROR_INVALIDDATA; pkt->duration = pktsize; } return pkt->size; diff --git a/libavformat/smush.c b/libavformat/smush.c index d380bfbff1..587125dbc0 100644 --- a/libavformat/smush.c +++ b/libavformat/smush.c @@ -235,7 +235,7 @@ static int smush_read_packet(AVFormatContext *ctx, AVPacket *pkt) if (size < 13) return AVERROR_INVALIDDATA; if (av_get_packet(pb, pkt, size) < 13) - return AVERROR(EIO); + return AVERROR_INVALIDDATA; pkt->stream_index = smush->audio_stream_index; pkt->flags |= AV_PKT_FLAG_KEY; diff --git a/libavformat/soxdec.c b/libavformat/soxdec.c index ba349c870e..c710b9a152 100644 --- a/libavformat/soxdec.c +++ b/libavformat/soxdec.c @@ -34,6 +34,7 @@ #include "libavutil/dict.h" #include "libavutil/mem.h" #include "avformat.h" +#include "avio_internal.h" #include "demux.h" #include "internal.h" #include "pcm.h" @@ -106,11 +107,12 @@ static int sox_read_header(AVFormatContext *s) if (comment_size && comment_size < UINT_MAX) { char *comment = av_malloc(comment_size+1); + int ret; if(!comment) return AVERROR(ENOMEM); - if (avio_read(pb, comment, comment_size) != comment_size) { + if ((ret = ffio_read_size(pb, comment, comment_size)) < 0) { av_freep(&comment); - return AVERROR(EIO); + return ret; } comment[comment_size] = 0; diff --git a/libavformat/swfdec.c b/libavformat/swfdec.c index 29eefc68a2..1290f2c70f 100644 --- a/libavformat/swfdec.c +++ b/libavformat/swfdec.c @@ -174,10 +174,10 @@ static int swf_read_header(AVFormatContext *s) pb = swf->zpb; #else av_log(s, AV_LOG_ERROR, "zlib support is required to read SWF compressed files\n"); - return AVERROR(EIO); + return AVERROR(ENOSYS); #endif } else if (tag != MKBETAG('F', 'W', 'S', 0)) - return AVERROR(EIO); + return AVERROR_INVALIDDATA; /* skip rectangle size */ nbits = avio_r8(pb) >> 3; len = (4 * nbits - 3 + 7) / 8; diff --git a/libavformat/thp.c b/libavformat/thp.c index 76db7fc581..c1a7418a2c 100644 --- a/libavformat/thp.c +++ b/libavformat/thp.c @@ -193,7 +193,7 @@ static int thp_read_packet(AVFormatContext *s, if (ret < 0) return ret; if (ret != size) { - return AVERROR(EIO); + return AVERROR_INVALIDDATA; } pkt->stream_index = thp->video_stream_index; @@ -202,7 +202,7 @@ static int thp_read_packet(AVFormatContext *s, if (ret < 0) return ret; if (ret != thp->audiosize) { - return AVERROR(EIO); + return AVERROR_INVALIDDATA; } pkt->stream_index = thp->audio_stream_index; diff --git a/libavformat/tiertexseq.c b/libavformat/tiertexseq.c index 844b98e182..5ee0a00664 100644 --- a/libavformat/tiertexseq.c +++ b/libavformat/tiertexseq.c @@ -27,6 +27,7 @@ #include "libavutil/channel_layout.h" #include "libavutil/mem.h" #include "avformat.h" +#include "avio_internal.h" #include "demux.h" #include "internal.h" @@ -109,6 +110,7 @@ static int seq_init_frame_buffers(SeqDemuxContext *seq, AVIOContext *pb) static int seq_fill_buffer(SeqDemuxContext *seq, AVIOContext *pb, int buffer_num, unsigned int data_offs, int data_size) { TiertexSeqFrameBuffer *seq_buffer; + int ret; if (buffer_num >= SEQ_NUM_FRAME_BUFFERS) return AVERROR_INVALIDDATA; @@ -118,8 +120,8 @@ static int seq_fill_buffer(SeqDemuxContext *seq, AVIOContext *pb, int buffer_num return AVERROR_INVALIDDATA; avio_seek(pb, seq->current_frame_offs + data_offs, SEEK_SET); - if (avio_read(pb, seq_buffer->data + seq_buffer->fill_size, data_size) != data_size) - return AVERROR(EIO); + if ((ret = ffio_read_size(pb, seq_buffer->data + seq_buffer->fill_size, data_size)) < 0) + return ret; seq_buffer->fill_size += data_size; return 0; @@ -273,10 +275,11 @@ static int seq_read_packet(AVFormatContext *s, AVPacket *pkt) pkt->data[0] = 0; if (seq->current_pal_data_size) { + int ret; pkt->data[0] |= 1; avio_seek(pb, seq->current_frame_offs + seq->current_pal_data_offs, SEEK_SET); - if (avio_read(pb, &pkt->data[1], seq->current_pal_data_size) != seq->current_pal_data_size) - return AVERROR(EIO); + if ((ret = ffio_read_size(pb, &pkt->data[1], seq->current_pal_data_size)) < 0) + return ret; } if (seq->current_video_data_size) { pkt->data[0] |= 2; @@ -295,7 +298,7 @@ static int seq_read_packet(AVFormatContext *s, AVPacket *pkt) /* audio packet */ if (seq->current_audio_data_offs == 0) /* end of data reached */ - return AVERROR(EIO); + return 0; avio_seek(pb, seq->current_frame_offs + seq->current_audio_data_offs, SEEK_SET); rc = av_get_packet(pb, pkt, seq->current_audio_data_size); diff --git a/libavformat/ty.c b/libavformat/ty.c index f524b74bad..acd5e62157 100644 --- a/libavformat/ty.c +++ b/libavformat/ty.c @@ -303,7 +303,7 @@ static int ty_read_header(AVFormatContext *s) if (ty->tivo_series == TIVO_SERIES_UNKNOWN || ty->audio_type == TIVO_AUDIO_UNKNOWN || ty->tivo_type == TIVO_TYPE_UNKNOWN) - return AVERROR(EIO); + return AVERROR_INVALIDDATA; st = avformat_new_stream(s, NULL); if (!st) diff --git a/libavformat/vc1test.c b/libavformat/vc1test.c index 394a70c1ac..239b35bf33 100644 --- a/libavformat/vc1test.c +++ b/libavformat/vc1test.c @@ -108,7 +108,7 @@ static int vc1t_read_packet(AVFormatContext *s, keyframe = 1; pts = avio_rl32(pb); if(av_get_packet(pb, pkt, frame_size) < 0) - return AVERROR(EIO); + return AVERROR_INVALIDDATA; if(s->streams[0]->time_base.den == 1000) pkt->pts = pts; pkt->flags |= keyframe ? AV_PKT_FLAG_KEY : 0; diff --git a/libavformat/vividas.c b/libavformat/vividas.c index dd25539201..b708d71c65 100644 --- a/libavformat/vividas.c +++ b/libavformat/vividas.c @@ -601,7 +601,7 @@ static int viv_read_header(AVFormatContext *s) k2 = b22_key; buf = read_vblock(pb, &v, b22_key, &k2, 0); if (!buf) - return AVERROR(EIO); + return AVERROR_INVALIDDATA; av_free(buf); } @@ -609,7 +609,7 @@ static int viv_read_header(AVFormatContext *s) k2 = key; buf = read_vblock(pb, &v, key, &k2, 0); if (!buf) - return AVERROR(EIO); + return AVERROR_INVALIDDATA; ret = track_header(viv, s, buf, v); av_free(buf); if (ret < 0) @@ -617,7 +617,7 @@ static int viv_read_header(AVFormatContext *s) buf = read_vblock(pb, &v, key, &k2, v); if (!buf) - return AVERROR(EIO); + return AVERROR_INVALIDDATA; ret = track_index(viv, s, buf, v); av_free(buf); if (ret < 0) @@ -643,7 +643,7 @@ static int viv_read_packet(AVFormatContext *s, int ret; if (!viv->sb_pb) - return AVERROR(EIO); + return AVERROR_INVALIDDATA; if (avio_feof(viv->sb_pb)) return AVERROR_EOF; @@ -670,7 +670,7 @@ static int viv_read_packet(AVFormatContext *s, if (viv->current_sb_entry >= viv->n_sb_entries) { if (viv->current_sb+1 >= viv->n_sb_blocks) - return AVERROR(EIO); + return AVERROR_INVALIDDATA; viv->current_sb++; load_sb_block(s, viv, 0); @@ -679,7 +679,7 @@ static int viv_read_packet(AVFormatContext *s, pb = viv->sb_pb; if (!pb) - return AVERROR(EIO); + return AVERROR_INVALIDDATA; off = avio_tell(pb); if (viv->current_sb_entry >= viv->n_sb_entries) diff --git a/libavformat/voc_packet.c b/libavformat/voc_packet.c index 32f8b29aa7..cee6ac5746 100644 --- a/libavformat/voc_packet.c +++ b/libavformat/voc_packet.c @@ -53,7 +53,7 @@ ff_voc_get_packet(AVFormatContext *s, AVPacket *pkt, AVStream *st, int max_size) if (!voc->remaining_size) { int64_t filesize; if (!(s->pb->seekable & AVIO_SEEKABLE_NORMAL)) - return AVERROR(EIO); + return AVERROR(ENOSYS); filesize = avio_size(pb); if (filesize - avio_tell(pb) > INT_MAX) return AVERROR_INVALIDDATA; diff --git a/libavformat/vpk.c b/libavformat/vpk.c index 001ad33555..f6270a11ae 100644 --- a/libavformat/vpk.c +++ b/libavformat/vpk.c @@ -21,6 +21,7 @@ #include "libavutil/intreadwrite.h" #include "avformat.h" +#include "avio_internal.h" #include "demux.h" #include "internal.h" @@ -94,10 +95,10 @@ static int vpk_read_packet(AVFormatContext *s, AVPacket *pkt) if (ret < 0) return ret; for (i = 0; i < par->ch_layout.nb_channels; i++) { - ret = avio_read(s->pb, pkt->data + i * size, size); + ret = ffio_read_size(s->pb, pkt->data + i * size, size); avio_skip(s->pb, skip); - if (ret != size) { - return AVERROR(EIO); + if (ret < 0) { + return ret; } } pkt->pos = pos; diff --git a/libavformat/wavarc.c b/libavformat/wavarc.c index 9d7029f209..6467d7d578 100644 --- a/libavformat/wavarc.c +++ b/libavformat/wavarc.c @@ -71,8 +71,8 @@ static int wavarc_read_header(AVFormatContext *s) return AVERROR_INVALIDDATA; id = avio_rl32(pb); w->data_end = avio_tell(pb); - if (avio_read(pb, data, sizeof(data)) != sizeof(data)) - return AVERROR(EIO); + if ((ret = ffio_read_size(pb, data, sizeof(data))) < 0) + return ret; w->data_end += 16LL + AV_RL32(data + 4); fmt_len = AV_RL32(data + 32); if (fmt_len < 12) diff --git a/libavformat/wc3movie.c b/libavformat/wc3movie.c index f4063353b6..b4e7f1e31d 100644 --- a/libavformat/wc3movie.c +++ b/libavformat/wc3movie.c @@ -33,6 +33,7 @@ #include "libavutil/dict.h" #include "libavutil/mem.h" #include "avformat.h" +#include "avio_internal.h" #include "demux.h" #include "internal.h" @@ -141,9 +142,9 @@ static int wc3_read_header(AVFormatContext *s) buffer = av_malloc(size+1); if (!buffer) return AVERROR(ENOMEM); - if ((ret = avio_read(pb, buffer, size)) != size) { + if ((ret = ffio_read_size(pb, buffer, size)) < 0) { av_freep(&buffer); - return AVERROR(EIO); + return ret; } buffer[size] = 0; av_dict_set(&s->metadata, "title", buffer, @@ -172,7 +173,7 @@ static int wc3_read_header(AVFormatContext *s) /* chunk sizes are 16-bit aligned */ size = (avio_rb32(pb) + 1) & (~1); if (avio_feof(pb)) - return AVERROR(EIO); + return AVERROR_INVALIDDATA; } while (fourcc_tag != BRCH_TAG); @@ -223,7 +224,7 @@ static int wc3_read_packet(AVFormatContext *s, /* chunk sizes are 16-bit aligned */ size = (avio_rb32(pb) + 1) & (~1); if (avio_feof(pb)) - return AVERROR(EIO); + return AVERROR_INVALIDDATA; switch (fourcc_tag) { @@ -252,9 +253,9 @@ static int wc3_read_packet(AVFormatContext *s, case TEXT_TAG: /* subtitle chunk */ - if ((unsigned)size > sizeof(text) || (ret = avio_read(pb, text, size)) != size) - ret = AVERROR(EIO); - else { + if ((unsigned)size > sizeof(text)) + ret = AVERROR_INVALIDDATA; + else if ((ret = ffio_read_size(pb, text, size)) == size) { int i = 0; av_log (s, AV_LOG_DEBUG, "Subtitle time!\n"); if (i >= size || av_strnlen(&text[i + 1], size - i - 1) >= size - i - 1) diff --git a/libavformat/westwood_aud.c b/libavformat/westwood_aud.c index f83913a22f..68b60be5b1 100644 --- a/libavformat/westwood_aud.c +++ b/libavformat/westwood_aud.c @@ -36,6 +36,7 @@ #include "libavutil/channel_layout.h" #include "libavutil/intreadwrite.h" #include "avformat.h" +#include "avio_internal.h" #include "demux.h" #include "internal.h" @@ -87,9 +88,10 @@ static int wsaud_read_header(AVFormatContext *s) AVStream *st; unsigned char header[AUD_HEADER_SIZE]; int sample_rate, channels, codec; + int ret; - if (avio_read(pb, header, AUD_HEADER_SIZE) != AUD_HEADER_SIZE) - return AVERROR(EIO); + if ((ret = ffio_read_size(pb, header, AUD_HEADER_SIZE)) < 0) + return ret; sample_rate = AV_RL16(&header[0]); channels = (header[10] & 0x1) + 1; @@ -134,9 +136,8 @@ static int wsaud_read_packet(AVFormatContext *s, int ret = 0; AVStream *st = s->streams[0]; - if (avio_read(pb, preamble, AUD_CHUNK_PREAMBLE_SIZE) != - AUD_CHUNK_PREAMBLE_SIZE) - return AVERROR(EIO); + if ((ret = ffio_read_size(pb, preamble, AUD_CHUNK_PREAMBLE_SIZE)) < 0) + return ret; /* validate the chunk */ if (AV_RL32(&preamble[4]) != AUD_CHUNK_SIGNATURE) @@ -152,8 +153,8 @@ static int wsaud_read_packet(AVFormatContext *s, int out_size = AV_RL16(&preamble[2]); if ((ret = av_new_packet(pkt, chunk_size + 4)) < 0) return ret; - if ((ret = avio_read(pb, &pkt->data[4], chunk_size)) != chunk_size) - return ret < 0 ? ret : AVERROR(EIO); + if ((ret = ffio_read_size(pb, &pkt->data[4], chunk_size)) < 0) + return ret; AV_WL16(&pkt->data[0], out_size); AV_WL16(&pkt->data[2], chunk_size); @@ -161,7 +162,7 @@ static int wsaud_read_packet(AVFormatContext *s, } else { ret = av_get_packet(pb, pkt, chunk_size); if (ret != chunk_size) - return AVERROR(EIO); + return AVERROR_INVALIDDATA; if (st->codecpar->ch_layout.nb_channels <= 0) { av_log(s, AV_LOG_ERROR, "invalid number of channels %d\n", diff --git a/libavformat/westwood_vqa.c b/libavformat/westwood_vqa.c index 9755fcc9c1..8e5179f697 100644 --- a/libavformat/westwood_vqa.c +++ b/libavformat/westwood_vqa.c @@ -138,8 +138,8 @@ static int wsvqa_read_header(AVFormatContext *s) /* there are 0 or more chunks before the FINF chunk; iterate until * FINF has been skipped and the file will be ready to be demuxed */ do { - if (avio_read(pb, scratch, VQA_PREAMBLE_SIZE) != VQA_PREAMBLE_SIZE) - return AVERROR(EIO); + if ((ret = ffio_read_size(pb, scratch, VQA_PREAMBLE_SIZE)) < 0) + return ret; chunk_tag = AV_RB32(&scratch[0]); chunk_size = AV_RB32(&scratch[4]); @@ -211,7 +211,7 @@ static int wsvqa_read_packet(AVFormatContext *s, ret= av_get_packet(pb, pkt, chunk_size); if (ret<0) - return AVERROR(EIO); + return AVERROR_INVALIDDATA; switch (chunk_type) { case SND0_TAG: @@ -272,20 +272,20 @@ static int wsvqa_read_packet(AVFormatContext *s, /* if a new codebook is available inside an earlier a VQFL chunk then * append it to 'pkt' */ if (wsvqa->vqfl_chunk_size > 0) { - int64_t current_pos = pkt->pos; + int64_t ret64, current_pos = pkt->pos; - if (avio_seek(pb, wsvqa->vqfl_chunk_pos, SEEK_SET) < 0) - return AVERROR(EIO); + if ((ret64 = avio_seek(pb, wsvqa->vqfl_chunk_pos, SEEK_SET)) < 0) + return (int)ret64; /* the decoder expects chunks to be 16-bit aligned */ if (wsvqa->vqfl_chunk_size % 2 == 1) wsvqa->vqfl_chunk_size++; if (av_append_packet(pb, pkt, wsvqa->vqfl_chunk_size) < 0) - return AVERROR(EIO); + return AVERROR_INVALIDDATA; - if (avio_seek(pb, current_pos, SEEK_SET) < 0) - return AVERROR(EIO); + if ((ret64 = avio_seek(pb, current_pos, SEEK_SET)) < 0) + return (int)ret64; wsvqa->vqfl_chunk_pos = 0; wsvqa->vqfl_chunk_size = 0; diff --git a/libavformat/wsddec.c b/libavformat/wsddec.c index b0bf49cb04..f36c254621 100644 --- a/libavformat/wsddec.c +++ b/libavformat/wsddec.c @@ -24,6 +24,7 @@ #include "libavutil/mem.h" #include "libavutil/timecode.h" #include "avformat.h" +#include "avio_internal.h" #include "demux.h" #include "rawdec.h" @@ -73,6 +74,7 @@ static int wsd_to_av_channel_layoyt(AVFormatContext *s, int bit) static int get_metadata(AVFormatContext *s, const char *const tag, const unsigned size) { uint8_t *buf; + int ret; if (!(size + 1)) return AVERROR(ENOMEM); @@ -80,9 +82,9 @@ static int get_metadata(AVFormatContext *s, const char *const tag, const unsigne if (!buf) return AVERROR(ENOMEM); - if (avio_read(s->pb, buf, size) != size) { + if ((ret = avio_read(s->pb, buf, size)) < 0) { av_free(buf); - return AVERROR(EIO); + return ret; } if (empty_string(buf, size)) { diff --git a/libavformat/wtvdec.c b/libavformat/wtvdec.c index 9d26e35e22..1f299510c9 100644 --- a/libavformat/wtvdec.c +++ b/libavformat/wtvdec.c @@ -761,7 +761,7 @@ static int recover(WtvContext *wtv, uint64_t broken_pos) return 0; } } - return AVERROR(EIO); + return AVERROR_INVALIDDATA; } /** diff --git a/libavformat/wvdec.c b/libavformat/wvdec.c index e2a79957f7..e69f42baf5 100644 --- a/libavformat/wvdec.c +++ b/libavformat/wvdec.c @@ -23,6 +23,7 @@ #include "libavutil/intreadwrite.h" #include "libavutil/dict.h" #include "avformat.h" +#include "avio_internal.h" #include "demux.h" #include "internal.h" #include "apetag.h" @@ -295,9 +296,9 @@ static int wv_read_packet(AVFormatContext *s, AVPacket *pkt) if ((ret = av_new_packet(pkt, wc->header.blocksize + WV_HEADER_SIZE)) < 0) return ret; memcpy(pkt->data, wc->block_header, WV_HEADER_SIZE); - ret = avio_read(s->pb, pkt->data + WV_HEADER_SIZE, wc->header.blocksize); - if (ret != wc->header.blocksize) { - return AVERROR(EIO); + ret = ffio_read_size(s->pb, pkt->data + WV_HEADER_SIZE, wc->header.blocksize); + if (ret < 0) { + return ret; } while (!(wc->header.flags & WV_FLAG_FINAL_BLOCK)) { if ((ret = wv_read_block_header(s, s->pb)) < 0) { diff --git a/libavformat/xmv.c b/libavformat/xmv.c index ed59f7b85b..c0b402860e 100644 --- a/libavformat/xmv.c +++ b/libavformat/xmv.c @@ -31,6 +31,7 @@ #include "libavutil/mem.h" #include "avformat.h" +#include "avio_internal.h" #include "demux.h" #include "internal.h" #include "riff.h" @@ -273,8 +274,8 @@ static int xmv_process_packet_header(AVFormatContext *s) /* Packet video header */ - if (avio_read(pb, data, 8) != 8) - return AVERROR(EIO); + if ((ret = ffio_read_size(pb, data, 8)) < 0) + return ret; xmv->video.data_size = AV_RL32(data) & 0x007FFFFF; @@ -325,8 +326,8 @@ static int xmv_process_packet_header(AVFormatContext *s) for (audio_track = 0; audio_track < xmv->audio_track_count; audio_track++) { XMVAudioPacket *packet = &xmv->audio[audio_track]; - if (avio_read(pb, data, 4) != 4) - return AVERROR(EIO); + if ((ret = ffio_read_size(pb, data, 4)) < 0) + return ret; if (!packet->created) { AVStream *ast = avformat_new_stream(s, NULL); @@ -417,12 +418,12 @@ static int xmv_fetch_new_packet(AVFormatContext *s) /* Seek to it */ xmv->this_packet_offset = xmv->next_packet_offset; if (avio_seek(pb, xmv->this_packet_offset, SEEK_SET) != xmv->this_packet_offset) - return AVERROR(EIO); + return AVERROR_INVALIDDATA; /* Update the size */ xmv->this_packet_size = xmv->next_packet_size; if (xmv->this_packet_size < (12 + xmv->audio_track_count * 4)) - return AVERROR(EIO); + return AVERROR_INVALIDDATA; /* Process the header */ result = xmv_process_packet_header(s); @@ -448,7 +449,7 @@ static int xmv_fetch_audio_packet(AVFormatContext *s, /* Seek to it */ if (avio_seek(pb, audio->data_offset, SEEK_SET) != audio->data_offset) - return AVERROR(EIO); + return AVERROR_INVALIDDATA; if ((xmv->video.current_frame + 1) < xmv->video.frame_count) /* Not the last frame, get at most frame_size bytes. */ @@ -495,7 +496,7 @@ static int xmv_fetch_video_packet(AVFormatContext *s, /* Seek to it */ if (avio_seek(pb, video->data_offset, SEEK_SET) != video->data_offset) - return AVERROR(EIO); + return AVERROR_INVALIDDATA; /* Read the frame header */ frame_header = avio_rl32(pb); @@ -504,7 +505,7 @@ static int xmv_fetch_video_packet(AVFormatContext *s, frame_timestamp = (frame_header >> 17); if ((frame_size + 4) > video->data_size) - return AVERROR(EIO); + return AVERROR_INVALIDDATA; /* Get the packet data */ result = av_get_packet(pb, pkt, frame_size); diff --git a/libavformat/yuv4mpegdec.c b/libavformat/yuv4mpegdec.c index 2b66a1e596..5c21858908 100644 --- a/libavformat/yuv4mpegdec.c +++ b/libavformat/yuv4mpegdec.c @@ -291,7 +291,7 @@ static int yuv4_read_packet(AVFormatContext *s, AVPacket *pkt) if (ret < 0) return ret; else if (ret != s->packet_size - Y4M_FRAME_MAGIC_LEN) { - return s->pb->eof_reached ? AVERROR_EOF : AVERROR(EIO); + return s->pb->eof_reached ? AVERROR_EOF : AVERROR_INVALIDDATA; } pkt->stream_index = 0; pkt->pts = (off - ffformatcontext(s)->data_offset) / s->packet_size; diff --git a/libavformat/yuv4mpegenc.c b/libavformat/yuv4mpegenc.c index 35397cbde0..371d3745c1 100644 --- a/libavformat/yuv4mpegenc.c +++ b/libavformat/yuv4mpegenc.c @@ -282,7 +282,7 @@ static int yuv4_init(AVFormatContext *s) "gray9, gray10, gray12 " "and gray16 pixel formats. " "Use -pix_fmt to select one.\n"); - return AVERROR(EIO); + return AVERROR_INVALIDDATA; } return 0; -- 2.49.1 >From 3efb2f4f38251bcbd2bef3ac3516fcde9b9a2a4a Mon Sep 17 00:00:00 2001 From: James Almer <[email protected]> Date: Sat, 15 Nov 2025 13:23:54 -0300 Subject: [PATCH 2/2] fftools/ffmpeg_demux: exit on EIO errors returned by demuxers These are unrecoverable and generated by underlying protocols, so there's no point in trying to continue. Signed-off-by: James Almer <[email protected]> --- fftools/ffmpeg_demux.c | 2 +- libavformat/4xm.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/fftools/ffmpeg_demux.c b/fftools/ffmpeg_demux.c index cb79dd7611..e795e312fe 100644 --- a/fftools/ffmpeg_demux.c +++ b/fftools/ffmpeg_demux.c @@ -759,7 +759,7 @@ static int input_thread(void *arg) else { av_log(d, AV_LOG_ERROR, "Error during demuxing: %s\n", av_err2str(ret)); - ret = exit_on_error ? ret : 0; + ret = exit_on_error || ret == AVERROR(EIO) ? ret : 0; } ret_bsf = demux_bsf_flush(d, &dt); diff --git a/libavformat/4xm.c b/libavformat/4xm.c index 686e1db4be..d2442f3160 100644 --- a/libavformat/4xm.c +++ b/libavformat/4xm.c @@ -241,7 +241,7 @@ static int fourxm_read_header(AVFormatContext *s) if (!header) return AVERROR(ENOMEM); ret = ffio_read_size(pb, header, header_size); - if (ret < 0) { + if (ret < 0) { av_free(header); return ret; } -- 2.49.1 _______________________________________________ ffmpeg-devel mailing list -- [email protected] To unsubscribe send an email to [email protected]
