diff options
author | jstebbins <[email protected]> | 2011-09-26 20:37:46 +0000 |
---|---|---|
committer | jstebbins <[email protected]> | 2011-09-26 20:37:46 +0000 |
commit | fa6fa44a3c499ce7eb35fdeb52bed431c3b47780 (patch) | |
tree | 6b1f15d9b281d08df8980c645b93a5ebe859a301 /contrib | |
parent | 3a34f16a25e45e87e27cc107fd489eef1abc73f7 (diff) |
Fix for DVD's that have broken udf filenames
A new obfuscation technique it to add UDF-16 filenames that have junk in
the high byte and things like "VIDEO_TS.IFO" in the low byte.
libdvdread throws away the high byte which results in references to the
bogus copy of the file.
git-svn-id: svn://svn.handbrake.fr/HandBrake/trunk@4252 b64f7644-9d1e-0410-96f1-a4d463321fa5
Diffstat (limited to 'contrib')
-rw-r--r-- | contrib/libdvdread/A01-bogus-udf-filename.patch | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/contrib/libdvdread/A01-bogus-udf-filename.patch b/contrib/libdvdread/A01-bogus-udf-filename.patch new file mode 100644 index 000000000..d9a3b2103 --- /dev/null +++ b/contrib/libdvdread/A01-bogus-udf-filename.patch @@ -0,0 +1,37 @@ +Index: dvd_udf.c +=================================================================== +--- libdvdread/src/dvd_udf.c (revision 1233) ++++ libdvdread/src/dvd_udf.c (working copy) +@@ -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); + } + + |