[DVDnav-discuss] Libdvdread misses hidden files and causes segfaults to calling programs

Alexander Roalter alex at roalter.it
Tue Sep 20 00:44:48 CEST 2011


On 09/20/2011 12:27 AM, Reimar Döffinger wrote:
> On Mon, Sep 19, 2011 at 03:22:55PM -0700, John Stebbins wrote:
>> On 09/18/2011 11:12 AM, doug Springer wrote:
>>> Package: libdvdread4
>>> Version: 4.1.4-1219-2 and others
>>>
>>> No error message, but symptoms are usually segfault when reading, for example the Movie DVD 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.
>>>
>>
>> This patch has been submitted twice already, but I like my version better.  The other 2 unnecessarily truncate the
>> string when something is found in the high byte.  This fills that string the same as pre-patch, but returns a code
>> indicating that junk was found in the MSB.
>
> I that case I don't see the point in making things hard to review
> by rewriting the whole function.
> Why not just
> Index: dvd_udf.c
> ===================================================================
> --- dvd_udf.c   (revision 1233)
> +++ 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++ ];  /* Ignore MSB of unicode16 */
>       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 )

In that case, you need to observe the return value in UDFDescriptor, 
which isn't done currenty:

  static int UDFDescriptor( uint8_t *data, uint16_t *TagID )
@@ -490,7 +501,9 @@
    L_FI = GETN1(19);
    UDFLongAD(&data[20], FileICB);
    L_IU = GETN2(36);
-  if (L_FI) Unicodedecode(&data[38 + L_IU], L_FI, FileName);
+  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);
  }




-- 
Cheers,
Alex


More information about the DVDnav-discuss mailing list