mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-11-01 17:08:10 +00:00
bpf, sockmap: fix leak in bpf_tcp_sendmsg wait for mem path
In bpf_tcp_sendmsg() the sk_alloc_sg() may fail. In the case of
ENOMEM, it may also mean that we've partially filled the scatterlist
entries with pages. Later jumping to sk_stream_wait_memory()
we could further fail with an error for several reasons, however
we miss to call free_start_sg() if the local sk_msg_buff was used.
Fixes: 4f738adba3
("bpf: create tcp_bpf_ulp allowing BPF to monitor socket TX/RX data")
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Acked-by: John Fastabend <john.fastabend@gmail.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
This commit is contained in:
parent
5121700b34
commit
7c81c71730
1 changed files with 5 additions and 2 deletions
|
@ -1048,7 +1048,7 @@ static int bpf_tcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t size)
|
||||||
timeo = sock_sndtimeo(sk, msg->msg_flags & MSG_DONTWAIT);
|
timeo = sock_sndtimeo(sk, msg->msg_flags & MSG_DONTWAIT);
|
||||||
|
|
||||||
while (msg_data_left(msg)) {
|
while (msg_data_left(msg)) {
|
||||||
struct sk_msg_buff *m;
|
struct sk_msg_buff *m = NULL;
|
||||||
bool enospc = false;
|
bool enospc = false;
|
||||||
int copy;
|
int copy;
|
||||||
|
|
||||||
|
@ -1116,8 +1116,11 @@ static int bpf_tcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t size)
|
||||||
set_bit(SOCK_NOSPACE, &sk->sk_socket->flags);
|
set_bit(SOCK_NOSPACE, &sk->sk_socket->flags);
|
||||||
wait_for_memory:
|
wait_for_memory:
|
||||||
err = sk_stream_wait_memory(sk, &timeo);
|
err = sk_stream_wait_memory(sk, &timeo);
|
||||||
if (err)
|
if (err) {
|
||||||
|
if (m && m != psock->cork)
|
||||||
|
free_start_sg(sk, m);
|
||||||
goto out_err;
|
goto out_err;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
out_err:
|
out_err:
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
|
|
Loading…
Reference in a new issue