aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--kernel/bpf/sockmap.c15
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: