Commit 635d9398 authored by Vadim Fedorenko's avatar Vadim Fedorenko Committed by David S. Miller

net/tls: free record only on encryption error

We cannot free record on any transient error because it leads to
losing previos data. Check socket error to know whether record must
be freed or not.

Fixes: d10523d0 ("net/tls: free the record on encryption error")
Signed-off-by: default avatarVadim Fedorenko <vfedorenko@novek.ru>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent a7bff11f
...@@ -796,9 +796,10 @@ static int bpf_exec_tx_verdict(struct sk_msg *msg, struct sock *sk, ...@@ -796,9 +796,10 @@ static int bpf_exec_tx_verdict(struct sk_msg *msg, struct sock *sk,
psock = sk_psock_get(sk); psock = sk_psock_get(sk);
if (!psock || !policy) { if (!psock || !policy) {
err = tls_push_record(sk, flags, record_type); err = tls_push_record(sk, flags, record_type);
if (err && err != -EINPROGRESS) { if (err && sk->sk_err == EBADMSG) {
*copied -= sk_msg_free(sk, msg); *copied -= sk_msg_free(sk, msg);
tls_free_open_rec(sk); tls_free_open_rec(sk);
err = -sk->sk_err;
} }
if (psock) if (psock)
sk_psock_put(sk, psock); sk_psock_put(sk, psock);
...@@ -824,9 +825,10 @@ static int bpf_exec_tx_verdict(struct sk_msg *msg, struct sock *sk, ...@@ -824,9 +825,10 @@ static int bpf_exec_tx_verdict(struct sk_msg *msg, struct sock *sk,
switch (psock->eval) { switch (psock->eval) {
case __SK_PASS: case __SK_PASS:
err = tls_push_record(sk, flags, record_type); err = tls_push_record(sk, flags, record_type);
if (err && err != -EINPROGRESS) { if (err && sk->sk_err == EBADMSG) {
*copied -= sk_msg_free(sk, msg); *copied -= sk_msg_free(sk, msg);
tls_free_open_rec(sk); tls_free_open_rec(sk);
err = -sk->sk_err;
goto out_err; goto out_err;
} }
break; break;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment