Skip to content

Commit 1b97013

Browse files
rdnadavem330
authored andcommitted
ipv4: fix memory leaks in udp_sendmsg, ping_v4_sendmsg
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 <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 8ccc113 commit 1b97013

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);
@@ -842,6 +844,7 @@ static int ping_v4_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
842844

843845
out:
844846
ip_rt_put(rt);
847+
out_free:
845848
if (free)
846849
kfree(ipc.opt);
847850
if (!err) {

net/ipv4/udp.c

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

954954
if (ipc.opt && ipc.opt->opt.srr) {
955-
if (!daddr)
956-
return -EINVAL;
955+
if (!daddr) {
956+
err = -EINVAL;
957+
goto out_free;
958+
}
957959
faddr = ipc.opt->opt.faddr;
958960
connected = 0;
959961
}
@@ -1074,6 +1076,7 @@ int udp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
10741076

10751077
out:
10761078
ip_rt_put(rt);
1079+
out_free:
10771080
if (free)
10781081
kfree(ipc.opt);
10791082
if (!err)

0 commit comments

Comments
 (0)