diff options
| author | Mark Brown <broonie@kernel.org> | 2020-08-25 11:01:46 +0100 | 
|---|---|---|
| committer | Mark Brown <broonie@kernel.org> | 2020-08-25 11:01:46 +0100 | 
| commit | 3bec5b6aae830355e786e204b20a7cea38c3a8ed (patch) | |
| tree | fd597b87faf55ceb2a207ee94f4feca6276696db /net/core/skmsg.c | |
| parent | a577f3456c0a2fac3dee037c483753e6e68f3e49 (diff) | |
| parent | d012a7190fc1fd72ed48911e77ca97ba4521bccd (diff) | |
Merge tag 'v5.9-rc2' into regulator-5.9
Linux 5.9-rc2
Diffstat (limited to 'net/core/skmsg.c')
| -rw-r--r-- | net/core/skmsg.c | 23 | 
1 files changed, 15 insertions, 8 deletions
diff --git a/net/core/skmsg.c b/net/core/skmsg.c index 351afbf6bfba..6a32a1fd34f8 100644 --- a/net/core/skmsg.c +++ b/net/core/skmsg.c @@ -683,7 +683,7 @@ static struct sk_psock *sk_psock_from_strp(struct strparser *strp)  	return container_of(parser, struct sk_psock, parser);  } -static void sk_psock_skb_redirect(struct sk_psock *psock, struct sk_buff *skb) +static void sk_psock_skb_redirect(struct sk_buff *skb)  {  	struct sk_psock *psock_other;  	struct sock *sk_other; @@ -715,12 +715,11 @@ static void sk_psock_skb_redirect(struct sk_psock *psock, struct sk_buff *skb)  	}  } -static void sk_psock_tls_verdict_apply(struct sk_psock *psock, -				       struct sk_buff *skb, int verdict) +static void sk_psock_tls_verdict_apply(struct sk_buff *skb, int verdict)  {  	switch (verdict) {  	case __SK_REDIRECT: -		sk_psock_skb_redirect(psock, skb); +		sk_psock_skb_redirect(skb);  		break;  	case __SK_PASS:  	case __SK_DROP: @@ -741,8 +740,8 @@ int sk_psock_tls_strp_read(struct sk_psock *psock, struct sk_buff *skb)  		ret = sk_psock_bpf_run(psock, prog, skb);  		ret = sk_psock_map_verd(ret, tcp_skb_bpf_redirect_fetch(skb));  	} +	sk_psock_tls_verdict_apply(skb, ret);  	rcu_read_unlock(); -	sk_psock_tls_verdict_apply(psock, skb, ret);  	return ret;  }  EXPORT_SYMBOL_GPL(sk_psock_tls_strp_read); @@ -770,7 +769,7 @@ static void sk_psock_verdict_apply(struct sk_psock *psock,  		}  		goto out_free;  	case __SK_REDIRECT: -		sk_psock_skb_redirect(psock, skb); +		sk_psock_skb_redirect(skb);  		break;  	case __SK_DROP:  		/* fall-through */ @@ -782,11 +781,18 @@ out_free:  static void sk_psock_strp_read(struct strparser *strp, struct sk_buff *skb)  { -	struct sk_psock *psock = sk_psock_from_strp(strp); +	struct sk_psock *psock;  	struct bpf_prog *prog;  	int ret = __SK_DROP; +	struct sock *sk;  	rcu_read_lock(); +	sk = strp->sk; +	psock = sk_psock(sk); +	if (unlikely(!psock)) { +		kfree_skb(skb); +		goto out; +	}  	prog = READ_ONCE(psock->progs.skb_verdict);  	if (likely(prog)) {  		skb_orphan(skb); @@ -794,8 +800,9 @@ static void sk_psock_strp_read(struct strparser *strp, struct sk_buff *skb)  		ret = sk_psock_bpf_run(psock, prog, skb);  		ret = sk_psock_map_verd(ret, tcp_skb_bpf_redirect_fetch(skb));  	} -	rcu_read_unlock();  	sk_psock_verdict_apply(psock, skb, ret); +out: +	rcu_read_unlock();  }  static int sk_psock_strp_read_done(struct strparser *strp, int err)  | 
