wtv: permit root table and first sectors to be located beyond 2GB boundary
Fixes ticket #2025. Signed-off-by: Peter Ross <pross@xvid.org>
This commit is contained in:
		@@ -149,7 +149,7 @@ static AVIOContext * wtvfile_open_sector(int first_sector, uint64_t length, int
 | 
			
		||||
    WtvFile *wf;
 | 
			
		||||
    uint8_t *buffer;
 | 
			
		||||
 | 
			
		||||
    if (avio_seek(s->pb, first_sector << WTV_SECTOR_BITS, SEEK_SET) < 0)
 | 
			
		||||
    if (avio_seek(s->pb, (int64_t)first_sector << WTV_SECTOR_BITS, SEEK_SET) < 0)
 | 
			
		||||
        return NULL;
 | 
			
		||||
 | 
			
		||||
    wf = av_mallocz(sizeof(WtvFile));
 | 
			
		||||
@@ -922,7 +922,7 @@ static int read_header(AVFormatContext *s)
 | 
			
		||||
    avio_skip(s->pb, 4);
 | 
			
		||||
    root_sector = avio_rl32(s->pb);
 | 
			
		||||
 | 
			
		||||
    avio_seek(s->pb, root_sector << WTV_SECTOR_BITS, SEEK_SET);
 | 
			
		||||
    avio_seek(s->pb, (int64_t)root_sector << WTV_SECTOR_BITS, SEEK_SET);
 | 
			
		||||
    root_size = avio_read(s->pb, root, root_size);
 | 
			
		||||
    if (root_size < 0)
 | 
			
		||||
        return AVERROR_INVALIDDATA;
 | 
			
		||||
 
 | 
			
		||||
@@ -546,7 +546,7 @@ static void write_fat(AVIOContext *pb, int start_sector, int nb_sectors, int shi
 | 
			
		||||
    write_pad(pb, WTV_SECTOR_SIZE - ((nb_sectors << 2) % WTV_SECTOR_SIZE));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int write_fat_sector(AVFormatContext *s, int64_t start_pos, int nb_sectors, int sector_bits, int depth)
 | 
			
		||||
static int64_t write_fat_sector(AVFormatContext *s, int64_t start_pos, int nb_sectors, int sector_bits, int depth)
 | 
			
		||||
{
 | 
			
		||||
    int64_t start_sector = start_pos >> WTV_SECTOR_BITS;
 | 
			
		||||
    int shift = sector_bits - WTV_SECTOR_BITS;
 | 
			
		||||
@@ -672,11 +672,10 @@ static int finish_file(AVFormatContext *s, enum WtvFileIndex index, int64_t star
 | 
			
		||||
 | 
			
		||||
    //write fat table
 | 
			
		||||
    if (w->depth > 0) {
 | 
			
		||||
        w->first_sector = write_fat_sector(s, start_pos, nb_sectors, sector_bits, w->depth);
 | 
			
		||||
        w->first_sector = write_fat_sector(s, start_pos, nb_sectors, sector_bits, w->depth) >> WTV_SECTOR_BITS;
 | 
			
		||||
    } else {
 | 
			
		||||
        w->first_sector = start_pos;
 | 
			
		||||
        w->first_sector = start_pos >> WTV_SECTOR_BITS;
 | 
			
		||||
    }
 | 
			
		||||
    w->first_sector >>= WTV_SECTOR_BITS;
 | 
			
		||||
 | 
			
		||||
    w->length |= 1ULL<<60;
 | 
			
		||||
    if (sector_bits == WTV_SECTOR_BITS)
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user