The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/compat/linux32/common/linux32_uid16.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /* $NetBSD: linux32_uid16.c,v 1.1 2008/01/15 22:38:35 njoly Exp $ */
    2 
    3 /*-
    4  * Copyright (c) 2006 Emmanuel Dreyfus, all rights reserved.
    5  * Copyright (c) 2008 Nicolas Joly, all rights reserved.
    6  *
    7  * Redistribution and use in source and binary forms, with or without
    8  * modification, are permitted provided that the following conditions
    9  * are met:
   10  * 1. Redistributions of source code must retain the above copyright
   11  *    notice, this list of conditions and the following disclaimer.
   12  * 2. Redistributions in binary form must reproduce the above copyright
   13  *    notice, this list of conditions and the following disclaimer in the
   14  *    documentation and/or other materials provided with the distribution.
   15  * 3. All advertising materials mentioning features or use of this software
   16  *    must display the following acknowledgement:
   17  *      This product includes software developed by Emmanuel Dreyfus
   18  * 4. The name of the author may not be used to endorse or promote 
   19  *    products derived from this software without specific prior written 
   20  *    permission.
   21  *
   22  * THIS SOFTWARE IS PROVIDED BY THE THE AUTHOR AND CONTRIBUTORS ``AS IS'' 
   23  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 
   24  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
   25  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS 
   26  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
   27  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
   28  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
   29  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
   30  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
   31  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
   32  * POSSIBILITY OF SUCH DAMAGE.
   33  */
   34 
   35 #include <sys/cdefs.h>
   36 __KERNEL_RCSID(0, "$NetBSD: linux32_uid16.c,v 1.1 2008/01/15 22:38:35 njoly Exp $");
   37 
   38 #include <sys/param.h>
   39 #include <sys/proc.h>
   40 #include <sys/kauth.h>
   41 
   42 #include <compat/netbsd32/netbsd32.h>
   43 
   44 #include <compat/linux/common/linux_types.h>
   45 #include <compat/linux/common/linux_signal.h>
   46 #include <compat/linux/linux_syscallargs.h>
   47 
   48 #include <compat/linux32/common/linux32_types.h>
   49 #include <compat/linux32/common/linux32_signal.h>
   50 #include <compat/linux32/common/linux32_machdep.h>
   51 #include <compat/linux32/linux32_syscallargs.h>
   52 
   53 #define LINUX32TOBSD_UID(u) \
   54         (((u) == (linux32_uid16_t)-1) ? -1 : (u))
   55 #define LINUX32TOBSD_GID(g) \
   56         (((g) == (linux32_gid16_t)-1) ? -1 : (g))
   57 
   58 #define BSDTOLINUX32_UID(u) \
   59         (((u) & ~0xffff) ? (linux32_uid16_t)65534 : (linux32_uid16_t)(u))
   60 #define BSDTOLINUX32_GID(g) \
   61         (((g) & ~0xffff) ? (linux32_gid16_t)65534 : (linux32_gid16_t)(g))
   62 
   63 int
   64 linux32_sys_chown16(struct lwp *l, const struct linux32_sys_chown16_args *uap, register_t *retval)
   65 {
   66         /* {
   67                 syscallarg(const netbsd32_charp) path;
   68                 syscallarg(linux32_uid16_t) uid;
   69                 syscallarg(linux32_gid16_t) gid;
   70         } */
   71         struct sys___posix_chown_args ua;
   72 
   73         NETBSD32TOP_UAP(path, const char);
   74         SCARG(&ua, uid) = LINUX32TOBSD_UID(SCARG(uap, uid));
   75         SCARG(&ua, gid) = LINUX32TOBSD_GID(SCARG(uap, gid));
   76 
   77         return sys___posix_chown(l, &ua, retval);
   78 }
   79 
   80 int
   81 linux32_sys_lchown16(struct lwp *l, const struct linux32_sys_lchown16_args *uap, register_t *retval)
   82 {
   83         /* {
   84                 syscallarg(const netbsd32_charp) path;
   85                 syscallarg(linux32_uid16_t) uid;
   86                 syscallarg(linux32_gid16_t) gid;
   87         } */
   88         struct sys___posix_lchown_args ua;
   89 
   90         NETBSD32TOP_UAP(path, const char);
   91         SCARG(&ua, uid) = LINUX32TOBSD_UID(SCARG(uap, uid));
   92         SCARG(&ua, gid) = LINUX32TOBSD_GID(SCARG(uap, gid));
   93 
   94         return sys___posix_lchown(l, &ua, retval);
   95 }
   96 
   97 int
   98 linux32_sys_fchown16(struct lwp *l, const struct linux32_sys_fchown16_args *uap, register_t *retval)
   99 {
  100         /* {
  101                 syscallarg(int) fd;
  102                 syscallarg(linux32_uid16_t) uid;
  103                 syscallarg(linux32_gid16_t) gid;
  104         } */
  105         struct sys___posix_fchown_args ua;
  106 
  107         SCARG(&ua, fd) = SCARG(uap, fd);
  108         SCARG(&ua, uid) = LINUX32TOBSD_UID(SCARG(uap, uid));
  109         SCARG(&ua, gid) = LINUX32TOBSD_GID(SCARG(uap, gid));
  110 
  111         return sys___posix_fchown(l, &ua, retval);
  112 }
  113 
  114 int
  115 linux32_sys_getgroups16(struct lwp *l, const struct linux32_sys_getgroups16_args *uap, register_t *retval)
  116 {
  117         /* {
  118                 syscallarg(int) gidsetsize;
  119                 syscallarg(linux32_gid16p_t) gidset;
  120         } */
  121         struct linux_sys_getgroups16_args ua;
  122 
  123         NETBSD32TO64_UAP(gidsetsize);
  124         NETBSD32TOP_UAP(gidset, linux_gid16_t);
  125         
  126         return linux_sys_getgroups16(l, &ua, retval);
  127 }
  128 
  129 int
  130 linux32_sys_setgroups16(struct lwp *l, const struct linux32_sys_setgroups16_args *uap, register_t *retval)
  131 {
  132         /* {
  133                 syscallarg(int) gidsetsize;
  134                 syscallarg(linux32_gid16p_t) gidset;
  135         } */
  136         struct linux_sys_setgroups16_args ua;
  137 
  138         NETBSD32TO64_UAP(gidsetsize);
  139         NETBSD32TOP_UAP(gidset, linux_gid16_t);
  140         
  141         return linux_sys_setgroups16(l, &ua, retval);
  142 }
  143 
  144 int
  145 linux32_sys_setreuid16(struct lwp *l, const struct linux32_sys_setreuid16_args *uap, register_t *retval)
  146 {
  147         /* {
  148                 syscallarg(linux32_uid16_t) ruid;
  149                 syscallarg(linux32_uid16_t) euid;
  150         } */
  151         struct sys_setreuid_args bsa;
  152 
  153         SCARG(&bsa, ruid) = LINUX32TOBSD_UID(SCARG(uap, ruid));
  154         SCARG(&bsa, euid) = LINUX32TOBSD_UID(SCARG(uap, euid));
  155 
  156         return sys_setreuid(l, &bsa, retval);
  157 }
  158 
  159 int
  160 linux32_sys_setregid16(struct lwp *l, const struct linux32_sys_setregid16_args *uap, register_t *retval)
  161 {
  162         /* {
  163                 syscallarg(linux32_gid16_t) rgid;
  164                 syscallarg(linux32_gid16_t) egid;
  165         } */
  166         struct sys_setregid_args bsa;
  167 
  168         SCARG(&bsa, rgid) = LINUX32TOBSD_GID(SCARG(uap, rgid));
  169         SCARG(&bsa, egid) = LINUX32TOBSD_GID(SCARG(uap, egid));
  170 
  171         return sys_setregid(l, &bsa, retval);
  172 }
  173 
  174 int
  175 linux32_sys_setresuid16(struct lwp *l, const struct linux32_sys_setresuid16_args *uap, register_t *retval)
  176 {
  177         /* {
  178                 syscallarg(linux32_uid16_t) ruid;
  179                 syscallarg(linux32_uid16_t) euid;
  180                 syscallarg(linux32_uid16_t) suid;
  181         } */
  182         struct linux32_sys_setresuid_args lsa;
  183 
  184         SCARG(&lsa, ruid) = LINUX32TOBSD_UID(SCARG(uap, ruid));
  185         SCARG(&lsa, euid) = LINUX32TOBSD_UID(SCARG(uap, euid));
  186         SCARG(&lsa, suid) = LINUX32TOBSD_UID(SCARG(uap, suid));
  187 
  188         return linux32_sys_setresuid(l, &lsa, retval);
  189 }
  190 
  191 int
  192 linux32_sys_setresgid16(struct lwp *l, const struct linux32_sys_setresgid16_args *uap, register_t *retval)
  193 {
  194         /* {
  195                 syscallarg(linux32_gid16_t) rgid;
  196                 syscallarg(linux32_gid16_t) egid;
  197                 syscallarg(linux32_gid16_t) sgid;
  198         } */
  199         struct linux32_sys_setresgid_args lsa;
  200 
  201         SCARG(&lsa, rgid) = LINUX32TOBSD_GID(SCARG(uap, rgid));
  202         SCARG(&lsa, egid) = LINUX32TOBSD_GID(SCARG(uap, egid));
  203         SCARG(&lsa, sgid) = LINUX32TOBSD_GID(SCARG(uap, sgid));
  204 
  205         return linux32_sys_setresgid(l, &lsa, retval);
  206 }
  207 
  208 int
  209 linux32_sys_getresuid16(struct lwp *l, const struct linux32_sys_getresuid16_args *uap, register_t *retval)
  210 {
  211         /* {
  212                 syscallarg(linux32_uid16p_t) ruid;
  213                 syscallarg(linux32_uid16p_t) euid;
  214                 syscallarg(linux32_uid16p_t) suid;
  215         } */
  216         kauth_cred_t pc = l->l_cred;
  217         int error;
  218         uid_t buid;
  219         linux32_uid16_t luid;
  220 
  221         buid = kauth_cred_getuid(pc);
  222         luid = BSDTOLINUX32_UID(buid);
  223         if ((error = copyout(&luid, SCARG_P32(uap, ruid), sizeof(luid))) != 0)
  224                 return error;
  225 
  226         buid = kauth_cred_geteuid(pc);
  227         luid = BSDTOLINUX32_UID(buid);
  228         if ((error = copyout(&luid, SCARG_P32(uap, euid), sizeof(luid))) != 0)
  229                 return error;
  230 
  231         buid = kauth_cred_getsvuid(pc);
  232         luid = BSDTOLINUX32_UID(buid);
  233         return (copyout(&luid, SCARG_P32(uap, suid), sizeof(luid)));
  234 }
  235 
  236 int
  237 linux32_sys_getresgid16(struct lwp *l, const struct linux32_sys_getresgid16_args *uap, register_t *retval)
  238 {
  239         /* {
  240                 syscallarg(linux32_gid16p_t) rgid;
  241                 syscallarg(linux32_gid16p_t) egid;
  242                 syscallarg(linux32_gid16p_t) sgid;
  243         } */
  244         kauth_cred_t pc = l->l_cred;
  245         int error;
  246         gid_t bgid;
  247         linux32_gid16_t lgid;
  248 
  249         bgid = kauth_cred_getgid(pc);
  250         lgid = BSDTOLINUX32_GID(bgid);
  251         if ((error = copyout(&lgid, SCARG_P32(uap, rgid), sizeof(lgid))) != 0)
  252                 return error;
  253 
  254         bgid = kauth_cred_getegid(pc);
  255         lgid = BSDTOLINUX32_GID(bgid);
  256         if ((error = copyout(&lgid, SCARG_P32(uap, egid), sizeof(lgid))) != 0)
  257                 return error;
  258 
  259         bgid = kauth_cred_getsvgid(pc);
  260         lgid = BSDTOLINUX32_GID(bgid);
  261         return (copyout(&lgid, SCARG_P32(uap, sgid), sizeof(lgid)));
  262 }

Cache object: 2e94d17c91baa19e3ac8fcf716b81243


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.