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