@ -1,10 +1,10 @@
/*
* hvc_iucv . c - z / VM IUCV hypervisor console ( HVC ) device driver
* z / VM IUCV hypervisor console ( HVC ) device driver
*
* This HVC device driver provides terminal access using
* z / VM IUCV communication paths .
*
* Copyright IBM Corp . 2008 , 2009
* Copyright IBM Corp . 2008 , 2013
*
* Author ( s ) : Hendrik Brueckner < brueckner @ linux . vnet . ibm . com >
*/
@ -102,6 +102,7 @@ static struct hvc_iucv_private *hvc_iucv_table[MAX_HVC_IUCV_LINES];
# define IUCV_HVC_CON_IDX (0)
/* List of z/VM user ID filter entries (struct iucv_vmid_filter) */
# define MAX_VMID_FILTER (500)
# define FILTER_WILDCARD_CHAR '*'
static size_t hvc_iucv_filter_size ;
static void * hvc_iucv_filter ;
static const char * hvc_iucv_filter_string ;
@ -734,20 +735,31 @@ static void hvc_iucv_notifier_del(struct hvc_struct *hp, int id)
* hvc_iucv_filter_connreq ( ) - Filter connection request based on z / VM user ID
* @ ipvmid : Originating z / VM user ID ( right padded with blanks )
*
* Returns 0 if the z / VM user ID @ ipvmid is allowed to connection , otherwise
* non - zero .
* Returns 0 if the z / VM user ID that is specified with @ ipvmid is permitted to
* connect , otherwise non - zero .
*/
static int hvc_iucv_filter_connreq ( u8 ipvmid [ 8 ] )
{
size_t i ;
const char * wildcard , * filter_entry ;
size_t i , len ;
/* Note: default policy is ACCEPT if no filter is set */
if ( ! hvc_iucv_filter_size )
return 0 ;
for ( i = 0 ; i < hvc_iucv_filter_size ; i + + )
if ( 0 = = memcmp ( ipvmid , hvc_iucv_filter + ( 8 * i ) , 8 ) )
for ( i = 0 ; i < hvc_iucv_filter_size ; i + + ) {
filter_entry = hvc_iucv_filter + ( 8 * i ) ;
/* If a filter entry contains the filter wildcard character,
* reduce the length to match the leading portion of the user
* ID only ( wildcard match ) . Characters following the wildcard
* are ignored .
*/
wildcard = strnchr ( filter_entry , 8 , FILTER_WILDCARD_CHAR ) ;
len = ( wildcard ) ? wildcard - filter_entry : 8 ;
if ( 0 = = memcmp ( ipvmid , filter_entry , len ) )
return 0 ;
}
return 1 ;
}
@ -1166,6 +1178,7 @@ static void __init hvc_iucv_destroy(struct hvc_iucv_private *priv)
/**
* hvc_iucv_parse_filter ( ) - Parse filter for a single z / VM user ID
* @ filter : String containing a comma - separated list of z / VM user IDs
* @ dest : Location where to store the parsed z / VM user ID
*/
static const char * hvc_iucv_parse_filter ( const char * filter , char * dest )
{
@ -1188,6 +1201,10 @@ static const char *hvc_iucv_parse_filter(const char *filter, char *dest)
if ( filter [ len - 1 ] = = ' \n ' )
len - - ;
/* prohibit filter entries containing the wildcard character only */
if ( len = = 1 & & * filter = = FILTER_WILDCARD_CHAR )
return ERR_PTR ( - EINVAL ) ;
if ( len > 8 )
return ERR_PTR ( - EINVAL ) ;