Commit 30065e73 authored by Dan Carpenter's avatar Dan Carpenter Committed by Ira Weiny
Browse files

nvdimm: Prevent integer overflow in ramdax_get_config_data()



The "cmd->in_offset" variable comes from the user via the __nd_ioctl()
function.  The problem is that the "cmd->in_offset + cmd->in_length"
addition could have an integer wrapping issue if cmd->in_offset is close
to UINT_MAX .  Both "cmd->in_offset" and "cmd->in_length" are u32
variables.

Fixes: 43bc0aa1 ("nvdimm: allow exposing RAM carveouts as NVDIMM DIMM devices")
Signed-off-by: default avatarDan Carpenter <dan.carpenter@linaro.org>
Acked-by: default avatarMike Rapoport (Microsoft) <rppt@kernel.org>
Link: https://patch.msgid.link/aSbuiYCznEIZDa02@stanley.mountain


Signed-off-by: default avatarIra Weiny <ira.weiny@intel.com>
parent acd9ea17
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -143,7 +143,7 @@ static int ramdax_get_config_data(struct nvdimm *nvdimm, int buf_len,
		return -EINVAL;
	if (struct_size(cmd, out_buf, cmd->in_length) > buf_len)
		return -EINVAL;
	if (cmd->in_offset + cmd->in_length > LABEL_AREA_SIZE)
	if (size_add(cmd->in_offset, cmd->in_length) > LABEL_AREA_SIZE)
		return -EINVAL;

	memcpy(cmd->out_buf, dimm->label_area + cmd->in_offset, cmd->in_length);
@@ -160,7 +160,7 @@ static int ramdax_set_config_data(struct nvdimm *nvdimm, int buf_len,
		return -EINVAL;
	if (struct_size(cmd, in_buf, cmd->in_length) > buf_len)
		return -EINVAL;
	if (cmd->in_offset + cmd->in_length > LABEL_AREA_SIZE)
	if (size_add(cmd->in_offset, cmd->in_length) > LABEL_AREA_SIZE)
		return -EINVAL;

	memcpy(dimm->label_area + cmd->in_offset, cmd->in_buf, cmd->in_length);