Skip to content

Commit c14a024

Browse files
committed
Merge branch 'tls-fixes'
Daniel Borkmann says: ==================== Two tls fixes First one is syzkaller trigered uaf and second one noticed while writing test code with tls ulp. For details please see individual patches. ==================== Signed-off-by: David S. Miller <[email protected]>
2 parents 695ad87 + 06030db commit c14a024

File tree

1 file changed

+18
-14
lines changed

1 file changed

+18
-14
lines changed

net/tls/tls_sw.c

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -191,18 +191,12 @@ static void tls_free_both_sg(struct sock *sk)
191191
}
192192

193193
static int tls_do_encryption(struct tls_context *tls_ctx,
194-
struct tls_sw_context_tx *ctx, size_t data_len,
195-
gfp_t flags)
194+
struct tls_sw_context_tx *ctx,
195+
struct aead_request *aead_req,
196+
size_t data_len)
196197
{
197-
unsigned int req_size = sizeof(struct aead_request) +
198-
crypto_aead_reqsize(ctx->aead_send);
199-
struct aead_request *aead_req;
200198
int rc;
201199

202-
aead_req = kzalloc(req_size, flags);
203-
if (!aead_req)
204-
return -ENOMEM;
205-
206200
ctx->sg_encrypted_data[0].offset += tls_ctx->tx.prepend_size;
207201
ctx->sg_encrypted_data[0].length -= tls_ctx->tx.prepend_size;
208202

@@ -219,7 +213,6 @@ static int tls_do_encryption(struct tls_context *tls_ctx,
219213
ctx->sg_encrypted_data[0].offset -= tls_ctx->tx.prepend_size;
220214
ctx->sg_encrypted_data[0].length += tls_ctx->tx.prepend_size;
221215

222-
kfree(aead_req);
223216
return rc;
224217
}
225218

@@ -228,8 +221,14 @@ static int tls_push_record(struct sock *sk, int flags,
228221
{
229222
struct tls_context *tls_ctx = tls_get_ctx(sk);
230223
struct tls_sw_context_tx *ctx = tls_sw_ctx_tx(tls_ctx);
224+
struct aead_request *req;
231225
int rc;
232226

227+
req = kzalloc(sizeof(struct aead_request) +
228+
crypto_aead_reqsize(ctx->aead_send), sk->sk_allocation);
229+
if (!req)
230+
return -ENOMEM;
231+
233232
sg_mark_end(ctx->sg_plaintext_data + ctx->sg_plaintext_num_elem - 1);
234233
sg_mark_end(ctx->sg_encrypted_data + ctx->sg_encrypted_num_elem - 1);
235234

@@ -245,15 +244,14 @@ static int tls_push_record(struct sock *sk, int flags,
245244
tls_ctx->pending_open_record_frags = 0;
246245
set_bit(TLS_PENDING_CLOSED_RECORD, &tls_ctx->flags);
247246

248-
rc = tls_do_encryption(tls_ctx, ctx, ctx->sg_plaintext_size,
249-
sk->sk_allocation);
247+
rc = tls_do_encryption(tls_ctx, ctx, req, ctx->sg_plaintext_size);
250248
if (rc < 0) {
251249
/* If we are called from write_space and
252250
* we fail, we need to set this SOCK_NOSPACE
253251
* to trigger another write_space in the future.
254252
*/
255253
set_bit(SOCK_NOSPACE, &sk->sk_socket->flags);
256-
return rc;
254+
goto out_req;
257255
}
258256

259257
free_sg(sk, ctx->sg_plaintext_data, &ctx->sg_plaintext_num_elem,
@@ -268,6 +266,8 @@ static int tls_push_record(struct sock *sk, int flags,
268266
tls_err_abort(sk, EBADMSG);
269267

270268
tls_advance_record_sn(sk, &tls_ctx->tx);
269+
out_req:
270+
kfree(req);
271271
return rc;
272272
}
273273

@@ -754,7 +754,7 @@ int tls_sw_recvmsg(struct sock *sk,
754754
struct sk_buff *skb;
755755
ssize_t copied = 0;
756756
bool cmsg = false;
757-
int err = 0;
757+
int target, err = 0;
758758
long timeo;
759759

760760
flags |= nonblock;
@@ -764,6 +764,7 @@ int tls_sw_recvmsg(struct sock *sk,
764764

765765
lock_sock(sk);
766766

767+
target = sock_rcvlowat(sk, flags & MSG_WAITALL, len);
767768
timeo = sock_rcvtimeo(sk, flags & MSG_DONTWAIT);
768769
do {
769770
bool zc = false;
@@ -856,6 +857,9 @@ int tls_sw_recvmsg(struct sock *sk,
856857
goto recv_end;
857858
}
858859
}
860+
/* If we have a new message from strparser, continue now. */
861+
if (copied >= target && !ctx->recv_pkt)
862+
break;
859863
} while (len);
860864

861865
recv_end:

0 commit comments

Comments
 (0)