summaryrefslogtreecommitdiff
path: root/net/tipc
diff options
context:
space:
mode:
authorTung Nguyen <tung.q.nguyen@dektech.com.au>2019-11-28 10:10:05 +0700
committerDavid S. Miller <davem@davemloft.net>2019-11-28 23:09:14 -0800
commit2fe97a578d7bad3116a89dc8a6692a51e6fc1d9c (patch)
treeb2d92eff181c5d7de25e68d0d47d4118b0795578 /net/tipc
parent61183b056b49e2937ff92a1424291ba36a6f6d05 (diff)
downloadlwn-2fe97a578d7bad3116a89dc8a6692a51e6fc1d9c.tar.gz
lwn-2fe97a578d7bad3116a89dc8a6692a51e6fc1d9c.zip
tipc: fix potential memory leak in __tipc_sendmsg()
When initiating a connection message to a server side, the connection message is cloned and added to the socket write queue. However, if the cloning is failed, only the socket write queue is purged. It causes memory leak because the original connection message is not freed. This commit fixes it by purging the list of connection message when it cannot be cloned. Fixes: 6787927475e5 ("tipc: buffer overflow handling in listener socket") Reported-by: Hoang Le <hoang.h.le@dektech.com.au> Signed-off-by: Tung Nguyen <tung.q.nguyen@dektech.com.au> Acked-by: Ying Xue <ying.xue@windriver.com> Acked-by: Jon Maloy <jon.maloy@ericsson.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/tipc')
-rw-r--r--net/tipc/socket.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/net/tipc/socket.c b/net/tipc/socket.c
index a1c8d722ca20..7baed2c2c93d 100644
--- a/net/tipc/socket.c
+++ b/net/tipc/socket.c
@@ -1447,8 +1447,10 @@ static int __tipc_sendmsg(struct socket *sock, struct msghdr *m, size_t dlen)
rc = tipc_msg_build(hdr, m, 0, dlen, mtu, &pkts);
if (unlikely(rc != dlen))
return rc;
- if (unlikely(syn && !tipc_msg_skb_clone(&pkts, &sk->sk_write_queue)))
+ if (unlikely(syn && !tipc_msg_skb_clone(&pkts, &sk->sk_write_queue))) {
+ __skb_queue_purge(&pkts);
return -ENOMEM;
+ }
trace_tipc_sk_sendmsg(sk, skb_peek(&pkts), TIPC_DUMP_SK_SNDQ, " ");
rc = tipc_node_xmit(net, &pkts, dnode, tsk->portid);