From: John Fastabend <john.fastabend@gmail.com> Date: 2021-07-12 19:56:03
While investigating a memleak in sockmap I found these two issues. Patch
1 found doing code review, I wasn't able to get KASAN to trigger a
memleak here, but should be necessary. Patch 2 fixes proc stats so when
we use sockstats for debugging we get correct values.
The fix for observered memleak will come after these, but requires some
more discussion and potentially patch revert so I'll try to get the set
here going now.
v4: fix both users of sk_psock_skb_ingress_enqueue and then fix the
inuse idx by moving init hook later after tcp/udp init calls.
v3: move kfree into same function as kalloc
John Fastabend (2):
bpf, sockmap: fix potential memory leak on unlikely error case
bpf, sockmap: sk_prot needs inuse_idx set for proc stats
net/core/skmsg.c | 16 +++++++++++-----
net/core/sock_map.c | 11 ++++++++++-
2 files changed, 21 insertions(+), 6 deletions(-)
--
2.25.1
From: John Fastabend <john.fastabend@gmail.com> Date: 2021-07-12 19:56:24
If skb_linearize is needed and fails we could leak a msg on the error
handling. To fix ensure we kfree the msg block before returning error.
Found during code review.
Fixes: 4363023d2668e ("bpf, sockmap: Avoid failures from skb_to_sgvec when skb has frag_list")
Signed-off-by: John Fastabend <john.fastabend@gmail.com>
---
net/core/skmsg.c | 16 +++++++++++-----
1 file changed, 11 insertions(+), 5 deletions(-)
@@ -508,10 +508,8 @@ static int sk_psock_skb_ingress_enqueue(struct sk_buff *skb,if(skb_linearize(skb))return-EAGAIN;num_sge=skb_to_sgvec(skb,msg->sg.data,0,skb->len);-if(unlikely(num_sge<0)){-kfree(msg);+if(unlikely(num_sge<0))returnnum_sge;-}copied=skb->len;msg->sg.start=0;
@@ -530,6 +528,7 @@ static int sk_psock_skb_ingress(struct sk_psock *psock, struct sk_buff *skb){structsock*sk=psock->sk;structsk_msg*msg;+interr;/* If we are receiving on the same sock skb->sk is already assigned,*skipmemoryaccountingandownertransitionseeingitalreadyset
@@ -548,7 +547,10 @@ static int sk_psock_skb_ingress(struct sk_psock *psock, struct sk_buff *skb)*intouserbuffers.*/skb_set_owner_r(skb,sk);-returnsk_psock_skb_ingress_enqueue(skb,psock,sk,msg);+err=sk_psock_skb_ingress_enqueue(skb,psock,sk,msg);+if(err<0)+kfree(msg);+returnerr;}/* Puts an skb on the ingress queue of the socket already assigned to the
From: John Fastabend <john.fastabend@gmail.com> Date: 2021-07-12 19:56:25
Proc socket stats use sk_prot->inuse_idx value to record inuse sock stats.
We currently do not set this correctly from sockmap side. The result is
reading sock stats '/proc/net/sockstat' gives incorrect values. The
socket counter is incremented correctly, but because we don't set the
counter correctly when we replace sk_prot we may omit the decrement.
To get the correct inuse_idx value move the core_initcall that initializes
the tcp/udp proto handlers to late_initcall. This way it is initialized
after TCP/UDP has the chance to assign the inuse_idx value from the
register protocol handler.
Suggested-by: Jakub Sitnicki <jakub@cloudflare.com>
Fixes: 604326b41a6fb ("bpf, sockmap: convert to generic sk_msg interface")
Signed-off-by: John Fastabend <john.fastabend@gmail.com>
---
net/ipv4/tcp_bpf.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
From: Jakub Sitnicki <jakub@cloudflare.com> Date: 2021-07-13 07:47:13
On Mon, Jul 12, 2021 at 09:55 PM CEST, John Fastabend wrote:
quoted hunk
Proc socket stats use sk_prot->inuse_idx value to record inuse sock stats.
We currently do not set this correctly from sockmap side. The result is
reading sock stats '/proc/net/sockstat' gives incorrect values. The
socket counter is incremented correctly, but because we don't set the
counter correctly when we replace sk_prot we may omit the decrement.
To get the correct inuse_idx value move the core_initcall that initializes
the tcp/udp proto handlers to late_initcall. This way it is initialized
after TCP/UDP has the chance to assign the inuse_idx value from the
register protocol handler.
Suggested-by: Jakub Sitnicki <jakub@cloudflare.com>
Fixes: 604326b41a6fb ("bpf, sockmap: convert to generic sk_msg interface")
Signed-off-by: John Fastabend <john.fastabend@gmail.com>
---
net/ipv4/tcp_bpf.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
From: Jakub Sitnicki <jakub@cloudflare.com> Date: 2021-07-13 07:47:22
On Mon, Jul 12, 2021 at 09:55 PM CEST, John Fastabend wrote:
While investigating a memleak in sockmap I found these two issues. Patch
1 found doing code review, I wasn't able to get KASAN to trigger a
memleak here, but should be necessary. Patch 2 fixes proc stats so when
we use sockstats for debugging we get correct values.
The fix for observered memleak will come after these, but requires some
more discussion and potentially patch revert so I'll try to get the set
here going now.
v4: fix both users of sk_psock_skb_ingress_enqueue and then fix the
inuse idx by moving init hook later after tcp/udp init calls.
v3: move kfree into same function as kalloc
John Fastabend (2):
bpf, sockmap: fix potential memory leak on unlikely error case
bpf, sockmap: sk_prot needs inuse_idx set for proc stats
net/core/skmsg.c | 16 +++++++++++-----
net/core/sock_map.c | 11 ++++++++++-
2 files changed, 21 insertions(+), 6 deletions(-)
For the series:
Acked-by: Jakub Sitnicki <jakub@cloudflare.com>
From: Cong Wang <hidden> Date: 2021-07-14 00:35:25
On Mon, Jul 12, 2021 at 12:56 PM John Fastabend
[off-list ref] wrote:
If skb_linearize is needed and fails we could leak a msg on the error
handling. To fix ensure we kfree the msg block before returning error.
Found during code review.
Fixes: 4363023d2668e ("bpf, sockmap: Avoid failures from skb_to_sgvec when skb has frag_list")
Signed-off-by: John Fastabend <john.fastabend@gmail.com>
Reviewed-by: Cong Wang <redacted>
Thanks for the update.
From: Cong Wang <hidden> Date: 2021-07-14 00:56:30
On Mon, Jul 12, 2021 at 12:56 PM John Fastabend
[off-list ref] wrote:
Proc socket stats use sk_prot->inuse_idx value to record inuse sock stats.
We currently do not set this correctly from sockmap side. The result is
reading sock stats '/proc/net/sockstat' gives incorrect values. The
socket counter is incremented correctly, but because we don't set the
counter correctly when we replace sk_prot we may omit the decrement.
To get the correct inuse_idx value move the core_initcall that initializes
the tcp/udp proto handlers to late_initcall. This way it is initialized
after TCP/UDP has the chance to assign the inuse_idx value from the
register protocol handler.
Suggested-by: Jakub Sitnicki <jakub@cloudflare.com>
Fixes: 604326b41a6fb ("bpf, sockmap: convert to generic sk_msg interface")
Signed-off-by: John Fastabend <john.fastabend@gmail.com>
For IPv6, I think the module is always loaded before we can
trigger tcp_bpf_check_v6_needs_rebuild(). So,
Reviewed-by: Cong Wang <redacted>
Thanks.
Hello:
This series was applied to bpf/bpf.git (refs/heads/master):
On Mon, 12 Jul 2021 12:55:44 -0700 you wrote:
While investigating a memleak in sockmap I found these two issues. Patch
1 found doing code review, I wasn't able to get KASAN to trigger a
memleak here, but should be necessary. Patch 2 fixes proc stats so when
we use sockstats for debugging we get correct values.
The fix for observered memleak will come after these, but requires some
more discussion and potentially patch revert so I'll try to get the set
here going now.
[...]