| From ef4495ff459cb165f283c46d4a50683817049aca Mon Sep 17 00:00:00 2001 |
| From: Joey Zhang <joey.zhang@microchip.com> |
| Date: Mon, 10 Dec 2018 17:12:22 +0800 |
| Subject: switchtec: Fix SWITCHTEC_IOCTL_EVENT_IDX_ALL flags overwrite |
| |
| [ Upstream commit e4a7dca5de625018b29417ecc39dc5037d9a5a36 ] |
| |
| 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> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/pci/switch/switchtec.c | 3 +++ |
| 1 file changed, 3 insertions(+) |
| |
| diff --git a/drivers/pci/switch/switchtec.c b/drivers/pci/switch/switchtec.c |
| index 620f5b995a12..e3aefdafae89 100644 |
| --- a/drivers/pci/switch/switchtec.c |
| +++ b/drivers/pci/switch/switchtec.c |
| @@ -1064,6 +1064,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))) |
| @@ -1085,7 +1086,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; |
| -- |
| 2.19.1 |
| |