Skip to content

Commit

Permalink
sock: Introduce cred_to_ucred
Browse files Browse the repository at this point in the history
To keep the coming code clear and to allow both the sock
code and the scm code to share the logic introduce a
fuction to translate from struct cred to struct ucred.

Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
Acked-by: Pavel Emelyanov <xemul@openvz.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Eric W. Biederman authored and David S. Miller committed Jun 16, 2010
1 parent 5c1469d commit 3f551f9
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 0 deletions.
5 changes: 5 additions & 0 deletions include/linux/socket.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,9 @@ struct __kernel_sockaddr_storage {
#include <linux/types.h> /* pid_t */
#include <linux/compiler.h> /* __user */

struct pid;
struct cred;

#define __sockaddr_check_size(size) \
BUILD_BUG_ON(((size) > sizeof(struct __kernel_sockaddr_storage)))

Expand Down Expand Up @@ -309,6 +312,8 @@ struct ucred {
#define IPX_TYPE 1

#ifdef __KERNEL__
extern void cred_to_ucred(struct pid *pid, const struct cred *cred, struct ucred *ucred);

extern int memcpy_fromiovec(unsigned char *kdata, struct iovec *iov, int len);
extern int memcpy_fromiovecend(unsigned char *kdata, const struct iovec *iov,
int offset, int len);
Expand Down
14 changes: 14 additions & 0 deletions net/core/sock.c
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,7 @@
#include <linux/tcp.h>
#include <linux/init.h>
#include <linux/highmem.h>
#include <linux/user_namespace.h>

#include <asm/uaccess.h>
#include <asm/system.h>
Expand Down Expand Up @@ -749,6 +750,19 @@ int sock_setsockopt(struct socket *sock, int level, int optname,
EXPORT_SYMBOL(sock_setsockopt);


void cred_to_ucred(struct pid *pid, const struct cred *cred,
struct ucred *ucred)
{
ucred->pid = pid_vnr(pid);
ucred->uid = ucred->gid = -1;
if (cred) {
struct user_namespace *current_ns = current_user_ns();

ucred->uid = user_ns_map_uid(current_ns, cred, cred->euid);
ucred->gid = user_ns_map_gid(current_ns, cred, cred->egid);
}
}

int sock_getsockopt(struct socket *sock, int level, int optname,
char __user *optval, int __user *optlen)
{
Expand Down

0 comments on commit 3f551f9

Please sign in to comment.