fix rcu annotations noise in cred.h
task->cred is declared as __rcu, and access to other tasks' ->cred is, indeed, protected. Access to current->cred does not need rcu_dereference() at all, since only the task itself can change its ->cred. sparse, of course, has no way of knowing that... Add force-cast in current_cred(), make current_fsuid() et.al. use it. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
7813b94a54
commit
3295514841
|
@ -265,10 +265,11 @@ static inline void put_cred(const struct cred *_cred)
|
|||
/**
|
||||
* current_cred - Access the current task's subjective credentials
|
||||
*
|
||||
* Access the subjective credentials of the current task.
|
||||
* Access the subjective credentials of the current task. RCU-safe,
|
||||
* since nobody else can modify it.
|
||||
*/
|
||||
#define current_cred() \
|
||||
(current->cred)
|
||||
(*(__force struct cred **)¤t->cred)
|
||||
|
||||
/**
|
||||
* __task_cred - Access a task's objective credentials
|
||||
|
@ -307,7 +308,7 @@ static inline void put_cred(const struct cred *_cred)
|
|||
({ \
|
||||
struct user_struct *__u; \
|
||||
struct cred *__cred; \
|
||||
__cred = (struct cred *) current_cred(); \
|
||||
__cred = current_cred(); \
|
||||
__u = get_uid(__cred->user); \
|
||||
__u; \
|
||||
})
|
||||
|
@ -322,7 +323,7 @@ static inline void put_cred(const struct cred *_cred)
|
|||
({ \
|
||||
struct group_info *__groups; \
|
||||
struct cred *__cred; \
|
||||
__cred = (struct cred *) current_cred(); \
|
||||
__cred = current_cred(); \
|
||||
__groups = get_group_info(__cred->group_info); \
|
||||
__groups; \
|
||||
})
|
||||
|
@ -341,7 +342,7 @@ static inline void put_cred(const struct cred *_cred)
|
|||
|
||||
#define current_cred_xxx(xxx) \
|
||||
({ \
|
||||
current->cred->xxx; \
|
||||
current_cred()->xxx; \
|
||||
})
|
||||
|
||||
#define current_uid() (current_cred_xxx(uid))
|
||||
|
|
Loading…
Reference in a new issue