diff options
author | John Stebbins <[email protected]> | 2017-01-21 13:39:24 -0800 |
---|---|---|
committer | John Stebbins <[email protected]> | 2017-01-21 13:42:56 -0800 |
commit | d95c6c272d277f4d507c82d5a909f42566cfbb66 (patch) | |
tree | bf678d5b959cb27b51a7199ce089660436d78ee1 /contrib | |
parent | 209cce53642883d91c8b49205163112acf43905e (diff) |
dvdread: Don't ignore errors from UDFReadBlocks
Fixes https://github.com/HandBrake/HandBrake/issues/535
Diffstat (limited to 'contrib')
-rw-r--r-- | contrib/libdvdread/A01-UDFReadBlocks-errors.patch | 162 |
1 files changed, 162 insertions, 0 deletions
diff --git a/contrib/libdvdread/A01-UDFReadBlocks-errors.patch b/contrib/libdvdread/A01-UDFReadBlocks-errors.patch new file mode 100644 index 000000000..98edbe33e --- /dev/null +++ b/contrib/libdvdread/A01-UDFReadBlocks-errors.patch @@ -0,0 +1,162 @@ +diff --git a/src/dvd_reader.c b/src/dvd_reader.c +index 4e112d3..e8d50f3 100644 +--- a/src/dvd_reader.c ++++ b/src/dvd_reader.c +@@ -1156,13 +1156,13 @@ int InternalUDFReadBlocksRaw( const dvd_reader_t *device, uint32_t lb_number, + + if( !device->dev ) { + fprintf( stderr, "libdvdread: Fatal error in block read.\n" ); +- return 0; ++ return -1; + } + + ret = dvdinput_seek( device->dev, (int) lb_number ); + if( ret != (int) lb_number ) { + fprintf( stderr, "libdvdread: Can't seek to block %u\n", lb_number ); +- return 0; ++ return ret; + } + + ret = dvdinput_read( device->dev, (char *) data, +diff --git a/src/dvd_udf.c b/src/dvd_udf.c +index 5eb3d2b..68c3a9a 100644 +--- a/src/dvd_udf.c ++++ b/src/dvd_udf.c +@@ -516,6 +516,7 @@ static int UDFMapICB( dvd_reader_t *device, struct AD ICB, uint8_t *FileType, + uint32_t lbnum; + uint16_t TagID; + struct icbmap tmpmap; ++ int ret; + + lbnum = partition->Start + ICB.Location; + tmpmap.lbn = lbnum; +@@ -526,10 +527,16 @@ static int UDFMapICB( dvd_reader_t *device, struct AD ICB, uint8_t *FileType, + } + + do { +- if( DVDReadLBUDF( device, lbnum++, 1, LogBlock, 0 ) <= 0 ) ++ ret = DVDReadLBUDF( device, lbnum++, 1, LogBlock, 0 ); ++ if( ret < 0 ) { ++ return ret; ++ } ++ else if( ret == 0 ) { + TagID = 0; +- else ++ } ++ else { + UDFDescriptor( LogBlock, &TagID ); ++ } + + if( TagID == FileEntry ) { + UDFFileEntry( LogBlock, FileType, partition, File ); +@@ -677,6 +688,7 @@ static int UDFGetAVDP( dvd_reader_t *device, + uint32_t lastsector; + int terminate; + struct avdp_t; ++ int ret; + + if(GetUDFCache(device, AVDPCache, 0, avdp)) + return 1; +@@ -687,11 +699,16 @@ static int UDFGetAVDP( dvd_reader_t *device, + terminate = 0; + + for(;;) { +- if( DVDReadLBUDF( device, lbnum, 1, Anchor, 0 ) > 0 ) { +- UDFDescriptor( Anchor, &TagID ); +- } else { ++ ret = DVDReadLBUDF( device, lbnum, 1, Anchor, 0 ); ++ if( ret < 0 ) { ++ return ret; ++ } ++ else if( ret == 0 ) { + TagID = 0; + } ++ else { ++ UDFDescriptor( Anchor, &TagID ); ++ } + if (TagID != AnchorVolumeDescriptorPointer) { + /* Not an anchor */ + if( terminate ) return 0; /* Final try failed */ +@@ -742,7 +759,7 @@ static int UDFFindPartition( dvd_reader_t *device, int partnum, + uint8_t *LogBlock = (uint8_t *)(((uintptr_t)LogBlock_base & ~((uintptr_t)2047)) + 2048); + uint32_t lbnum, MVDS_location, MVDS_length; + uint16_t TagID; +- int i, volvalid; ++ int i, volvalid, ret; + struct avdp_t avdp; + + if(!UDFGetAVDP(device, &avdp)) +@@ -761,10 +778,16 @@ static int UDFFindPartition( dvd_reader_t *device, int partnum, + lbnum = MVDS_location; + do { + +- if( DVDReadLBUDF( device, lbnum++, 1, LogBlock, 0 ) <= 0 ) ++ ret = DVDReadLBUDF( device, lbnum++, 1, LogBlock, 0 ); ++ if( ret < 0 ) { ++ return ret; ++ } ++ else if( ret == 0 ) { + TagID = 0; +- else ++ } ++ else { + UDFDescriptor( LogBlock, &TagID ); ++ } + + if( ( TagID == PartitionDescriptor ) && ( !part->valid ) ) { + /* Partition Descriptor */ +@@ -805,6 +828,7 @@ uint32_t UDFFindFile( dvd_reader_t *device, const char *filename, + struct AD RootICB, File, ICB; + char tokenline[ MAX_UDF_FILE_NAME_LEN ]; + uint8_t filetype; ++ int ret; + + *filesize = 0; + tokenline[0] = '\0'; +@@ -820,10 +844,16 @@ uint32_t UDFFindFile( dvd_reader_t *device, const char *filename, + /* Find root dir ICB */ + lbnum = partition.Start; + do { +- if( DVDReadLBUDF( device, lbnum++, 1, LogBlock, 0 ) <= 0 ) ++ ret = DVDReadLBUDF( device, lbnum++, 1, LogBlock, 0 ); ++ if( ret < 0 ) { ++ return ret; ++ } ++ else if( ret == 0 ) { + TagID = 0; +- else ++ } ++ else { + UDFDescriptor( LogBlock, &TagID ); ++ } + + /* File Set Descriptor */ + if( TagID == FileSetDescriptor ) /* File Set Descriptor */ +@@ -886,7 +916,7 @@ static int UDFGetDescriptor( dvd_reader_t *device, int id, + uint32_t lbnum, MVDS_location, MVDS_length; + struct avdp_t avdp; + uint16_t TagID; +- int i, desc_found = 0; ++ int i, desc_found = 0, ret; + /* Find Anchor */ + lbnum = 256; /* Try #1, prime anchor */ + if(bufsize < DVD_VIDEO_LB_LEN) +@@ -904,10 +934,16 @@ static int UDFGetDescriptor( dvd_reader_t *device, int id, + /* Find Descriptor */ + lbnum = MVDS_location; + do { +- if( DVDReadLBUDF( device, lbnum++, 1, descriptor, 0 ) <= 0 ) ++ ret = DVDReadLBUDF( device, lbnum++, 1, descriptor, 0 ); ++ if( ret < 0 ) { ++ return ret; ++ } ++ else if( ret == 0 ) { + TagID = 0; +- else ++ } ++ else { + UDFDescriptor( descriptor, &TagID ); ++ } + if( (TagID == id) && ( !desc_found ) ) + /* Descriptor */ + desc_found = 1; |