summaryrefslogtreecommitdiffstats
path: root/contrib/libdvdread
diff options
context:
space:
mode:
authorJohn Stebbins <[email protected]>2017-01-21 13:39:24 -0800
committerJohn Stebbins <[email protected]>2017-01-21 13:42:56 -0800
commitd95c6c272d277f4d507c82d5a909f42566cfbb66 (patch)
treebf678d5b959cb27b51a7199ce089660436d78ee1 /contrib/libdvdread
parent209cce53642883d91c8b49205163112acf43905e (diff)
dvdread: Don't ignore errors from UDFReadBlocks
Fixes https://github.com/HandBrake/HandBrake/issues/535
Diffstat (limited to 'contrib/libdvdread')
-rw-r--r--contrib/libdvdread/A01-UDFReadBlocks-errors.patch162
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;