# HG changeset patch # User rathann # Date 1317903001 0 # Node ID 99af5ed114a4416fddbc8470d7786aec772e7b75 # Parent df32da8e44b14294266a1f5b77a004a2914412d0 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|. diff -r df32da8e44b1 -r 99af5ed114a4 dvd_udf.c --- 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); }