summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIwona Winiarska <iwona.winiarska@intel.com>2022-05-09 21:05:44 +0300
committerIwona Winiarska <iwona.winiarska@intel.com>2022-05-23 15:06:36 +0300
commit5a478efbb1201546d179b51c2b3f12122647b3d5 (patch)
tree6a9c97afd4031697d5415fcc6e425eaff9c29573
parentd980c385f57d76cd26aec25453b3017ba004876b (diff)
downloadlinux-5a478efbb1201546d179b51c2b3f12122647b3d5.tar.xz
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 <iwona.winiarska@intel.com>
-rw-r--r--drivers/peci/peci-core.c31
1 files changed, 17 insertions, 14 deletions
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;