ref: 8b3ebecc097066cb94161c4427a6d76f3499c8da
parent: c2a2a265ee490a9a59bed41d31cf65e5e23c4b82
author: Sam Hocevar <sam@videolan.org>
date: Wed Aug 11 18:15:30 EDT 2004
* src/libdvdcss.c: + Append the disc key to the cache directory name to avoid issues with identical discs which have different encryption keys, thanks to Sven Heithecker. + Use - instead of # as a separator in the cache filename.
--- a/AUTHORS
+++ b/AUTHORS
@@ -14,6 +14,10 @@
C: stef
D: original CSS decryption code from vlc
+N: Sven Heithecker
+E: sven.heithecker@web.de
+D: cache bug fix for discs with identical content but different keys
+
N: H�kan Hjort
E: d95hjort@dtek.chalmers.se
D: Solaris port of the DVD ioctls
--- a/src/libdvdcss.c
+++ b/src/libdvdcss.c
@@ -5,7 +5,7 @@
* H�kan Hjort <d95hjort@dtek.chalmers.se>
*
* Copyright (C) 1998-2002 VideoLAN
- * $Id: libdvdcss.c,v 1.35 2003/09/15 17:12:46 sam Exp $
+ * $Id$
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -319,7 +319,8 @@
psz_cache = NULL;
}
/* Check that we can add the ID directory and the block filename */
- else if( strlen( psz_cache ) + 1 + 32 + 1 + 10 + 1 > PATH_MAX )
+ else if( strlen( psz_cache ) + 1 + 32 + 1 + (KEY_SIZE * 2) + 10 + 1
+ > PATH_MAX )
{
print_error( dvdcss, "cache directory name is too long" );
psz_cache = NULL;
@@ -377,6 +378,7 @@
{
uint8_t p_sector[DVDCSS_BLOCK_SIZE];
unsigned char psz_debug[PATH_MAX+30];
+ unsigned char psz_key[1 + KEY_SIZE * 2 + 1];
unsigned char * psz_title, * psz_serial;
int i;
@@ -443,15 +445,33 @@
{
if( psz_serial[i] < '0' || psz_serial[i] > '9' )
{
- sprintf( psz_serial,
- "%.2X%.2X%.2X%.2X%.2X%.2X%.2X%.2X",
+ char psz_tmp[16 + 1];
+ sprintf( psz_tmp,
+ "%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x",
psz_serial[0], psz_serial[1], psz_serial[2],
psz_serial[3], psz_serial[4], psz_serial[5],
psz_serial[6], psz_serial[7] );
+ memcpy( psz_serial, psz_tmp, 16 );
break;
}
}
+ /* Get disk key, since some discs have got same title, manufacturing
+ * date and serial number, but different keys */
+ if( dvdcss->b_scrambled )
+ {
+ psz_key[0] = '-';
+ for( i = 0; i < KEY_SIZE; i++ )
+ {
+ sprintf( &psz_key[1+i*2], "%.2x", dvdcss->css.p_disc_key[i] );
+ }
+ psz_key[1 + KEY_SIZE * 2] = '\0';
+ }
+ else
+ {
+ psz_key[0] = 0;
+ }
+
/* We have a disc name or ID, we can create the cache dir */
i = sprintf( dvdcss->psz_cachefile, "%s", psz_cache );
#if !defined( WIN32 ) || defined( SYS_CYGWIN )
@@ -466,8 +486,8 @@
goto nocache;
}
- i += sprintf( dvdcss->psz_cachefile + i, "/%s#%s", psz_title,
- psz_serial );
+ i += sprintf( dvdcss->psz_cachefile + i, "/%s-%s%s", psz_title,
+ psz_serial, psz_key );
#if !defined( WIN32 ) || defined( SYS_CYGWIN )
i_ret = mkdir( dvdcss->psz_cachefile, 0755 );
#else