Commit f6ecade7 authored by Sam Hocevar's avatar Sam Hocevar
Browse files

Check drive's RPC status before trying to access a scrambled disc. Patch

provided by Ori Avtalion <ori@avtalion.name> and refactored by Sam Hocevar
<sam@hocevar.net>.
parent a0f00ca3
......@@ -89,10 +89,19 @@ static int AttackPadding ( uint8_t const[], int, uint8_t * );
/*****************************************************************************
* _dvdcss_test: check if the disc is encrypted or not
*****************************************************************************
* Return values:
* 1: DVD is scrambled but can be read
* 0: DVD is not scrambled and can be read
* -1: could not get "copyright" information
* -2: could not get RPC information (reading the disc might be possible)
* -3: drive is RPC-II, region is not set, and DVD is scrambled: the RPC
* scheme will prevent us from reading the scrambled data
*****************************************************************************/
int _dvdcss_test( dvdcss_t dvdcss )
{
int i_ret, i_copyright;
char const *psz_type, *psz_rpc;
int i_ret, i_copyright, i_type, i_mask, i_rpc;
i_ret = ioctl_ReadCopyright( dvdcss->i_fd, 0 /* i_layer */, &i_copyright );
......@@ -115,14 +124,48 @@ int _dvdcss_test( dvdcss_t dvdcss )
if( i_ret < 0 )
{
/* Since it's the first ioctl we try to issue, we add a notice */
print_error( dvdcss, "css error: ioctl_ReadCopyright failed, "
"make sure there is a DVD in the drive, and that "
"you have used the correct device node." );
print_error( dvdcss, "css error: could not get \"copyright\""
" information, make sure there is a DVD in the drive,"
" and that you have used the correct device node." );
return -1;
}
i_ret = ioctl_ReportRPC( dvdcss->i_fd, &i_type, &i_mask, &i_rpc);
if( i_ret < 0 )
{
print_error( dvdcss, "css error: could not get RPC status" );
return -2;
}
return i_ret;
switch( i_rpc )
{
case 0: psz_rpc = "RPC-I"; break;
case 1: psz_rpc = "RPC-II"; break;
default: psz_rpc = "unknown RPC scheme"; break;
}
switch( i_type )
{
case 0: psz_type = "no region code set"; break;
case 1: psz_type = "region code set"; break;
case 2: psz_type = "one region change remaining"; break;
case 3: psz_type = "region code set permanently"; break;
default: psz_type = "unknown status"; break;
}
print_debug( dvdcss, "drive region mask %x, %s, %s",
i_mask, psz_rpc, psz_type );
if( i_copyright && i_rpc == 1 && i_type == 0 )
{
print_error( dvdcss, "css error: drive will prevent access to "
"scrambled data" );
return -3;
}
return i_copyright;
return i_copyright ? 1 : 0;
}
/*****************************************************************************
......
......@@ -367,7 +367,14 @@ LIBDVDCSS_EXPORT dvdcss_t dvdcss_open ( char *psz_target )
if( dvdcss->b_ioctls )
{
i_ret = _dvdcss_test( dvdcss );
if( i_ret < 0 )
if( i_ret == -2 )
{
/* Scrambled disk, RPC-II drive, no region set: bail out */
free( dvdcss->psz_device );
free( dvdcss );
return NULL;
}
else if( i_ret < 0 )
{
/* Disable the CSS ioctls and hope that it works? */
print_debug( dvdcss,
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment