OSDN Git Service

Detect bogus cell start and last addresses while scanning each title so we don't...
authorvan <van@b64f7644-9d1e-0410-96f1-a4d463321fa5>
Wed, 11 Mar 2009 05:11:02 +0000 (05:11 +0000)
committervan <van@b64f7644-9d1e-0410-96f1-a4d463321fa5>
Wed, 11 Mar 2009 05:11:02 +0000 (05:11 +0000)
git-svn-id: svn://localhost/HandBrake/trunk@2256 b64f7644-9d1e-0410-96f1-a4d463321fa5

libhb/dvd.c

index 85fe47e..240d3bc 100644 (file)
@@ -235,6 +235,37 @@ hb_title_t * hb_dvd_title_scan( hb_dvd_t * d, int t )
         goto fail;
     }
 
+    /* ignore titles with bogus cell addresses so we don't abort later
+     * in libdvdread. */
+    for ( i = 0; i < vts->vts_c_adt->nr_of_vobs; ++i)
+    {
+        if( (vts->vts_c_adt->cell_adr_table[i].start_sector & 0xffffff ) ==
+            0xffffff )
+        {
+            hb_error( "scan: cell_adr_table[%d].start_sector invalid (0x%x) "
+                      "- skipping title", i,
+                      vts->vts_c_adt->cell_adr_table[i].start_sector );
+            goto fail;
+        }
+        if( (vts->vts_c_adt->cell_adr_table[i].last_sector & 0xffffff ) ==
+            0xffffff )
+        {
+            hb_error( "scan: cell_adr_table[%d].last_sector invalid (0x%x) "
+                      "- skipping title", i,
+                      vts->vts_c_adt->cell_adr_table[i].last_sector );
+            goto fail;
+        }
+        if( vts->vts_c_adt->cell_adr_table[i].start_sector >=
+            vts->vts_c_adt->cell_adr_table[i].last_sector )
+        {
+            hb_error( "scan: cell_adr_table[%d].start_sector (0x%x) "
+                      "is not before last_sector (0x%x) - skipping title", i,
+                      vts->vts_c_adt->cell_adr_table[i].start_sector,
+                      vts->vts_c_adt->cell_adr_table[i].last_sector );
+            goto fail;
+        }
+    }
+
     /* Detect languages */
     for( i = 0; i < vts->vtsi_mat->nr_of_vts_audio_streams; i++ )
     {