Commit 3f551f9436c05a3b5eccdd6e94733df5bb98d2a5

Authored by Eric W. Biederman
Committed by David S. Miller
1 parent 5c1469de75

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);
... ... @@ -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)