Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2849a7be authored by Scott Bauer's avatar Scott Bauer Committed by Jens Axboe
Browse files

nvme/lightnvm: Prevent small buffer overflow in nvme_nvm_identify



There are two closely named structs in lightnvm:
struct nvme_nvm_addr_format and
struct nvme_addr_format.

The first struct has 4 reserved bytes at the end, the second does not.
(gdb) p sizeof(struct nvme_nvm_addr_format)
$1 = 16
(gdb) p sizeof(struct nvm_addr_format)
$2 = 12

In the nvme_nvm_identify function we memcpy from the larger struct to the
smaller struct. We incorrectly pass the length of the larger struct
and overflow by 4 bytes, lets not do that.

Signed-off-by: default avatarScott Bauer <scott.bauer@intel.com>
Signed-off-by: default avatarMatias Bjørling <matias@cnexlabs.com>
Signed-off-by: default avatarJens Axboe <axboe@fb.com>
parent 654a01b7
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -324,7 +324,7 @@ static int nvme_nvm_identity(struct nvm_dev *nvmdev, struct nvm_id *nvm_id)
	nvm_id->cap = le32_to_cpu(nvme_nvm_id->cap);
	nvm_id->cap = le32_to_cpu(nvme_nvm_id->cap);
	nvm_id->dom = le32_to_cpu(nvme_nvm_id->dom);
	nvm_id->dom = le32_to_cpu(nvme_nvm_id->dom);
	memcpy(&nvm_id->ppaf, &nvme_nvm_id->ppaf,
	memcpy(&nvm_id->ppaf, &nvme_nvm_id->ppaf,
					sizeof(struct nvme_nvm_addr_format));
					sizeof(struct nvm_addr_format));


	ret = init_grps(nvm_id, nvme_nvm_id);
	ret = init_grps(nvm_id, nvme_nvm_id);
out:
out: