diff options
Diffstat (limited to 'fs/proc/base.c')
| -rw-r--r-- | fs/proc/base.c | 15 | 
1 files changed, 13 insertions, 2 deletions
diff --git a/fs/proc/base.c b/fs/proc/base.c index 6042b646ab27..eb2255e95f62 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c @@ -1573,6 +1573,7 @@ static ssize_t timens_offsets_write(struct file *file, const char __user *buf,  	noffsets = 0;  	for (pos = kbuf; pos; pos = next_line) {  		struct proc_timens_offset *off = &offsets[noffsets]; +		char clock[10];  		int err;  		/* Find the end of line and ensure we don't look past it */ @@ -1584,10 +1585,21 @@ static ssize_t timens_offsets_write(struct file *file, const char __user *buf,  				next_line = NULL;  		} -		err = sscanf(pos, "%u %lld %lu", &off->clockid, +		err = sscanf(pos, "%9s %lld %lu", clock,  				&off->val.tv_sec, &off->val.tv_nsec);  		if (err != 3 || off->val.tv_nsec >= NSEC_PER_SEC)  			goto out; + +		clock[sizeof(clock) - 1] = 0; +		if (strcmp(clock, "monotonic") == 0 || +		    strcmp(clock, __stringify(CLOCK_MONOTONIC)) == 0) +			off->clockid = CLOCK_MONOTONIC; +		else if (strcmp(clock, "boottime") == 0 || +			 strcmp(clock, __stringify(CLOCK_BOOTTIME)) == 0) +			off->clockid = CLOCK_BOOTTIME; +		else +			goto out; +  		noffsets++;  		if (noffsets == ARRAY_SIZE(offsets)) {  			if (next_line) @@ -3274,7 +3286,6 @@ static const struct inode_operations proc_tgid_base_inode_operations = {  void proc_flush_pid(struct pid *pid)  {  	proc_invalidate_siblings_dcache(&pid->inodes, &pid->lock); -	put_pid(pid);  }  static struct dentry *proc_pid_instantiate(struct dentry * dentry,  |