uid16.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:4k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  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. #include <linux/mm.h>
  6. #include <linux/utsname.h>
  7. #include <linux/mman.h>
  8. #include <linux/smp_lock.h>
  9. #include <linux/notifier.h>
  10. #include <linux/reboot.h>
  11. #include <linux/prctl.h>
  12. #include <linux/init.h>
  13. #include <linux/highuid.h>
  14. #include <asm/uaccess.h>
  15. extern asmlinkage long sys_chown(const char *, uid_t,gid_t);
  16. extern asmlinkage long sys_lchown(const char *, uid_t,gid_t);
  17. extern asmlinkage long sys_fchown(unsigned int, uid_t,gid_t);
  18. extern asmlinkage long sys_setregid(gid_t, gid_t);
  19. extern asmlinkage long sys_setgid(gid_t);
  20. extern asmlinkage long sys_setreuid(uid_t, uid_t);
  21. extern asmlinkage long sys_setuid(uid_t);
  22. extern asmlinkage long sys_setresuid(uid_t, uid_t, uid_t);
  23. extern asmlinkage long sys_setresgid(gid_t, gid_t, gid_t);
  24. extern asmlinkage long sys_setfsuid(uid_t);
  25. extern asmlinkage long sys_setfsgid(gid_t);
  26.  
  27. asmlinkage long sys_chown16(const char * filename, old_uid_t user, old_gid_t group)
  28. {
  29. return sys_chown(filename, low2highuid(user), low2highgid(group));
  30. }
  31. asmlinkage long sys_lchown16(const char * filename, old_uid_t user, old_gid_t group)
  32. {
  33. return sys_lchown(filename, low2highuid(user), low2highgid(group));
  34. }
  35. asmlinkage long sys_fchown16(unsigned int fd, old_uid_t user, old_gid_t group)
  36. {
  37. return sys_fchown(fd, low2highuid(user), low2highgid(group));
  38. }
  39. asmlinkage long sys_setregid16(old_gid_t rgid, old_gid_t egid)
  40. {
  41. return sys_setregid(low2highgid(rgid), low2highgid(egid));
  42. }
  43. asmlinkage long sys_setgid16(old_gid_t gid)
  44. {
  45. return sys_setgid((gid_t)gid);
  46. }
  47. asmlinkage long sys_setreuid16(old_uid_t ruid, old_uid_t euid)
  48. {
  49. return sys_setreuid(low2highuid(ruid), low2highuid(euid));
  50. }
  51. asmlinkage long sys_setuid16(old_uid_t uid)
  52. {
  53. return sys_setuid((uid_t)uid);
  54. }
  55. asmlinkage long sys_setresuid16(old_uid_t ruid, old_uid_t euid, old_uid_t suid)
  56. {
  57. return sys_setresuid(low2highuid(ruid), low2highuid(euid),
  58. low2highuid(suid));
  59. }
  60. asmlinkage long sys_getresuid16(old_uid_t *ruid, old_uid_t *euid, old_uid_t *suid)
  61. {
  62. int retval;
  63. if (!(retval = put_user(high2lowuid(current->uid), ruid)) &&
  64.     !(retval = put_user(high2lowuid(current->euid), euid)))
  65. retval = put_user(high2lowuid(current->suid), suid);
  66. return retval;
  67. }
  68. asmlinkage long sys_setresgid16(old_gid_t rgid, old_gid_t egid, old_gid_t sgid)
  69. {
  70. return sys_setresgid(low2highgid(rgid), low2highgid(egid),
  71. low2highgid(sgid));
  72. }
  73. asmlinkage long sys_getresgid16(old_gid_t *rgid, old_gid_t *egid, old_gid_t *sgid)
  74. {
  75. int retval;
  76. if (!(retval = put_user(high2lowgid(current->gid), rgid)) &&
  77.     !(retval = put_user(high2lowgid(current->egid), egid)))
  78. retval = put_user(high2lowgid(current->sgid), sgid);
  79. return retval;
  80. }
  81. asmlinkage long sys_setfsuid16(old_uid_t uid)
  82. {
  83. return sys_setfsuid((uid_t)uid);
  84. }
  85. asmlinkage long sys_setfsgid16(old_gid_t gid)
  86. {
  87. return sys_setfsgid((gid_t)gid);
  88. }
  89. asmlinkage long sys_getgroups16(int gidsetsize, old_gid_t *grouplist)
  90. {
  91. old_gid_t groups[NGROUPS];
  92. int i,j;
  93. if (gidsetsize < 0)
  94. return -EINVAL;
  95. i = current->ngroups;
  96. if (gidsetsize) {
  97. if (i > gidsetsize)
  98. return -EINVAL;
  99. for(j=0;j<i;j++)
  100. groups[j] = current->groups[j];
  101. if (copy_to_user(grouplist, groups, sizeof(old_gid_t)*i))
  102. return -EFAULT;
  103. }
  104. return i;
  105. }
  106. asmlinkage long sys_setgroups16(int gidsetsize, old_gid_t *grouplist)
  107. {
  108. old_gid_t groups[NGROUPS];
  109. int i;
  110. if (!capable(CAP_SETGID))
  111. return -EPERM;
  112. if ((unsigned) gidsetsize > NGROUPS)
  113. return -EINVAL;
  114. if (copy_from_user(groups, grouplist, gidsetsize * sizeof(old_gid_t)))
  115. return -EFAULT;
  116. for (i = 0 ; i < gidsetsize ; i++)
  117. current->groups[i] = (gid_t)groups[i];
  118. current->ngroups = gidsetsize;
  119. return 0;
  120. }
  121. asmlinkage long sys_getuid16(void)
  122. {
  123. return high2lowuid(current->uid);
  124. }
  125. asmlinkage long sys_geteuid16(void)
  126. {
  127. return high2lowuid(current->euid);
  128. }
  129. asmlinkage long sys_getgid16(void)
  130. {
  131. return high2lowgid(current->gid);
  132. }
  133. asmlinkage long sys_getegid16(void)
  134. {
  135. return high2lowgid(current->egid);
  136. }