diff options
| -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) | |||
| 1555 | /** | 1555 | /** |
| 1556 | * tipc_sk_anc_data_recv - optionally capture ancillary data for received message | 1556 | * tipc_sk_anc_data_recv - optionally capture ancillary data for received message |
| 1557 | * @m: descriptor for message info | 1557 | * @m: descriptor for message info |
| 1558 | * @msg: received message header | 1558 | * @skb: received message buffer |
| 1559 | * @tsk: TIPC port associated with message | 1559 | * @tsk: TIPC port associated with message |
| 1560 | * | 1560 | * |
| 1561 | * Note: Ancillary data is not captured if not requested by receiver. | 1561 | * Note: Ancillary data is not captured if not requested by receiver. |
| 1562 | * | 1562 | * |
| 1563 | * Returns 0 if successful, otherwise errno | 1563 | * Returns 0 if successful, otherwise errno |
| 1564 | */ | 1564 | */ |
| 1565 | static int tipc_sk_anc_data_recv(struct msghdr *m, struct tipc_msg *msg, | 1565 | static int tipc_sk_anc_data_recv(struct msghdr *m, struct sk_buff *skb, |
| 1566 | struct tipc_sock *tsk) | 1566 | struct tipc_sock *tsk) |
| 1567 | { | 1567 | { |
| 1568 | struct tipc_msg *msg; | ||
| 1568 | u32 anc_data[3]; | 1569 | u32 anc_data[3]; |
| 1569 | u32 err; | 1570 | u32 err; |
| 1570 | u32 dest_type; | 1571 | u32 dest_type; |
| @@ -1573,6 +1574,7 @@ static int tipc_sk_anc_data_recv(struct msghdr *m, struct tipc_msg *msg, | |||
| 1573 | 1574 | ||
| 1574 | if (likely(m->msg_controllen == 0)) | 1575 | if (likely(m->msg_controllen == 0)) |
| 1575 | return 0; | 1576 | return 0; |
| 1577 | msg = buf_msg(skb); | ||
| 1576 | 1578 | ||
| 1577 | /* Optionally capture errored message object(s) */ | 1579 | /* Optionally capture errored message object(s) */ |
| 1578 | err = msg ? msg_errcode(msg) : 0; | 1580 | err = msg ? msg_errcode(msg) : 0; |
| @@ -1583,6 +1585,9 @@ static int tipc_sk_anc_data_recv(struct msghdr *m, struct tipc_msg *msg, | |||
| 1583 | if (res) | 1585 | if (res) |
| 1584 | return res; | 1586 | return res; |
| 1585 | if (anc_data[1]) { | 1587 | if (anc_data[1]) { |
| 1588 | if (skb_linearize(skb)) | ||
| 1589 | return -ENOMEM; | ||
| 1590 | msg = buf_msg(skb); | ||
| 1586 | res = put_cmsg(m, SOL_TIPC, TIPC_RETDATA, anc_data[1], | 1591 | res = put_cmsg(m, SOL_TIPC, TIPC_RETDATA, anc_data[1], |
| 1587 | msg_data(msg)); | 1592 | msg_data(msg)); |
| 1588 | if (res) | 1593 | if (res) |
| @@ -1744,9 +1749,10 @@ static int tipc_recvmsg(struct socket *sock, struct msghdr *m, | |||
| 1744 | 1749 | ||
| 1745 | /* Collect msg meta data, including error code and rejected data */ | 1750 | /* Collect msg meta data, including error code and rejected data */ |
| 1746 | tipc_sk_set_orig_addr(m, skb); | 1751 | tipc_sk_set_orig_addr(m, skb); |
| 1747 | rc = tipc_sk_anc_data_recv(m, hdr, tsk); | 1752 | rc = tipc_sk_anc_data_recv(m, skb, tsk); |
| 1748 | if (unlikely(rc)) | 1753 | if (unlikely(rc)) |
| 1749 | goto exit; | 1754 | goto exit; |
| 1755 | hdr = buf_msg(skb); | ||
| 1750 | 1756 | ||
| 1751 | /* Capture data if non-error msg, otherwise just set return value */ | 1757 | /* Capture data if non-error msg, otherwise just set return value */ |
| 1752 | if (likely(!err)) { | 1758 | if (likely(!err)) { |
| @@ -1856,9 +1862,10 @@ static int tipc_recvstream(struct socket *sock, struct msghdr *m, | |||
| 1856 | /* Collect msg meta data, incl. error code and rejected data */ | 1862 | /* Collect msg meta data, incl. error code and rejected data */ |
| 1857 | if (!copied) { | 1863 | if (!copied) { |
| 1858 | tipc_sk_set_orig_addr(m, skb); | 1864 | tipc_sk_set_orig_addr(m, skb); |
| 1859 | rc = tipc_sk_anc_data_recv(m, hdr, tsk); | 1865 | rc = tipc_sk_anc_data_recv(m, skb, tsk); |
| 1860 | if (rc) | 1866 | if (rc) |
| 1861 | break; | 1867 | break; |
| 1868 | hdr = buf_msg(skb); | ||
| 1862 | } | 1869 | } |
| 1863 | 1870 | ||
| 1864 | /* Copy data if msg ok, otherwise return error/partial data */ | 1871 | /* Copy data if msg ok, otherwise return error/partial data */ |
