From 5a478efbb1201546d179b51c2b3f12122647b3d5 Mon Sep 17 00:00:00 2001 From: Iwona Winiarska Date: Mon, 9 May 2022 20:05:44 +0200 Subject: peci: core: Check PECI address immediately PECI address parameter provided to create peci_client instance is not validated in the function that handles data passed from userspace or DTS, it is only done later on in peci_new_device(). Let's move PECI address verification before peci_new_device() is called. Signed-off-by: Iwona Winiarska --- drivers/peci/peci-core.c | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) (limited to 'drivers') diff --git a/drivers/peci/peci-core.c b/drivers/peci/peci-core.c index 1f47ab749fb6..90820b75ae37 100644 --- a/drivers/peci/peci-core.c +++ b/drivers/peci/peci-core.c @@ -1493,13 +1493,6 @@ static struct peci_client *peci_new_device(struct peci_adapter *adapter, client->addr = info->addr; strlcpy(client->name, info->type, sizeof(client->name)); - ret = peci_check_addr_validity(client->addr); - if (ret) { - dev_err(&adapter->dev, "Invalid PECI CPU address 0x%02hx\n", - client->addr); - goto err_free_client_silent; - } - /* Check online status of client */ ret = peci_detect(adapter, client->addr); if (ret) @@ -1531,7 +1524,6 @@ err_free_client: dev_err(&adapter->dev, "Failed to register peci client %s at 0x%02x (%d)\n", client->name, client->addr, ret); -err_free_client_silent: kfree(client); err_put_adapter: peci_put_adapter(adapter); @@ -1579,7 +1571,7 @@ static ssize_t peci_sysfs_new_device(struct device *dev, struct peci_board_info info = {}; struct peci_client *client; char *blank, end; - short addr; + u8 addr; int ret; /* Parse device type */ @@ -1595,7 +1587,7 @@ static ssize_t peci_sysfs_new_device(struct device *dev, memcpy(info.type, buf, blank - buf); /* Parse remaining parameters, reject extra parameters */ - ret = sscanf(++blank, "%hi%c", &addr, &end); + ret = sscanf(++blank, "%hhi%c", &addr, &end); if (ret < 1) { dev_err(dev, "%s: Can't parse client address\n", "new_device"); return -EINVAL; @@ -1605,7 +1597,11 @@ static ssize_t peci_sysfs_new_device(struct device *dev, return -EINVAL; } - info.addr = (u8)addr; + ret = peci_check_addr_validity(addr); + if (ret) + return ret; + + info.addr = addr; client = peci_new_device(adapter, &info); if (!client) return -EINVAL; @@ -1629,7 +1625,7 @@ static ssize_t peci_sysfs_delete_device(struct device *dev, struct peci_client *client, *next; struct peci_board_info info = {}; char *blank, end; - short addr; + u8 addr; int ret; /* Parse device type */ @@ -1645,7 +1641,7 @@ static ssize_t peci_sysfs_delete_device(struct device *dev, memcpy(info.type, buf, blank - buf); /* Parse remaining parameters, reject extra parameters */ - ret = sscanf(++blank, "%hi%c", &addr, &end); + ret = sscanf(++blank, "%hhi%c", &addr, &end); if (ret < 1) { dev_err(dev, "%s: Can't parse client address\n", "delete_device"); @@ -1656,7 +1652,11 @@ static ssize_t peci_sysfs_delete_device(struct device *dev, return -EINVAL; } - info.addr = (u8)addr; + ret = peci_check_addr_validity(addr); + if (ret) + return ret; + + info.addr = addr; /* Make sure the device was added through sysfs */ ret = -ENOENT; @@ -1729,6 +1729,9 @@ static struct peci_client *peci_of_register_device(struct peci_adapter *adapter, return ERR_PTR(ret); } + ret = peci_check_addr_validity(addr); + if (ret) + return ERR_PTR(ret); info.addr = addr; info.of_node = node; -- cgit v1.2.3