diff options
Diffstat (limited to 'kernel/pid.c')
| -rw-r--r-- | kernel/pid.c | 15 | 
1 files changed, 10 insertions, 5 deletions
diff --git a/kernel/pid.c b/kernel/pid.c index ebdf9c60cd0b..efe87db44683 100644 --- a/kernel/pid.c +++ b/kernel/pid.c @@ -550,13 +550,21 @@ struct pid *pidfd_get_pid(unsigned int fd, unsigned int *flags)   * Note, that this function can only be called after the fd table has   * been unshared to avoid leaking the pidfd to the new process.   * + * This symbol should not be explicitly exported to loadable modules. + *   * Return: On success, a cloexec pidfd is returned.   *         On error, a negative errno number will be returned.   */ -static int pidfd_create(struct pid *pid, unsigned int flags) +int pidfd_create(struct pid *pid, unsigned int flags)  {  	int fd; +	if (!pid || !pid_has_task(pid, PIDTYPE_TGID)) +		return -EINVAL; + +	if (flags & ~(O_NONBLOCK | O_RDWR | O_CLOEXEC)) +		return -EINVAL; +  	fd = anon_inode_getfd("[pidfd]", &pidfd_fops, get_pid(pid),  			      flags | O_RDWR | O_CLOEXEC);  	if (fd < 0) @@ -596,10 +604,7 @@ SYSCALL_DEFINE2(pidfd_open, pid_t, pid, unsigned int, flags)  	if (!p)  		return -ESRCH; -	if (pid_has_task(p, PIDTYPE_TGID)) -		fd = pidfd_create(p, flags); -	else -		fd = -EINVAL; +	fd = pidfd_create(p, flags);  	put_pid(p);  	return fd;  |