Commit 1cc6b104 authored by Herbert Pötzl's avatar Herbert Pötzl Committed by David S. Miller

[NET]: Passcred cleanup in struct sock

struct socket uses a 'bool' (unsigned char) to
'flag' the pass-credential option for sockets
(which can be easily replaced by a flag)
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 6fab4b45
...@@ -61,6 +61,7 @@ typedef enum { ...@@ -61,6 +61,7 @@ typedef enum {
#define SOCK_ASYNC_NOSPACE 0 #define SOCK_ASYNC_NOSPACE 0
#define SOCK_ASYNC_WAITDATA 1 #define SOCK_ASYNC_WAITDATA 1
#define SOCK_NOSPACE 2 #define SOCK_NOSPACE 2
#define SOCK_PASSCRED 3
#ifndef ARCH_HAS_SOCKET_TYPES #ifndef ARCH_HAS_SOCKET_TYPES
/** sock_type - Socket types /** sock_type - Socket types
...@@ -111,7 +112,6 @@ struct socket { ...@@ -111,7 +112,6 @@ struct socket {
struct sock *sk; struct sock *sk;
wait_queue_head_t wait; wait_queue_head_t wait;
short type; short type;
unsigned char passcred;
}; };
struct vm_area_struct; struct vm_area_struct;
......
...@@ -51,13 +51,13 @@ static __inline__ void scm_recv(struct socket *sock, struct msghdr *msg, ...@@ -51,13 +51,13 @@ static __inline__ void scm_recv(struct socket *sock, struct msghdr *msg,
{ {
if (!msg->msg_control) if (!msg->msg_control)
{ {
if (sock->passcred || scm->fp) if (test_bit(SOCK_PASSCRED, &sock->flags) || scm->fp)
msg->msg_flags |= MSG_CTRUNC; msg->msg_flags |= MSG_CTRUNC;
scm_destroy(scm); scm_destroy(scm);
return; return;
} }
if (sock->passcred) if (test_bit(SOCK_PASSCRED, &sock->flags))
put_cmsg(msg, SOL_SOCKET, SCM_CREDENTIALS, sizeof(scm->creds), &scm->creds); put_cmsg(msg, SOL_SOCKET, SCM_CREDENTIALS, sizeof(scm->creds), &scm->creds);
if (!scm->fp) if (!scm->fp)
......
...@@ -333,7 +333,10 @@ int sock_setsockopt(struct socket *sock, int level, int optname, ...@@ -333,7 +333,10 @@ int sock_setsockopt(struct socket *sock, int level, int optname,
break; break;
case SO_PASSCRED: case SO_PASSCRED:
sock->passcred = valbool; if (valbool)
set_bit(SOCK_PASSCRED, &sock->flags);
else
clear_bit(SOCK_PASSCRED, &sock->flags);
break; break;
case SO_TIMESTAMP: case SO_TIMESTAMP:
...@@ -557,7 +560,7 @@ int sock_getsockopt(struct socket *sock, int level, int optname, ...@@ -557,7 +560,7 @@ int sock_getsockopt(struct socket *sock, int level, int optname,
break; break;
case SO_PASSCRED: case SO_PASSCRED:
v.val = sock->passcred; v.val = test_bit(SOCK_PASSCRED, &sock->flags) ? 1 : 0;
break; break;
case SO_PEERCRED: case SO_PEERCRED:
......
...@@ -287,7 +287,7 @@ static struct inode *sock_alloc_inode(struct super_block *sb) ...@@ -287,7 +287,7 @@ static struct inode *sock_alloc_inode(struct super_block *sb)
ei->socket.ops = NULL; ei->socket.ops = NULL;
ei->socket.sk = NULL; ei->socket.sk = NULL;
ei->socket.file = NULL; ei->socket.file = NULL;
ei->socket.passcred = 0; ei->socket.flags = 0;
return &ei->vfs_inode; return &ei->vfs_inode;
} }
......
...@@ -861,8 +861,8 @@ static int unix_dgram_connect(struct socket *sock, struct sockaddr *addr, ...@@ -861,8 +861,8 @@ static int unix_dgram_connect(struct socket *sock, struct sockaddr *addr,
goto out; goto out;
alen = err; alen = err;
if (sock->passcred && !unix_sk(sk)->addr && if (test_bit(SOCK_PASSCRED, &sock->flags) &&
(err = unix_autobind(sock)) != 0) !unix_sk(sk)->addr && (err = unix_autobind(sock)) != 0)
goto out; goto out;
other=unix_find_other(sunaddr, alen, sock->type, hash, &err); other=unix_find_other(sunaddr, alen, sock->type, hash, &err);
...@@ -952,7 +952,8 @@ static int unix_stream_connect(struct socket *sock, struct sockaddr *uaddr, ...@@ -952,7 +952,8 @@ static int unix_stream_connect(struct socket *sock, struct sockaddr *uaddr,
goto out; goto out;
addr_len = err; addr_len = err;
if (sock->passcred && !u->addr && (err = unix_autobind(sock)) != 0) if (test_bit(SOCK_PASSCRED, &sock->flags)
&& !u->addr && (err = unix_autobind(sock)) != 0)
goto out; goto out;
timeo = sock_sndtimeo(sk, flags & O_NONBLOCK); timeo = sock_sndtimeo(sk, flags & O_NONBLOCK);
...@@ -1286,7 +1287,8 @@ static int unix_dgram_sendmsg(struct kiocb *kiocb, struct socket *sock, ...@@ -1286,7 +1287,8 @@ static int unix_dgram_sendmsg(struct kiocb *kiocb, struct socket *sock,
goto out; goto out;
} }
if (sock->passcred && !u->addr && (err = unix_autobind(sock)) != 0) if (test_bit(SOCK_PASSCRED, &sock->flags)
&& !u->addr && (err = unix_autobind(sock)) != 0)
goto out; goto out;
err = -EMSGSIZE; err = -EMSGSIZE;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment