diff options
| author | Torben Hohn <torbenh@gmx.de> | 2011-03-03 18:26:14 +0100 | 
|---|---|---|
| committer | Thomas Gleixner <tglx@linutronix.de> | 2011-03-12 21:27:07 +0100 | 
| commit | 6e6823d17b157f185be09f4c70181299f9273f0b (patch) | |
| tree | 8a9009e2d54955c1a9c5a033493c8668915d09f8 /kernel/time/posix-clock.c | |
| parent | a9e7acfff0a279792918b7b0de74106e576e9988 (diff) | |
| download | olio-linux-3.10-6e6823d17b157f185be09f4c70181299f9273f0b.tar.xz olio-linux-3.10-6e6823d17b157f185be09f4c70181299f9273f0b.zip  | |
posix-clocks: Check write permissions in posix syscalls
pc_clock_settime() and pc_clock_adjtime() do not check whether the fd
was opened in write mode, so a clock can be set with a read only fd.
[ tglx: We deliberately do not return -EPERM as we want this to be
  	distingushable from the capability based permission check ]
Signed-off-by: Torben Hohn <torbenh@gmx.de>
LKML-Reference: <1299173174-348-4-git-send-email-torbenh@gmx.de>
Cc: Richard Cochran <richard.cochran@omicron.at>
Cc: John Stultz <johnstul@us.ibm.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'kernel/time/posix-clock.c')
| -rw-r--r-- | kernel/time/posix-clock.c | 14 | 
1 files changed, 12 insertions, 2 deletions
diff --git a/kernel/time/posix-clock.c b/kernel/time/posix-clock.c index 04498cbf600..25028dd4fa1 100644 --- a/kernel/time/posix-clock.c +++ b/kernel/time/posix-clock.c @@ -287,11 +287,16 @@ static int pc_clock_adjtime(clockid_t id, struct timex *tx)  	if (err)  		return err; +	if ((cd.fp->f_mode & FMODE_WRITE) == 0) { +		err = -EACCES; +		goto out; +	} +  	if (cd.clk->ops.clock_adjtime)  		err = cd.clk->ops.clock_adjtime(cd.clk, tx);  	else  		err = -EOPNOTSUPP; - +out:  	put_clock_desc(&cd);  	return err; @@ -344,11 +349,16 @@ static int pc_clock_settime(clockid_t id, const struct timespec *ts)  	if (err)  		return err; +	if ((cd.fp->f_mode & FMODE_WRITE) == 0) { +		err = -EACCES; +		goto out; +	} +  	if (cd.clk->ops.clock_settime)  		err = cd.clk->ops.clock_settime(cd.clk, ts);  	else  		err = -EOPNOTSUPP; - +out:  	put_clock_desc(&cd);  	return err;  |