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>
Unified · Split
| @@ -859,7 +859,10 @@ static ssize_t link_state_store(struct device *dev, · 858 unmodified lines | ||
| 859 | 859 | { |
| 860 | 860 | struct pci_dev *pdev = to_pci_dev(dev); |
| 861 | 861 | struct pcie_link_state *link, *root = pdev->link_state->root; |
| 862 | − u32 val = buf[0] - '0', state = 0; | |
| 862 | + u32 val, state = 0; | |
| 863 | + | |
| 864 | + if (kstrtouint(buf, 10, &val)) | |
| 865 | + return -EINVAL; | |
| 863 | 866 | |
| 864 | 867 | if (aspm_disabled) |
| 865 | 868 | return -EPERM; |
| @@ -900,15 +903,14 @@ static ssize_t clk_ctl_store(struct device *dev, · 34 unmodified lines | ||
| 900 | 903 | size_t n) |
| 901 | 904 | { |
| 902 | 905 | struct pci_dev *pdev = to_pci_dev(dev); |
| 903 | − int state; | |
| 906 | + bool state; | |
| 904 | 907 | |
| 905 | − if (n < 1) | |
| 908 | + if (strtobool(buf, &state)) | |
| 906 | 909 | return -EINVAL; |
| 907 | − state = buf[0]-'0'; | |
| 908 | 910 | |
| 909 | 911 | down_read(&pci_bus_sem); |
| 910 | 912 | mutex_lock(&aspm_lock); |
| 911 | − pcie_set_clkpm_nocheck(pdev->link_state, !!state); | |
| 913 | + pcie_set_clkpm_nocheck(pdev->link_state, state); | |
| 912 | 914 | mutex_unlock(&aspm_lock); |
| 913 | 915 | up_read(&pci_bus_sem); |
| 914 | 916 | |