tls: rx: strp: preserve decryption status of skbs when needed
authorJakub Kicinski <kuba@kernel.org>
Wed, 17 May 2023 01:50:41 +0000 (18:50 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 5 Jun 2023 07:26:18 +0000 (09:26 +0200)
commit3347ac7a81608b30671d49d9be20f8b5563f0957
tree5076f309811be656c7c50fddc80b7aed5764d486
parentba93977437e7c6554563e5d75c9bf4a04b387a60
tls: rx: strp: preserve decryption status of skbs when needed

[ Upstream commit eca9bfafee3a0487e59c59201ae14c7594ba940a ]

When receive buffer is small we try to copy out the data from
TCP into a skb maintained by TLS to prevent connection from
stalling. Unfortunately if a single record is made up of a mix
of decrypted and non-decrypted skbs combining them into a single
skb leads to loss of decryption status, resulting in decryption
errors or data corruption.

Similarly when trying to use TCP receive queue directly we need
to make sure that all the skbs within the record have the same
status. If we don't the mixed status will be detected correctly
but we'll CoW the anchor, again collapsing it into a single paged
skb without decrypted status preserved. So the "fixup" code will
not know which parts of skb to re-encrypt.

Fixes: 84c61fe1a75b ("tls: rx: do not use the standard strparser")
Tested-by: Shai Amiram <samiram@nvidia.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Reviewed-by: Simon Horman <simon.horman@corigine.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Sasha Levin <sashal@kernel.org>
include/net/tls.h
net/tls/tls.h
net/tls/tls_device.c
net/tls/tls_strp.c