diff options
author | Joey Zhang <joey.zhang@microchip.com> | 2018-12-10 17:12:22 +0800 |
---|---|---|
committer | Bjorn Helgaas <bhelgaas@google.com> | 2018-12-12 16:32:16 -0600 |
commit | e4a7dca5de625018b29417ecc39dc5037d9a5a36 (patch) | |
tree | 0ca3bd146d1c6011ed4b23c74ea88cdc9b197bf5 /drivers/pci | |
parent | aff614c6339c1ee2a74ea0afc491d6e30d0bad61 (diff) | |
download | linux-e4a7dca5de625018b29417ecc39dc5037d9a5a36.tar.bz2 |
switchtec: Fix SWITCHTEC_IOCTL_EVENT_IDX_ALL flags overwrite
In the ioctl_event_ctl() SWITCHTEC_IOCTL_EVENT_IDX_ALL case, we call
event_ctl() several times with the same "ctl" struct. Each call clobbers
ctl.flags, which leads to the problem that we may not actually enable or
disable all events as the user requested.
Preserve the event flag value with a temporary variable.
Fixes: 52eabba5bcdb ("switchtec: Add IOCTLs to the Switchtec driver")
Signed-off-by: Joey Zhang <joey.zhang@microchip.com>
Signed-off-by: Wesley Sheng <wesley.sheng@microchip.com>
[bhelgaas: changelog]
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Reviewed-by: Logan Gunthorpe <logang@deltatee.com>
Diffstat (limited to 'drivers/pci')
-rw-r--r-- | drivers/pci/switch/switchtec.c | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/drivers/pci/switch/switchtec.c b/drivers/pci/switch/switchtec.c index 480107ecb2ab..a90867099ff8 100644 --- a/drivers/pci/switch/switchtec.c +++ b/drivers/pci/switch/switchtec.c @@ -796,6 +796,7 @@ static int ioctl_event_ctl(struct switchtec_dev *stdev, { int ret; int nr_idxs; + unsigned int event_flags; struct switchtec_ioctl_event_ctl ctl; if (copy_from_user(&ctl, uctl, sizeof(ctl))) @@ -817,7 +818,9 @@ static int ioctl_event_ctl(struct switchtec_dev *stdev, else return -EINVAL; + event_flags = ctl.flags; for (ctl.index = 0; ctl.index < nr_idxs; ctl.index++) { + ctl.flags = event_flags; ret = event_ctl(stdev, &ctl); if (ret < 0) return ret; |