X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=libcfs%2Flibcfs%2Flinux%2Flinux-curproc.c;h=385bbefb8cf15ac36c399d3a91d6799a0afbf6bb;hp=eb12dae5463b8e02b7039b65cdef524087fce006;hb=744f5f8e6d8b902953431b0a39542b86c09275b1;hpb=14c1444535f2474268741795fabcec8541741f31 diff --git a/libcfs/libcfs/linux/linux-curproc.c b/libcfs/libcfs/linux/linux-curproc.c index eb12dae..385bbef 100644 --- a/libcfs/libcfs/linux/linux-curproc.c +++ b/libcfs/libcfs/linux/linux-curproc.c @@ -41,6 +41,7 @@ */ #include +#include #define DEBUG_SUBSYSTEM S_LNET @@ -53,22 +54,32 @@ uid_t cfs_curproc_uid(void) { - return current->uid; + return current_uid(); } gid_t cfs_curproc_gid(void) { - return current->gid; + return current_gid(); } uid_t cfs_curproc_fsuid(void) { - return current->fsuid; + return current_fsuid(); +} + +uid_t cfs_curproc_euid(void) +{ + return current_egid(); +} + +uid_t cfs_curproc_egid(void) +{ + return current_egid(); } gid_t cfs_curproc_fsgid(void) { - return current->fsgid; + return current_fsgid(); } pid_t cfs_curproc_pid(void) @@ -82,7 +93,7 @@ int cfs_curproc_groups_nr(void) #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,4) task_lock(current); - nr = current->group_info->ngroups; + nr = current_cred()->group_info->ngroups; task_unlock(current); #else nr = current->ngroups; @@ -94,8 +105,8 @@ void cfs_curproc_groups_dump(gid_t *array, int size) { #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,4) task_lock(current); - size = min_t(int, size, current->group_info->ngroups); - memcpy(array, current->group_info->blocks[0], size * sizeof(__u32)); + size = min_t(int, size, current_cred()->group_info->ngroups); + memcpy(array, current_cred()->group_info->blocks[0], size * sizeof(__u32)); task_unlock(current); #else LASSERT(size <= NGROUPS); @@ -126,39 +137,70 @@ char *cfs_curproc_comm(void) void cfs_cap_raise(cfs_cap_t cap) { - cap_raise(cfs_current()->cap_effective, cfs_cap_unpack(cap)); + struct cred *cred; + if ((cred = prepare_creds())) { + cap_raise(cred->cap_effective, cfs_cap_unpack(cap)); + commit_creds(cred); + } } void cfs_cap_lower(cfs_cap_t cap) { - cap_lower(cfs_current()->cap_effective, cfs_cap_unpack(cap)); + struct cred *cred; + if ((cred = prepare_creds())) { + cap_lower(cred->cap_effective, cfs_cap_unpack(cap)); + commit_creds(cred); + } } int cfs_cap_raised(cfs_cap_t cap) { - return cap_raised(cfs_current()->cap_effective, cfs_cap_unpack(cap)); + return cap_raised(current_cap(), cfs_cap_unpack(cap)); } -cfs_cap_t cfs_curproc_cap_pack(void) { -#if _LINUX_CAPABILITY_VERSION == 0x19980330 - return cfs_cap_pack(current->cap_effective); -#elif _LINUX_CAPABILITY_VERSION == 0x20071026 - return cfs_cap_pack(current->cap_effective[0]); +void cfs_kernel_cap_pack(cfs_kernel_cap_t kcap, cfs_cap_t *cap) +{ +#if defined (_LINUX_CAPABILITY_VERSION) && _LINUX_CAPABILITY_VERSION == 0x19980330 + *cap = cfs_cap_pack(kcap); +#elif defined (_LINUX_CAPABILITY_VERSION) && _LINUX_CAPABILITY_VERSION == 0x20071026 + *cap = cfs_cap_pack(kcap[0]); +#elif defined(_KERNEL_CAPABILITY_VERSION) && _KERNEL_CAPABILITY_VERSION == 0x20080522 + /* XXX lost high byte */ + *cap = cfs_cap_pack(kcap.cap[0]); #else - #error "need correct _LINUX_CAPABILITY_VERSION " + #error "need correct _KERNEL_CAPABILITY_VERSION " #endif } -void cfs_curproc_cap_unpack(cfs_cap_t cap) { -#if _LINUX_CAPABILITY_VERSION == 0x19980330 - current->cap_effective = cfs_cap_unpack(cap); -#elif _LINUX_CAPABILITY_VERSION == 0x20071026 - current->cap_effective[0] = cfs_cap_unpack(cap); +void cfs_kernel_cap_unpack(cfs_kernel_cap_t *kcap, cfs_cap_t cap) +{ +#if defined (_LINUX_CAPABILITY_VERSION) && _LINUX_CAPABILITY_VERSION == 0x19980330 + *kcap = cfs_cap_unpack(cap); +#elif defined (_LINUX_CAPABILITY_VERSION) && _LINUX_CAPABILITY_VERSION == 0x20071026 + (*kcap)[0] = cfs_cap_unpack(cap); +#elif defined(_KERNEL_CAPABILITY_VERSION) && _KERNEL_CAPABILITY_VERSION == 0x20080522 + kcap->cap[0] = cfs_cap_unpack(cap); #else - #error "need correct _LINUX_CAPABILITY_VERSION " + #error "need correct _KERNEL_CAPABILITY_VERSION " #endif } +cfs_cap_t cfs_curproc_cap_pack(void) +{ + cfs_cap_t cap; + cfs_kernel_cap_pack(current_cap(), &cap); + return cap; +} + +void cfs_curproc_cap_unpack(cfs_cap_t cap) +{ + struct cred *cred; + if ((cred = prepare_creds())) { + cfs_kernel_cap_unpack(&cred->cap_effective, cap); + commit_creds(cred); + } +} + int cfs_capable(cfs_cap_t cap) { return capable(cfs_cap_unpack(cap)); @@ -166,7 +208,9 @@ int cfs_capable(cfs_cap_t cap) EXPORT_SYMBOL(cfs_curproc_uid); EXPORT_SYMBOL(cfs_curproc_pid); +EXPORT_SYMBOL(cfs_curproc_euid); EXPORT_SYMBOL(cfs_curproc_gid); +EXPORT_SYMBOL(cfs_curproc_egid); EXPORT_SYMBOL(cfs_curproc_fsuid); EXPORT_SYMBOL(cfs_curproc_fsgid); EXPORT_SYMBOL(cfs_curproc_umask);