From: Keith Busch Date: Fri, 6 Aug 2021 21:01:24 +0000 (-0700) Subject: Merge branch 'master' of https://github.com/fixthething/nvme-cli into fixthething... X-Git-Tag: v1.15~3 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=1354299cb3512caa2b1eb8eda127e61613f1fa0c;p=users%2Fsagi%2Fnvme-cli.git Merge branch 'master' of https://github.com/fixthething/nvme-cli into fixthething-master --- 1354299cb3512caa2b1eb8eda127e61613f1fa0c diff --cc nvme-ioctl.h index 7be1ffdd,40231c19..2e24b83d --- a/nvme-ioctl.h +++ b/nvme-ioctl.h @@@ -140,10 -136,10 +140,10 @@@ int nvme_ns_attachment(int fd, __u32 ns __u16 *ctrlist, bool attach); int nvme_fw_download(int fd, __u32 offset, __u32 data_len, void *data); -int nvme_fw_commit(int fd, __u8 slot, __u8 action, __u8 bpid); +int nvme_fw_commit(int fd, __u8 slot, __u8 action, __u8 bpid, __u32 *result); int nvme_sec_send(int fd, __u32 nsid, __u8 nssf, __u16 spsp, - __u8 secp, __u32 tl, __u32 data_len, void *data); + __u8 secp, __u32 data_len, void *data); int nvme_sec_recv(int fd, __u32 nsid, __u8 nssf, __u16 spsp, __u8 secp, __u32 al, __u32 data_len, void *data); diff --cc nvme.c index dde7a13e,eb42d35b..86f26f30 --- a/nvme.c +++ b/nvme.c @@@ -3962,26 -3646,38 +3962,50 @@@ static int sec_send(int argc, char **ar if (fd < 0) goto ret; + if (cfg.tl == 0) { + fprintf(stderr, "--tl unspecified or zero\n"); + err = -EINVAL; + goto close_fd; + } ++ + sec_fd = open(cfg.file, O_RDONLY); + if (sec_fd < 0) { + fprintf(stderr, "Failed to open %s: %s\n", + cfg.file, strerror(errno)); + errno = EINVAL; + err = -1; + goto close_fd; + } + - err = fstat(sec_fd, &sb); - if (err < 0) { - perror("fstat"); - goto close_sec_fd; + if ((cfg.tl & 3) != 0) + fprintf(stderr, "WARNING: --tl not dword aligned; unaligned bytes may be truncated\n"); + + if (strlen(cfg.file) == 0) { + sec_fd = STDIN_FILENO; + sec_size = cfg.tl; + } else { + sec_fd = open(cfg.file, O_RDONLY); + if (sec_fd < 0) { + fprintf(stderr, "Failed to open %s: %s\n", + cfg.file, strerror(errno)); + err = -EINVAL; + goto close_fd; + } + + err = fstat(sec_fd, &sb); + if (err < 0) { + perror("fstat"); + goto close_sec_fd; + } + + sec_size = cfg.tl > sb.st_size ? cfg.tl : sb.st_size; } - if (posix_memalign(&sec_buf, getpagesize(), cfg.tl)) { - fprintf(stderr, "No memory for security size:%d\n", cfg.tl); - err = -ENOMEM; + sec_size = sb.st_size; + if (posix_memalign(&sec_buf, getpagesize(), sec_size)) { + fprintf(stderr, "No memory for security size:%d\n", sec_size); + errno = ENOMEM; + err = -1; goto close_sec_fd; }