diff options
author | Chris Leech <cleech@redhat.com> | 2023-03-21 17:30:25 +0100 |
---|---|---|
committer | Christoph Hellwig <hch@lst.de> | 2023-04-13 08:55:05 +0200 |
commit | aeacfcefa218f4ed11da478e9b7915a37d1afaff (patch) | |
tree | b1a61cbfa402e121052872e729e305ca9bd6d5ac /drivers/nvme | |
parent | nvmet: remove nvmet_req_cns_error_complete (diff) | |
download | linux-aeacfcefa218f4ed11da478e9b7915a37d1afaff.tar.xz linux-aeacfcefa218f4ed11da478e9b7915a37d1afaff.zip |
nvme-tcp: fence TCP socket on receive error
Ensure that no further socket reads occur after a receive processing
error, either from io_work being re-scheduled or nvme_tcp_poll.
Failing to do so can result in unrecognised PDU payloads or TCP stream
garbage being processed as a C2H data PDU, and potentially start copying
the payload to an invalid destination after looking up a request using a
bogus command id.
Signed-off-by: Chris Leech <cleech@redhat.com>
Reviewed-by: Sagi Grimberg <sagi@grimberg.me>
Reviewed-by: John Meneghini <jmeneghi@redhat.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
Diffstat (limited to 'drivers/nvme')
-rw-r--r-- | drivers/nvme/host/tcp.c | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/drivers/nvme/host/tcp.c b/drivers/nvme/host/tcp.c index 7723a4989524..273c1f2760a4 100644 --- a/drivers/nvme/host/tcp.c +++ b/drivers/nvme/host/tcp.c @@ -876,6 +876,9 @@ static int nvme_tcp_recv_skb(read_descriptor_t *desc, struct sk_buff *skb, size_t consumed = len; int result; + if (unlikely(!queue->rd_enabled)) + return -EFAULT; + while (len) { switch (nvme_tcp_recv_state(queue)) { case NVME_TCP_RECV_PDU: |