Skip to content

Commit 42f788e

Browse files
maurizio-lombardiigaw
authored andcommitted
nvme: telemetry: report the correct error if the ioctl() fails.
It's wrong to assume that if the ioctl() returns a non-zero number then the errno variable is set. The ioctl() might return an NVMe Status error to inform the caller that the requested log page is not supported, in that case errno is left untouched. The original code didn't handle this case and returned "-errno" even when the latter was zero. The caller interpreted this as a successful operation and this might lead to improperly dereferencing the log page pointer. $ nvme telemetry-log /dev/nvme0 --output-file=telemetry_log.bin ERROR: get_telemetry_log: : write failed with error : Bad address Fix this bug by returning the NVMe status if errno is zero: $ nvme telemetry-log /dev/nvme0 --output-file=telemetry_log.bin NVMe status: Invalid Log Page: The log page indicated is invalid(0x109) Failed to acquire telemetry log 265! Signed-off-by: Maurizio Lombardi <mlombard@redhat.com>
1 parent f62f9ad commit 42f788e

File tree

1 file changed

+14
-4
lines changed

1 file changed

+14
-4
lines changed

nvme.c

+14-4
Original file line numberDiff line numberDiff line change
@@ -717,7 +717,10 @@ static int get_log_telemetry_ctrl(struct nvme_dev *dev, bool rae, size_t size,
717717
err = nvme_cli_get_log_telemetry_ctrl(dev, rae, 0, size, log);
718718
if (err) {
719719
free(log);
720-
return -errno;
720+
if (errno)
721+
return -errno;
722+
else
723+
return err;
721724
}
722725

723726
*buf = log;
@@ -737,7 +740,10 @@ static int get_log_telemetry_host(struct nvme_dev *dev, size_t size,
737740
err = nvme_cli_get_log_telemetry_host(dev, 0, size, log);
738741
if (err) {
739742
free(log);
740-
return -errno;
743+
if (errno)
744+
return -errno;
745+
else
746+
return err;
741747
}
742748

743749
*buf = log;
@@ -757,8 +763,12 @@ static int __create_telemetry_log_host(struct nvme_dev *dev,
757763
return -ENOMEM;
758764

759765
err = nvme_cli_get_log_create_telemetry_host(dev, log);
760-
if (err)
761-
return -errno;
766+
if (err) {
767+
if (errno)
768+
return -errno;
769+
else
770+
return err;
771+
}
762772

763773
err = parse_telemetry_da(dev, da, log, size);
764774
if (err)

0 commit comments

Comments
 (0)