diff options
| author | James Morris <james.morris@microsoft.com> | 2018-12-17 22:24:28 +0300 | 
|---|---|---|
| committer | James Morris <james.morris@microsoft.com> | 2018-12-17 22:24:28 +0300 | 
| commit | 8bd8ea195f6d135a8d85201116314eb5237ad7e7 (patch) | |
| tree | 3ef99e468f0b4b13cc11002aa60c4451e326191b /net/tipc/socket.c | |
| parent | 1072bd678547f8663cfb81a22fdb50c589e4976e (diff) | |
| parent | 7566ec393f4161572ba6f11ad5171fd5d59b0fbd (diff) | |
| download | linux-8bd8ea195f6d135a8d85201116314eb5237ad7e7.tar.xz | |
Merge tag 'v4.20-rc7' into next-general
Sync with Linux 4.20-rc7, to pick up: Revert "ovl: relax permission checking on underlying layers"
Diffstat (limited to 'net/tipc/socket.c')
| -rw-r--r-- | net/tipc/socket.c | 15 | 
1 files changed, 11 insertions, 4 deletions
diff --git a/net/tipc/socket.c b/net/tipc/socket.c index 636e6131769d..b57b1be7252b 100644 --- a/net/tipc/socket.c +++ b/net/tipc/socket.c @@ -1555,16 +1555,17 @@ static void tipc_sk_set_orig_addr(struct msghdr *m, struct sk_buff *skb)  /**   * tipc_sk_anc_data_recv - optionally capture ancillary data for received message   * @m: descriptor for message info - * @msg: received message header + * @skb: received message buffer   * @tsk: TIPC port associated with message   *   * Note: Ancillary data is not captured if not requested by receiver.   *   * Returns 0 if successful, otherwise errno   */ -static int tipc_sk_anc_data_recv(struct msghdr *m, struct tipc_msg *msg, +static int tipc_sk_anc_data_recv(struct msghdr *m, struct sk_buff *skb,  				 struct tipc_sock *tsk)  { +	struct tipc_msg *msg;  	u32 anc_data[3];  	u32 err;  	u32 dest_type; @@ -1573,6 +1574,7 @@ static int tipc_sk_anc_data_recv(struct msghdr *m, struct tipc_msg *msg,  	if (likely(m->msg_controllen == 0))  		return 0; +	msg = buf_msg(skb);  	/* Optionally capture errored message object(s) */  	err = msg ? msg_errcode(msg) : 0; @@ -1583,6 +1585,9 @@ static int tipc_sk_anc_data_recv(struct msghdr *m, struct tipc_msg *msg,  		if (res)  			return res;  		if (anc_data[1]) { +			if (skb_linearize(skb)) +				return -ENOMEM; +			msg = buf_msg(skb);  			res = put_cmsg(m, SOL_TIPC, TIPC_RETDATA, anc_data[1],  				       msg_data(msg));  			if (res) @@ -1744,9 +1749,10 @@ static int tipc_recvmsg(struct socket *sock, struct msghdr *m,  	/* Collect msg meta data, including error code and rejected data */  	tipc_sk_set_orig_addr(m, skb); -	rc = tipc_sk_anc_data_recv(m, hdr, tsk); +	rc = tipc_sk_anc_data_recv(m, skb, tsk);  	if (unlikely(rc))  		goto exit; +	hdr = buf_msg(skb);  	/* Capture data if non-error msg, otherwise just set return value */  	if (likely(!err)) { @@ -1856,9 +1862,10 @@ static int tipc_recvstream(struct socket *sock, struct msghdr *m,  		/* Collect msg meta data, incl. error code and rejected data */  		if (!copied) {  			tipc_sk_set_orig_addr(m, skb); -			rc = tipc_sk_anc_data_recv(m, hdr, tsk); +			rc = tipc_sk_anc_data_recv(m, skb, tsk);  			if (rc)  				break; +			hdr = buf_msg(skb);  		}  		/* Copy data if msg ok, otherwise return error/partial data */  | 
