diff options
| author | Rodolfo Giometti <giometti@linux.it> | 2009-11-11 17:26:52 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-11-12 10:26:00 -0500 |
| commit | cbf83cc5a29dba480cf1ba1c5e3417a0d4a31410 (patch) | |
| tree | eb7757638e0a8e5509066eebec053a7bffe0138a | |
| parent | 69fd8d24673a8f4f8be5db7f84b5dc9e4ff354c8 (diff) | |
pps: locking scheme fix up for PPS_GETPARAMS
Userland programs may read/write PPS parameters at same time and these
operations may corrupt PPS data.
Signed-off-by: Rodolfo Giometti <giometti@linux.it>
Tested-by: Reg Clemens <clemens@dwf.com>
Cc: <stable@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
| -rw-r--r-- | drivers/pps/pps.c | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/drivers/pps/pps.c b/drivers/pps/pps.c index fea17e7805e9..ca5183bdad85 100644 --- a/drivers/pps/pps.c +++ b/drivers/pps/pps.c | |||
| @@ -71,9 +71,14 @@ static long pps_cdev_ioctl(struct file *file, | |||
| 71 | case PPS_GETPARAMS: | 71 | case PPS_GETPARAMS: |
| 72 | pr_debug("PPS_GETPARAMS: source %d\n", pps->id); | 72 | pr_debug("PPS_GETPARAMS: source %d\n", pps->id); |
| 73 | 73 | ||
| 74 | /* Return current parameters */ | 74 | spin_lock_irq(&pps->lock); |
| 75 | err = copy_to_user(uarg, &pps->params, | 75 | |
| 76 | sizeof(struct pps_kparams)); | 76 | /* Get the current parameters */ |
| 77 | params = pps->params; | ||
| 78 | |||
| 79 | spin_unlock_irq(&pps->lock); | ||
| 80 | |||
| 81 | err = copy_to_user(uarg, ¶ms, sizeof(struct pps_kparams)); | ||
| 77 | if (err) | 82 | if (err) |
| 78 | return -EFAULT; | 83 | return -EFAULT; |
| 79 | 84 | ||
