diff options
Diffstat (limited to 'drivers/misc/ti-st/st_core.c')
| -rw-r--r-- | drivers/misc/ti-st/st_core.c | 10 | 
1 files changed, 9 insertions, 1 deletions
| diff --git a/drivers/misc/ti-st/st_core.c b/drivers/misc/ti-st/st_core.c index 54c91ffe4a91..ba168a7d54d4 100644 --- a/drivers/misc/ti-st/st_core.c +++ b/drivers/misc/ti-st/st_core.c @@ -338,6 +338,12 @@ void st_int_recv(void *disc_data,  			/* Unknow packet? */  		default:  			type = *ptr; +			if (st_gdata->list[type] == NULL) { +				pr_err("chip/interface misbehavior dropping" +					" frame starting with 0x%02x", type); +				goto done; + +			}  			st_gdata->rx_skb = alloc_skb(  					st_gdata->list[type]->max_frame_size,  					GFP_ATOMIC); @@ -354,6 +360,7 @@ void st_int_recv(void *disc_data,  		ptr++;  		count--;  	} +done:  	spin_unlock_irqrestore(&st_gdata->lock, flags);  	pr_debug("done %s", __func__);  	return; @@ -717,9 +724,10 @@ static void st_tty_close(struct tty_struct *tty)  	 */  	spin_lock_irqsave(&st_gdata->lock, flags);  	for (i = ST_BT; i < ST_MAX_CHANNELS; i++) { -		if (st_gdata->list[i] != NULL) +		if (st_gdata->is_registered[i] == true)  			pr_err("%d not un-registered", i);  		st_gdata->list[i] = NULL; +		st_gdata->is_registered[i] = false;  	}  	st_gdata->protos_registered = 0;  	spin_unlock_irqrestore(&st_gdata->lock, flags); | 
