OSDN Git Service

PCI/ASPM: Use standard parsing functions for sysfs setters
authorChris J Arges <chris.j.arges@canonical.com>
Fri, 5 Dec 2014 23:02:42 +0000 (17:02 -0600)
committerBjorn Helgaas <bhelgaas@google.com>
Fri, 9 Jan 2015 17:55:16 +0000 (10:55 -0700)
The functions link_state_store() and clk_ctl_store() had just subtracted
ASCII '0' from input which could lead to undesired results.  Instead, use
Linux string functions to safely parse input.

[bhelgaas: check kstrtouint() return value]
Signed-off-by: Chris J Arges <chris.j.arges@canonical.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
drivers/pci/pcie/aspm.c

index e1e7026..820740a 100644 (file)
@@ -859,7 +859,10 @@ static ssize_t link_state_store(struct device *dev,
 {
        struct pci_dev *pdev = to_pci_dev(dev);
        struct pcie_link_state *link, *root = pdev->link_state->root;
-       u32 val = buf[0] - '0', state = 0;
+       u32 val, state = 0;
+
+       if (kstrtouint(buf, 10, &val))
+               return -EINVAL;
 
        if (aspm_disabled)
                return -EPERM;
@@ -900,15 +903,14 @@ static ssize_t clk_ctl_store(struct device *dev,
                size_t n)
 {
        struct pci_dev *pdev = to_pci_dev(dev);
-       int state;
+       bool state;
 
-       if (n < 1)
+       if (strtobool(buf, &state))
                return -EINVAL;
-       state = buf[0]-'0';
 
        down_read(&pci_bus_sem);
        mutex_lock(&aspm_lock);
-       pcie_set_clkpm_nocheck(pdev->link_state, !!state);
+       pcie_set_clkpm_nocheck(pdev->link_state, state);
        mutex_unlock(&aspm_lock);
        up_read(&pci_bus_sem);