When sending plaintext data, we initially calculated the corresponding
ciphertext length. However, if we later reduced the plaintext data length
via socket policy, we failed to recalculate the ciphertext length.

This results in transmitting buffers containing uninitialized data during
ciphertext transmission.

This causes uninitialized bytes to be appended after a complete
"Application Data" packet, leading to errors on the receiving end when
parsing TLS record.

Fixes: d3b18ad31f93 ("tls: add bpf support to sk_msg handling")
Reported-by: Cong Wang <xiyou.wangc...@gmail.com>
Signed-off-by: Jiayuan Chen <jiayuan.c...@linux.dev>
---
 net/tls/tls_sw.c | 15 +++++++++++++++
 1 file changed, 15 insertions(+)

diff --git a/net/tls/tls_sw.c b/net/tls/tls_sw.c
index fc88e34b7f33..b23a4655be6a 100644
--- a/net/tls/tls_sw.c
+++ b/net/tls/tls_sw.c
@@ -872,6 +872,21 @@ static int bpf_exec_tx_verdict(struct sk_msg *msg, struct 
sock *sk,
                delta = msg->sg.size;
                psock->eval = sk_psock_msg_verdict(sk, psock, msg);
                delta -= msg->sg.size;
+
+               if ((s32)delta > 0) {
+                       /* It indicates that we executed bpf_msg_pop_data(),
+                        * causing the plaintext data size to decrease.
+                        * Therefore the encrypted data size also needs to
+                        * correspondingly decrease. We only need to subtract
+                        * delta to calculate the new ciphertext length since
+                        * ktls does not support block encryption.
+                        */
+                       if (!WARN_ON_ONCE(!ctx->open_rec)) {
+                               struct sk_msg *enc = 
&ctx->open_rec->msg_encrypted;
+
+                               sk_msg_trim(sk, enc, enc->sg.size - delta);
+                       }
+               }
        }
        if (msg->cork_bytes && msg->cork_bytes > msg->sg.size &&
            !enospc && !full_record) {
-- 
2.47.1


Reply via email to