Skip to content

Commit d664986

Browse files
rdnagregkh
authored andcommitted
ipv4: fix memory leaks in udp_sendmsg, ping_v4_sendmsg
[ Upstream commit 1b97013 ] Fix more memory leaks in ip_cmsg_send() callers. Part of them were fixed earlier in 9194830. * udp_sendmsg one was there since the beginning when linux sources were first added to git; * ping_v4_sendmsg one was copy/pasted in c319b4d. Whenever return happens in udp_sendmsg() or ping_v4_sendmsg() IP options have to be freed if they were allocated previously. Add label so that future callers (if any) can use it instead of kfree() before return that is easy to forget. Fixes: c319b4d (net: ipv4: add IPPROTO_ICMP socket kind) Signed-off-by: Andrey Ignatov <rdna@fb.com> Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent aef419e commit d664986

File tree

2 files changed

+10
-4
lines changed

2 files changed

+10
-4
lines changed

net/ipv4/ping.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -775,8 +775,10 @@ static int ping_v4_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
775775
ipc.addr = faddr = daddr;
776776

777777
if (ipc.opt && ipc.opt->opt.srr) {
778-
if (!daddr)
779-
return -EINVAL;
778+
if (!daddr) {
779+
err = -EINVAL;
780+
goto out_free;
781+
}
780782
faddr = ipc.opt->opt.faddr;
781783
}
782784
tos = get_rttos(&ipc, inet);
@@ -841,6 +843,7 @@ static int ping_v4_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
841843

842844
out:
843845
ip_rt_put(rt);
846+
out_free:
844847
if (free)
845848
kfree(ipc.opt);
846849
if (!err) {

net/ipv4/udp.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -982,8 +982,10 @@ int udp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
982982
sock_tx_timestamp(sk, ipc.sockc.tsflags, &ipc.tx_flags);
983983

984984
if (ipc.opt && ipc.opt->opt.srr) {
985-
if (!daddr)
986-
return -EINVAL;
985+
if (!daddr) {
986+
err = -EINVAL;
987+
goto out_free;
988+
}
987989
faddr = ipc.opt->opt.faddr;
988990
connected = 0;
989991
}
@@ -1090,6 +1092,7 @@ int udp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
10901092

10911093
out:
10921094
ip_rt_put(rt);
1095+
out_free:
10931096
if (free)
10941097
kfree(ipc.opt);
10951098
if (!err)

0 commit comments

Comments
 (0)