diff --git a/libavformat/file.c b/libavformat/file.c index e21148e2b464f0bee4418b055fc89800ef440e52..defe3165e2c73a8f294051a181ba248759c353ba 100644 --- a/libavformat/file.c +++ b/libavformat/file.c @@ -135,12 +135,17 @@ static int file_open(URLContext *h, const char *filename, int flags) static int64_t file_seek(URLContext *h, int64_t pos, int whence) { FileContext *c = h->priv_data; + int ret; + if (whence == AVSEEK_SIZE) { struct stat st; - int ret = fstat(c->fd, &st); + ret = fstat(c->fd, &st); return ret < 0 ? AVERROR(errno) : (S_ISFIFO(st.st_mode) ? 0 : st.st_size); } - return lseek(c->fd, pos, whence); + + ret = lseek(c->fd, pos, whence); + + return ret < 0 ? AVERROR(errno) : ret; } static int file_close(URLContext *h) diff --git a/libavformat/mov.c b/libavformat/mov.c index 078bd3f8eabf5f369bb0f11014d52dfaef4357f2..0bcdb21b88592121ef50630be39ac9ab6453f230 100644 --- a/libavformat/mov.c +++ b/libavformat/mov.c @@ -1204,16 +1204,16 @@ int ff_mov_read_stsd_entries(MOVContext *c, AVIOContext *pb, int entries) int dref_id = 1; MOVAtom a = { AV_RL32("stsd") }; int64_t start_pos = avio_tell(pb); - int size = avio_rb32(pb); /* size */ + int64_t size = avio_rb32(pb); /* size */ uint32_t format = avio_rl32(pb); /* data format */ if (size >= 16) { avio_rb32(pb); /* reserved */ avio_rb16(pb); /* reserved */ dref_id = avio_rb16(pb); - }else if (size <= 0){ + }else if (size <= 7){ av_log(c->fc, AV_LOG_ERROR, "invalid size %d in stsd\n", size); - return -1; + return AVERROR_INVALIDDATA; } if (st->codec->codec_tag &&