[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