Here's the patch I've uploaded to Ubuntu.

Since fixing this, I've tested the package against a few more ordinary
DVDs and found them to work fine, so I'll go ahead with the SRU.

** Description changed:

+ [Impact]
+ Program segfaults when reading metadata of DVDs with invalid unicode 
characters.
+ 
+ This has been spotted with the quite popular Thor DVD, and several
+ duplicate reports indicate it's affecting quite a few people.   It's
+ unknown if this was an accident (which would be bad enough!) or
+ intentional (in which case we can expect more movies to be released with
+ this flaw).
+ 
+ [Development Fix]
+ The patch is essentially scanning the upper of the two-byte code for 
unicode16 strings and if it has any non-zero value it blanks out the remainder 
of the string. In this particular case, this results in an empty string, thus 
causing the garbage file to be ignored.
+ 
+ The patch has been slightly modified from the original author's version,
+ to clean up the code so the patch will be more maintainable.
+ 
+ [Stable Fix]
+ Oneiric and Natty carry the same version of libdvdread, so the same patch is 
used in both cases.  
+ 
+ [Test Case]
+ 1.  Buy Thor DVD.
+ 2.  Install and run lsdvd.
+ 3.  Program segfaults
+ 
+ With the patch, step #3 produces valid output listing the contents of
+ the DVD.
+ 
+ [Regression Potential]
+ Minor.   This only affects how unicode characters in filenames on a DVD are 
handled, and as far as I know DVDs don't tend to use unicode.  If they do use 
unicode, we can expect they'd use valid unicode (which this patch allows 
through.)
+ 
+ Since uploading the fix for this bug about a week ago, only one bug
+ report has been filed against oneiric, and that bug is just a duplicate
+ of this one.
+ 
+ [Original Report]
  Package: libdvdread4
  Version: 4.1.x 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.
  
  Discussion is here:
  http://ubuntuforums.org/showthread.php?p=11257764
  
  Patch is here:
  
  diff -ru libdvdread-4.1.3/src/dvd_udf.c libdvdread-4.1.3.fixed/src/dvd_udf.c
  --- libdvdread-4.1.3/src/dvd_udf.c    2008-09-06 15:55:51.000000000 -0600
  +++ libdvdread-4.1.3.fixed/src/dvd_udf.c    2011-09-16 14:07:04.000000000 
-0600
  @@ -331,21 +331,26 @@
-  /* This is wrong with regard to endianess */
-  #define GETN(p, n, target) memcpy(target,&data[p], n)
+  /* This is wrong with regard to endianess */
+  #define GETN(p, n, target) memcpy(target,&data[p], n)
  
  -static int Unicodedecode( uint8_t *data, int len, char *target )
  +static int Unicodedecode(uint8_t *data, int len, char *target)
-  {
+  {
  -    int p = 1, i = 0;
  +    len--;
  +    data++;
  +    if (data[-1] == 8 )
  +        memcpy(target, data, len);
  +    else if (data[-1] == 16) {
  +        int i;
  
  -    if( ( data[ 0 ] == 8 ) || ( data[ 0 ] == 16 ) ) do {
  -        if( data[ 0 ] == 16 ) p++;  /* Ignore MSB of unicode16 */
  -        if( p<  len ) {
  -            target[ i++ ] = data[ p++ ];
  +        for (i = 0; i<  len; i++) {
  +            if (data[i*2] == 0)
  +                target[i] = data[i*2+1];
  +            else
  +                target[i] = 0;
-          }
+          }
  -    } while( p<  len );
  +    }
  +    target[len] = '\0';
  
  -    target[ i ] = '\0';
-      return 0;
-  }
+      return 0;
+  }
  -
-  static int UDFDescriptor( uint8_t *data, uint16_t *TagID )
-  {
-      *TagID = GETN2(0);
+  static int UDFDescriptor( uint8_t *data, uint16_t *TagID )
+  {
+      *TagID = GETN2(0);

** Patch added: "101-fix-msb-unicode.patch"
   
https://bugs.launchpad.net/ubuntu/+source/libdvdread/+bug/852345/+attachment/2503140/+files/101-fix-msb-unicode.patch

** Changed in: libdvdread (Ubuntu Natty)
       Status: In Progress => Fix Committed

-- 
You received this bug notification because you are a member of Ubuntu
Bugs, which is subscribed to Ubuntu.
https://bugs.launchpad.net/bugs/852345

Title:
  Libdvdread misses hidden files and causes segfaults to calling
  programs

To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/libdvdread/+bug/852345/+subscriptions

-- 
ubuntu-bugs mailing list
[email protected]
https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs

Reply via email to