From: Dan Carpenter Date: Wed, 26 Nov 2025 12:11:53 +0000 (+0300) Subject: nvdimm: Prevent integer overflow in ramdax_get_config_data() X-Git-Tag: v6.19-rc1~85^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=30065e73d7c018cf2e1bec68e2d6ffafc17b3c25;p=thirdparty%2Flinux.git 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: 43bc0aa19a21 ("nvdimm: allow exposing RAM carveouts as NVDIMM DIMM devices") Signed-off-by: Dan Carpenter Acked-by: Mike Rapoport (Microsoft) Link: https://patch.msgid.link/aSbuiYCznEIZDa02@stanley.mountain Signed-off-by: Ira Weiny --- diff --git a/drivers/nvdimm/ramdax.c b/drivers/nvdimm/ramdax.c index 63cf057918290..954cb79198070 100644 --- a/drivers/nvdimm/ramdax.c +++ b/drivers/nvdimm/ramdax.c @@ -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);