diff options
-rw-r--r-- | kernel/bpf/sockmap.c | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/kernel/bpf/sockmap.c b/kernel/bpf/sockmap.c index 943929a05c92..052c313b12db 100644 --- a/kernel/bpf/sockmap.c +++ b/kernel/bpf/sockmap.c | |||
@@ -701,15 +701,22 @@ more_data: | |||
701 | err = bpf_tcp_sendmsg_do_redirect(redir, send, m, flags); | 701 | err = bpf_tcp_sendmsg_do_redirect(redir, send, m, flags); |
702 | lock_sock(sk); | 702 | lock_sock(sk); |
703 | 703 | ||
704 | if (unlikely(err < 0)) { | ||
705 | free_start_sg(sk, m); | ||
706 | psock->sg_size = 0; | ||
707 | if (!cork) | ||
708 | *copied -= send; | ||
709 | } else { | ||
710 | psock->sg_size -= send; | ||
711 | } | ||
712 | |||
704 | if (cork) { | 713 | if (cork) { |
705 | free_start_sg(sk, m); | 714 | free_start_sg(sk, m); |
715 | psock->sg_size = 0; | ||
706 | kfree(m); | 716 | kfree(m); |
707 | m = NULL; | 717 | m = NULL; |
718 | err = 0; | ||
708 | } | 719 | } |
709 | if (unlikely(err)) | ||
710 | *copied -= err; | ||
711 | else | ||
712 | psock->sg_size -= send; | ||
713 | break; | 720 | break; |
714 | case __SK_DROP: | 721 | case __SK_DROP: |
715 | default: | 722 | default: |