Commit 3f551f9436c05a3b5eccdd6e94733df5bb98d2a5
Committed by
David S. Miller
1 parent
5c1469de75
Exists in
master
and in
7 other branches
sock: Introduce cred_to_ucred
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>
Showing 2 changed files with 19 additions and 0 deletions Side-by-side Diff
include/linux/socket.h
... | ... | @@ -24,6 +24,9 @@ |
24 | 24 | #include <linux/types.h> /* pid_t */ |
25 | 25 | #include <linux/compiler.h> /* __user */ |
26 | 26 | |
27 | +struct pid; | |
28 | +struct cred; | |
29 | + | |
27 | 30 | #define __sockaddr_check_size(size) \ |
28 | 31 | BUILD_BUG_ON(((size) > sizeof(struct __kernel_sockaddr_storage))) |
29 | 32 | |
... | ... | @@ -309,6 +312,8 @@ |
309 | 312 | #define IPX_TYPE 1 |
310 | 313 | |
311 | 314 | #ifdef __KERNEL__ |
315 | +extern void cred_to_ucred(struct pid *pid, const struct cred *cred, struct ucred *ucred); | |
316 | + | |
312 | 317 | extern int memcpy_fromiovec(unsigned char *kdata, struct iovec *iov, int len); |
313 | 318 | extern int memcpy_fromiovecend(unsigned char *kdata, const struct iovec *iov, |
314 | 319 | int offset, int len); |
net/core/sock.c
... | ... | @@ -110,6 +110,7 @@ |
110 | 110 | #include <linux/tcp.h> |
111 | 111 | #include <linux/init.h> |
112 | 112 | #include <linux/highmem.h> |
113 | +#include <linux/user_namespace.h> | |
113 | 114 | |
114 | 115 | #include <asm/uaccess.h> |
115 | 116 | #include <asm/system.h> |
... | ... | @@ -748,6 +749,19 @@ |
748 | 749 | } |
749 | 750 | EXPORT_SYMBOL(sock_setsockopt); |
750 | 751 | |
752 | + | |
753 | +void cred_to_ucred(struct pid *pid, const struct cred *cred, | |
754 | + struct ucred *ucred) | |
755 | +{ | |
756 | + ucred->pid = pid_vnr(pid); | |
757 | + ucred->uid = ucred->gid = -1; | |
758 | + if (cred) { | |
759 | + struct user_namespace *current_ns = current_user_ns(); | |
760 | + | |
761 | + ucred->uid = user_ns_map_uid(current_ns, cred, cred->euid); | |
762 | + ucred->gid = user_ns_map_gid(current_ns, cred, cred->egid); | |
763 | + } | |
764 | +} | |
751 | 765 | |
752 | 766 | int sock_getsockopt(struct socket *sock, int level, int optname, |
753 | 767 | char __user *optval, int __user *optlen) |