diff options
Diffstat (limited to 'net/x25/x25_dev.c')
| -rw-r--r-- | net/x25/x25_dev.c | 68 | 
1 files changed, 38 insertions, 30 deletions
diff --git a/net/x25/x25_dev.c b/net/x25/x25_dev.c index 9005f6daeab..39231237e1c 100644 --- a/net/x25/x25_dev.c +++ b/net/x25/x25_dev.c @@ -17,6 +17,8 @@   *      2000-09-04	Henner Eisen	Prevent freeing a dangling skb.   */ +#define pr_fmt(fmt) "X25: " fmt +  #include <linux/kernel.h>  #include <linux/netdevice.h>  #include <linux/skbuff.h> @@ -32,6 +34,9 @@ static int x25_receive_data(struct sk_buff *skb, struct x25_neigh *nb)  	unsigned short frametype;  	unsigned int lci; +	if (!pskb_may_pull(skb, X25_STD_MIN_LEN)) +		return 0; +  	frametype = skb->data[2];  	lci = ((skb->data[0] << 8) & 0xF00) + ((skb->data[1] << 0) & 0x0FF); @@ -55,7 +60,7 @@ static int x25_receive_data(struct sk_buff *skb, struct x25_neigh *nb)  		if (!sock_owned_by_user(sk)) {  			queued = x25_process_rx_frame(sk, skb);  		} else { -			queued = !sk_add_backlog(sk, skb); +			queued = !sk_add_backlog(sk, skb, sk->sk_rcvbuf);  		}  		bh_unlock_sock(sk);  		sock_put(sk); @@ -86,7 +91,7 @@ static int x25_receive_data(struct sk_buff *skb, struct x25_neigh *nb)  */  	if (frametype != X25_CLEAR_CONFIRMATION) -		printk(KERN_DEBUG "x25_receive_data(): unknown frame type %2x\n",frametype); +		pr_debug("x25_receive_data(): unknown frame type %2x\n",frametype);  	return 0;  } @@ -111,10 +116,13 @@ int x25_lapb_receive_frame(struct sk_buff *skb, struct net_device *dev,  	 */  	nb = x25_get_neigh(dev);  	if (!nb) { -		printk(KERN_DEBUG "X.25: unknown neighbour - %s\n", dev->name); +		pr_debug("unknown neighbour - %s\n", dev->name);  		goto drop;  	} +	if (!pskb_may_pull(skb, 1)) +		return 0; +  	switch (skb->data[0]) {  	case X25_IFACE_DATA: @@ -146,21 +154,21 @@ void x25_establish_link(struct x25_neigh *nb)  	unsigned char *ptr;  	switch (nb->dev->type) { -		case ARPHRD_X25: -			if ((skb = alloc_skb(1, GFP_ATOMIC)) == NULL) { -				printk(KERN_ERR "x25_dev: out of memory\n"); -				return; -			} -			ptr  = skb_put(skb, 1); -			*ptr = X25_IFACE_CONNECT; -			break; - -#if defined(CONFIG_LLC) || defined(CONFIG_LLC_MODULE) -		case ARPHRD_ETHER: +	case ARPHRD_X25: +		if ((skb = alloc_skb(1, GFP_ATOMIC)) == NULL) { +			pr_err("x25_dev: out of memory\n");  			return; +		} +		ptr  = skb_put(skb, 1); +		*ptr = X25_IFACE_CONNECT; +		break; + +#if IS_ENABLED(CONFIG_LLC) +	case ARPHRD_ETHER: +		return;  #endif -		default: -			return; +	default: +		return;  	}  	skb->protocol = htons(ETH_P_X25); @@ -174,7 +182,7 @@ void x25_terminate_link(struct x25_neigh *nb)  	struct sk_buff *skb;  	unsigned char *ptr; -#if defined(CONFIG_LLC) || defined(CONFIG_LLC_MODULE) +#if IS_ENABLED(CONFIG_LLC)  	if (nb->dev->type == ARPHRD_ETHER)  		return;  #endif @@ -183,7 +191,7 @@ void x25_terminate_link(struct x25_neigh *nb)  	skb = alloc_skb(1, GFP_ATOMIC);  	if (!skb) { -		printk(KERN_ERR "x25_dev: out of memory\n"); +		pr_err("x25_dev: out of memory\n");  		return;  	} @@ -202,19 +210,19 @@ void x25_send_frame(struct sk_buff *skb, struct x25_neigh *nb)  	skb_reset_network_header(skb);  	switch (nb->dev->type) { -		case ARPHRD_X25: -			dptr  = skb_push(skb, 1); -			*dptr = X25_IFACE_DATA; -			break; - -#if defined(CONFIG_LLC) || defined(CONFIG_LLC_MODULE) -		case ARPHRD_ETHER: -			kfree_skb(skb); -			return; +	case ARPHRD_X25: +		dptr  = skb_push(skb, 1); +		*dptr = X25_IFACE_DATA; +		break; + +#if IS_ENABLED(CONFIG_LLC) +	case ARPHRD_ETHER: +		kfree_skb(skb); +		return;  #endif -		default: -			kfree_skb(skb); -			return; +	default: +		kfree_skb(skb); +		return;  	}  	skb->protocol = htons(ETH_P_X25);  | 
