]> www.infradead.org Git - nvme.git/commitdiff
nvme-tcp: fix signedness bug in nvme_tcp_init_connection() nvme-6.14-2025-03-05
authorDan Carpenter <dan.carpenter@linaro.org>
Wed, 5 Mar 2025 15:52:59 +0000 (18:52 +0300)
committerKeith Busch <kbusch@kernel.org>
Wed, 5 Mar 2025 18:37:01 +0000 (10:37 -0800)
The kernel_recvmsg() function returns an int which could be either
negative error codes or the number of bytes received.  The problem is
that the condition:

        if (ret < sizeof(*icresp)) {

is type promoted to type unsigned long and negative values are treated
as high positive values which is success, when they should be treated as
failure.  Handle invalid positive returns separately from negative
error codes to avoid this problem.

Fixes: 578539e09690 ("nvme-tcp: fix connect failure on receiving partial ICResp PDU")
Signed-off-by: Dan Carpenter <dan.carpenter@linaro.org>
Reviewed-by: Caleb Sander Mateos <csander@purestorage.com>
Reviewed-by: Sagi Grimberg <sagi@grimberg.me>
Reviewed-by: Chaitanya Kulkarni <kch@nvidia.com>
Signed-off-by: Keith Busch <kbusch@kernel.org>
drivers/nvme/host/tcp.c

index 23f11527d29d09d9b2164add16fad11562608556..327f3f2f5399c3db0609ef2da4df9092930da338 100644 (file)
@@ -1521,11 +1521,11 @@ static int nvme_tcp_init_connection(struct nvme_tcp_queue *queue)
        msg.msg_flags = MSG_WAITALL;
        ret = kernel_recvmsg(queue->sock, &msg, &iov, 1,
                        iov.iov_len, msg.msg_flags);
-       if (ret < sizeof(*icresp)) {
+       if (ret >= 0 && ret < sizeof(*icresp))
+               ret = -ECONNRESET;
+       if (ret < 0) {
                pr_warn("queue %d: failed to receive icresp, error %d\n",
                        nvme_tcp_queue_id(queue), ret);
-               if (ret >= 0)
-                       ret = -ECONNRESET;
                goto free_icresp;
        }
        ret = -ENOTCONN;