changeset 72:99af5ed114a4 src

Fix segfault when reading certain DVDs, for example "Thor". This results from a new anti-copy scheme where the real video_ts.ifo is hidden. Use of the decoy video_ts.ifo results in a unplayable DVD. Patch by Alexander Roalter \alex!roalter*it/. Verified by John Stebbins |stebbins%jethaddev&com|.
author rathann
date Thu, 06 Oct 2011 12:10:01 +0000
parents df32da8e44b1
children 933bbcf89338
files dvd_udf.c
diffstat 1 files changed, 6 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/dvd_udf.c	Sat Aug 13 17:28:48 2011 +0000
+++ b/dvd_udf.c	Thu Oct 06 12:10:01 2011 +0000
@@ -329,16 +329,17 @@
 static int Unicodedecode( uint8_t *data, int len, char *target )
 {
   int p = 1, i = 0;
+  int err = 0;
 
   if( ( data[ 0 ] == 8 ) || ( data[ 0 ] == 16 ) ) do {
-    if( data[ 0 ] == 16 ) p++;  /* Ignore MSB of unicode16 */
+    if( data[ 0 ] == 16 ) err |= data[p++];  /* character cannot be converted to 8bit, return error */
     if( p < len ) {
       target[ i++ ] = data[ p++ ];
     }
   } while( p < len );
 
   target[ i ] = '\0';
-  return 0;
+  return !err;
 }
 
 static int UDFDescriptor( uint8_t *data, uint16_t *TagID )
@@ -490,8 +491,9 @@
   L_FI = GETN1(19);
   UDFLongAD(&data[20], FileICB);
   L_IU = GETN2(36);
-  if (L_FI) Unicodedecode(&data[38 + L_IU], L_FI, FileName);
-  else FileName[0] = '\0';
+  if (L_FI) {
+    if (!Unicodedecode(&data[38 + L_IU], L_FI, FileName)) FileName[0] = 0;
+  } else FileName[0] = '\0';
   return 4 * ((38 + L_FI + L_IU + 3) / 4);
 }