diff options
Diffstat (limited to 'net/can/raw.c')
| -rw-r--r-- | net/can/raw.c | 15 | 
1 files changed, 7 insertions, 8 deletions
diff --git a/net/can/raw.c b/net/can/raw.c index da99cf153b3..a10e3338f08 100644 --- a/net/can/raw.c +++ b/net/can/raw.c @@ -436,14 +436,9 @@ static int raw_setsockopt(struct socket *sock, int level, int optname,  		if (count > 1) {  			/* filter does not fit into dfilter => alloc space */ -			filter = kmalloc(optlen, GFP_KERNEL); -			if (!filter) -				return -ENOMEM; - -			if (copy_from_user(filter, optval, optlen)) { -				kfree(filter); -				return -EFAULT; -			} +			filter = memdup_user(optval, optlen); +			if (IS_ERR(filter)) +				return PTR_ERR(filter);  		} else if (count == 1) {  			if (copy_from_user(&sfilter, optval, sizeof(sfilter)))  				return -EFAULT; @@ -655,6 +650,10 @@ static int raw_sendmsg(struct kiocb *iocb, struct socket *sock,  	err = sock_tx_timestamp(msg, sk, skb_tx(skb));  	if (err < 0)  		goto free_skb; + +	/* to be able to check the received tx sock reference in raw_rcv() */ +	skb_tx(skb)->prevent_sk_orphan = 1; +  	skb->dev = dev;  	skb->sk  = sk;  |