]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blame - releases/4.4.133/ipv4-fix-memory-leaks-in-udp_sendmsg-ping_v4_sendmsg.patch
Remove duplicated commits
[thirdparty/kernel/stable-queue.git] / releases / 4.4.133 / ipv4-fix-memory-leaks-in-udp_sendmsg-ping_v4_sendmsg.patch
CommitLineData
d55578af
GKH
1From foo@baz Wed May 16 16:57:32 CEST 2018
2From: Andrey Ignatov <rdna@fb.com>
3Date: Thu, 10 May 2018 10:59:34 -0700
4Subject: ipv4: fix memory leaks in udp_sendmsg, ping_v4_sendmsg
5
6From: Andrey Ignatov <rdna@fb.com>
7
8[ Upstream commit 1b97013bfb11d66f041de691de6f0fec748ce016 ]
9
10Fix more memory leaks in ip_cmsg_send() callers. Part of them were fixed
11earlier in 919483096bfe.
12
13* udp_sendmsg one was there since the beginning when linux sources were
14 first added to git;
15* ping_v4_sendmsg one was copy/pasted in c319b4d76b9e.
16
17Whenever return happens in udp_sendmsg() or ping_v4_sendmsg() IP options
18have to be freed if they were allocated previously.
19
20Add label so that future callers (if any) can use it instead of kfree()
21before return that is easy to forget.
22
23Fixes: c319b4d76b9e (net: ipv4: add IPPROTO_ICMP socket kind)
24Signed-off-by: Andrey Ignatov <rdna@fb.com>
25Signed-off-by: David S. Miller <davem@davemloft.net>
26Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
27---
28 net/ipv4/ping.c | 7 +++++--
29 net/ipv4/udp.c | 7 +++++--
30 2 files changed, 10 insertions(+), 4 deletions(-)
31
32--- a/net/ipv4/ping.c
33+++ b/net/ipv4/ping.c
34@@ -777,8 +777,10 @@ static int ping_v4_sendmsg(struct sock *
35 ipc.addr = faddr = daddr;
36
37 if (ipc.opt && ipc.opt->opt.srr) {
38- if (!daddr)
39- return -EINVAL;
40+ if (!daddr) {
41+ err = -EINVAL;
42+ goto out_free;
43+ }
44 faddr = ipc.opt->opt.faddr;
45 }
46 tos = get_rttos(&ipc, inet);
47@@ -843,6 +845,7 @@ back_from_confirm:
48
49 out:
50 ip_rt_put(rt);
51+out_free:
52 if (free)
53 kfree(ipc.opt);
54 if (!err) {
55--- a/net/ipv4/udp.c
56+++ b/net/ipv4/udp.c
57@@ -991,8 +991,10 @@ int udp_sendmsg(struct sock *sk, struct
58 ipc.addr = faddr = daddr;
59
60 if (ipc.opt && ipc.opt->opt.srr) {
61- if (!daddr)
62- return -EINVAL;
63+ if (!daddr) {
64+ err = -EINVAL;
65+ goto out_free;
66+ }
67 faddr = ipc.opt->opt.faddr;
68 connected = 0;
69 }
70@@ -1105,6 +1107,7 @@ do_append_data:
71
72 out:
73 ip_rt_put(rt);
74+out_free:
75 if (free)
76 kfree(ipc.opt);
77 if (!err)