[PATCH 05/16] crypto/cnxk: reject truncated TLS records in decrypt

Tejasree Kondoj ktejasree at marvell.com
Mon Oct 19 15:07:46 CEST 2026


From: Rupesh Chiluka <rchiluka at marvell.com>

The TLS decrypt tail-fetch path for CBC/3DES READ sessions computed the
tail-fetch source offset as (pkt_len - tail_len) without checking that
pkt_len >= tail_len. For an inbound record shorter than tail_len, the
subtraction underflows when passed as the uint32_t offset to
rte_pktmbuf_read(), which then returns NULL because offset + len
exceeds the packet length. The following rte_memcpy(in_buffer, output,
tail_len) dereferences that NULL pointer.

Reject records with pkt_len < tail_len (return -EINVAL) before computing
the tail-fetch offset in the scatter-gather branches of process_tls_read()
for both cn10k (SGv1 and SGv2) and cn20k.

Signed-off-by: Rupesh Chiluka <rchiluka at marvell.com>
---
 drivers/crypto/cnxk/cn10k_tls_ops.h | 12 ++++++++++++
 drivers/crypto/cnxk/cn20k_tls_ops.h |  6 ++++++
 2 files changed, 18 insertions(+)

diff --git a/drivers/crypto/cnxk/cn10k_tls_ops.h b/drivers/crypto/cnxk/cn10k_tls_ops.h
index 90600bd850..416207f676 100644
--- a/drivers/crypto/cnxk/cn10k_tls_ops.h
+++ b/drivers/crypto/cnxk/cn10k_tls_ops.h
@@ -260,6 +260,12 @@ process_tls_read(struct rte_crypto_op *cop, struct cn10k_sec_session *sess,
 		uint32_t dlen;
 		int i;
 
+		if (unlikely(pkt_len < tail_len)) {
+			plt_dp_err("Invalid TLS record: pkt_len %d < tail_len %d", pkt_len,
+				   tail_len);
+			return -EINVAL;
+		}
+
 		if (unlikely(m_src->nb_segs > ROC_SG1_MAX_PTRS)) {
 			plt_dp_err("Exceeds max supported components. Reduce segments");
 			return -1;
@@ -320,6 +326,12 @@ process_tls_read(struct rte_crypto_op *cop, struct cn10k_sec_session *sess,
 		uint32_t g_size_bytes;
 		int i;
 
+		if (unlikely(pkt_len < tail_len)) {
+			plt_dp_err("Invalid TLS record: pkt_len %d < tail_len %d", pkt_len,
+				   tail_len);
+			return -EINVAL;
+		}
+
 		if (unlikely(m_src->nb_segs > ROC_SG2_MAX_PTRS)) {
 			plt_dp_err("Exceeds max supported components. Reduce segments");
 			return -1;
diff --git a/drivers/crypto/cnxk/cn20k_tls_ops.h b/drivers/crypto/cnxk/cn20k_tls_ops.h
index e7a8ba34ae..670acbe9ab 100644
--- a/drivers/crypto/cnxk/cn20k_tls_ops.h
+++ b/drivers/crypto/cnxk/cn20k_tls_ops.h
@@ -203,6 +203,12 @@ process_tls_read(struct rte_crypto_op *cop, struct cn20k_sec_session *sess,
 		uint32_t g_size_bytes;
 		int i;
 
+		if (unlikely(pkt_len < tail_len)) {
+			plt_dp_err("Invalid TLS record: pkt_len %d < tail_len %d", pkt_len,
+				   tail_len);
+			return -EINVAL;
+		}
+
 		if (unlikely(m_src->nb_segs > ROC_SG2_MAX_PTRS)) {
 			plt_dp_err("Exceeds max supported components. Reduce segments");
 			return -1;
-- 
2.43.0



More information about the dev mailing list