auth.c 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. /*
  2. * linux/fs/nfsd/auth.c
  3. *
  4. * Copyright (C) 1995, 1996 Olaf Kirch <okir@monad.swb.de>
  5. */
  6. #include <linux/types.h>
  7. #include <linux/sched.h>
  8. #include <linux/sunrpc/svc.h>
  9. #include <linux/sunrpc/svcauth.h>
  10. #include <linux/nfsd/nfsd.h>
  11. #define CAP_NFSD_MASK (CAP_FS_MASK|CAP_TO_MASK(CAP_SYS_RESOURCE))
  12. int nfsd_setuser(struct svc_rqst *rqstp, struct svc_export *exp)
  13. {
  14. struct svc_cred cred = rqstp->rq_cred;
  15. int i;
  16. int ret;
  17. if (exp->ex_flags & NFSEXP_ALLSQUASH) {
  18. cred.cr_uid = exp->ex_anon_uid;
  19. cred.cr_gid = exp->ex_anon_gid;
  20. cred.cr_group_info = groups_alloc(0);
  21. } else if (exp->ex_flags & NFSEXP_ROOTSQUASH) {
  22. struct group_info *gi;
  23. if (!cred.cr_uid)
  24. cred.cr_uid = exp->ex_anon_uid;
  25. if (!cred.cr_gid)
  26. cred.cr_gid = exp->ex_anon_gid;
  27. gi = groups_alloc(cred.cr_group_info->ngroups);
  28. if (gi)
  29. for (i = 0; i < cred.cr_group_info->ngroups; i++) {
  30. if (!GROUP_AT(cred.cr_group_info, i))
  31. GROUP_AT(gi, i) = exp->ex_anon_gid;
  32. else
  33. GROUP_AT(gi, i) = GROUP_AT(cred.cr_group_info, i);
  34. }
  35. cred.cr_group_info = gi;
  36. } else
  37. get_group_info(cred.cr_group_info);
  38. if (cred.cr_uid != (uid_t) -1)
  39. current->fsuid = cred.cr_uid;
  40. else
  41. current->fsuid = exp->ex_anon_uid;
  42. if (cred.cr_gid != (gid_t) -1)
  43. current->fsgid = cred.cr_gid;
  44. else
  45. current->fsgid = exp->ex_anon_gid;
  46. if (!cred.cr_group_info)
  47. return -ENOMEM;
  48. ret = set_current_groups(cred.cr_group_info);
  49. put_group_info(cred.cr_group_info);
  50. if ((cred.cr_uid)) {
  51. cap_t(current->cap_effective) &= ~CAP_NFSD_MASK;
  52. } else {
  53. cap_t(current->cap_effective) |= (CAP_NFSD_MASK &
  54. current->cap_permitted);
  55. }
  56. return ret;
  57. }