Allow passing O_PATH descriptors via SCM_RIGHTS datagrams

Just need to make sure that AF_UNIX garbage collector won't
confuse O_PATHed socket on filesystem for real AF_UNIX opened
socket.

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
Al Viro 2011-03-13 17:08:22 -04:00
parent 65cfc67223
commit 326be7b484
3 changed files with 4 additions and 2 deletions

View File

@ -305,6 +305,8 @@ struct file *fget_raw(unsigned int fd)
return file; return file;
} }
EXPORT_SYMBOL(fget_raw);
/* /*
* Lightweight file lookup - no refcnt increment if fd table isn't shared. * Lightweight file lookup - no refcnt increment if fd table isn't shared.
* *

View File

@ -95,7 +95,7 @@ static int scm_fp_copy(struct cmsghdr *cmsg, struct scm_fp_list **fplp)
int fd = fdp[i]; int fd = fdp[i];
struct file *file; struct file *file;
if (fd < 0 || !(file = fget(fd))) if (fd < 0 || !(file = fget_raw(fd)))
return -EBADF; return -EBADF;
*fpp++ = file; *fpp++ = file;
fpl->count++; fpl->count++;

View File

@ -104,7 +104,7 @@ struct sock *unix_get_socket(struct file *filp)
/* /*
* Socket ? * Socket ?
*/ */
if (S_ISSOCK(inode->i_mode)) { if (S_ISSOCK(inode->i_mode) && !(filp->f_mode & FMODE_PATH)) {
struct socket *sock = SOCKET_I(inode); struct socket *sock = SOCKET_I(inode);
struct sock *s = sock->sk; struct sock *s = sock->sk;