linux-bk/kernel/uid16.c
<<
>>
Prefs
   1/*
   2 *      Wrapper functions for 16bit uid back compatibility. All nicely tied
   3 *      together in the faint hope we can take the out in five years time.
   4 */
   5
   6#include <linux/mm.h>
   7#include <linux/utsname.h>
   8#include <linux/mman.h>
   9#include <linux/smp_lock.h>
  10#include <linux/notifier.h>
  11#include <linux/reboot.h>
  12#include <linux/prctl.h>
  13#include <linux/init.h>
  14#include <linux/highuid.h>
  15#include <linux/security.h>
  16
  17#include <asm/uaccess.h>
  18
  19extern asmlinkage long sys_chown(const char *, uid_t,gid_t);
  20extern asmlinkage long sys_lchown(const char *, uid_t,gid_t);
  21extern asmlinkage long sys_fchown(unsigned int, uid_t,gid_t);
  22extern asmlinkage long sys_setregid(gid_t, gid_t);
  23extern asmlinkage long sys_setgid(gid_t);
  24extern asmlinkage long sys_setreuid(uid_t, uid_t);
  25extern asmlinkage long sys_setuid(uid_t);
  26extern asmlinkage long sys_setresuid(uid_t, uid_t, uid_t);
  27extern asmlinkage long sys_setresgid(gid_t, gid_t, gid_t);
  28extern asmlinkage long sys_setfsuid(uid_t);
  29extern asmlinkage long sys_setfsgid(gid_t);
  30 
  31asmlinkage long sys_chown16(const char * filename, old_uid_t user, old_gid_t group)
  32{
  33        return sys_chown(filename, low2highuid(user), low2highgid(group));
  34}
  35
  36asmlinkage long sys_lchown16(const char * filename, old_uid_t user, old_gid_t group)
  37{
  38        return sys_lchown(filename, low2highuid(user), low2highgid(group));
  39}
  40
  41asmlinkage long sys_fchown16(unsigned int fd, old_uid_t user, old_gid_t group)
  42{
  43        return sys_fchown(fd, low2highuid(user), low2highgid(group));
  44}
  45
  46asmlinkage long sys_setregid16(old_gid_t rgid, old_gid_t egid)
  47{
  48        return sys_setregid(low2highgid(rgid), low2highgid(egid));
  49}
  50
  51asmlinkage long sys_setgid16(old_gid_t gid)
  52{
  53        return sys_setgid((gid_t)gid);
  54}
  55
  56asmlinkage long sys_setreuid16(old_uid_t ruid, old_uid_t euid)
  57{
  58        return sys_setreuid(low2highuid(ruid), low2highuid(euid));
  59}
  60
  61asmlinkage long sys_setuid16(old_uid_t uid)
  62{
  63        return sys_setuid((uid_t)uid);
  64}
  65
  66asmlinkage long sys_setresuid16(old_uid_t ruid, old_uid_t euid, old_uid_t suid)
  67{
  68        return sys_setresuid(low2highuid(ruid), low2highuid(euid),
  69                low2highuid(suid));
  70}
  71
  72asmlinkage long sys_getresuid16(old_uid_t *ruid, old_uid_t *euid, old_uid_t *suid)
  73{
  74        int retval;
  75
  76        if (!(retval = put_user(high2lowuid(current->uid), ruid)) &&
  77            !(retval = put_user(high2lowuid(current->euid), euid)))
  78                retval = put_user(high2lowuid(current->suid), suid);
  79
  80        return retval;
  81}
  82
  83asmlinkage long sys_setresgid16(old_gid_t rgid, old_gid_t egid, old_gid_t sgid)
  84{
  85        return sys_setresgid(low2highgid(rgid), low2highgid(egid),
  86                low2highgid(sgid));
  87}
  88
  89asmlinkage long sys_getresgid16(old_gid_t *rgid, old_gid_t *egid, old_gid_t *sgid)
  90{
  91        int retval;
  92
  93        if (!(retval = put_user(high2lowgid(current->gid), rgid)) &&
  94            !(retval = put_user(high2lowgid(current->egid), egid)))
  95                retval = put_user(high2lowgid(current->sgid), sgid);
  96
  97        return retval;
  98}
  99
 100asmlinkage long sys_setfsuid16(old_uid_t uid)
 101{
 102        return sys_setfsuid((uid_t)uid);
 103}
 104
 105asmlinkage long sys_setfsgid16(old_gid_t gid)
 106{
 107        return sys_setfsgid((gid_t)gid);
 108}
 109
 110asmlinkage long sys_getgroups16(int gidsetsize, old_gid_t *grouplist)
 111{
 112        old_gid_t groups[NGROUPS];
 113        int i,j;
 114
 115        if (gidsetsize < 0)
 116                return -EINVAL;
 117        i = current->ngroups;
 118        if (gidsetsize) {
 119                if (i > gidsetsize)
 120                        return -EINVAL;
 121                for(j=0;j<i;j++)
 122                        groups[j] = current->groups[j];
 123                if (copy_to_user(grouplist, groups, sizeof(old_gid_t)*i))
 124                        return -EFAULT;
 125        }
 126        return i;
 127}
 128
 129asmlinkage long sys_setgroups16(int gidsetsize, old_gid_t *grouplist)
 130{
 131        old_gid_t groups[NGROUPS];
 132        gid_t new_groups[NGROUPS];
 133        int i;
 134
 135        if (!capable(CAP_SETGID))
 136                return -EPERM;
 137        if ((unsigned) gidsetsize > NGROUPS)
 138                return -EINVAL;
 139        if (copy_from_user(groups, grouplist, gidsetsize * sizeof(old_gid_t)))
 140                return -EFAULT;
 141        for (i = 0 ; i < gidsetsize ; i++)
 142                new_groups[i] = (gid_t)groups[i];
 143        i = security_ops->task_setgroups(gidsetsize, new_groups);
 144        if (i)
 145                return i;
 146        memcpy(current->groups, new_groups, gidsetsize * sizeof(gid_t));
 147        current->ngroups = gidsetsize;
 148        return 0;
 149}
 150
 151asmlinkage long sys_getuid16(void)
 152{
 153        return high2lowuid(current->uid);
 154}
 155
 156asmlinkage long sys_geteuid16(void)
 157{
 158        return high2lowuid(current->euid);
 159}
 160
 161asmlinkage long sys_getgid16(void)
 162{
 163        return high2lowgid(current->gid);
 164}
 165
 166asmlinkage long sys_getegid16(void)
 167{
 168        return high2lowgid(current->egid);
 169}
 170
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.