mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-07-07 23:11:27 +00:00
CRED: Differentiate objective and effective subjective credentials on a task
Differentiate the objective and real subjective credentials from the effective subjective credentials on a task by introducing a second credentials pointer into the task_struct. task_struct::real_cred then refers to the objective and apparent real subjective credentials of a task, as perceived by the other tasks in the system. task_struct::cred then refers to the effective subjective credentials of a task, as used by that task when it's actually running. These are not visible to the other tasks in the system. __task_cred(task) then refers to the objective/real credentials of the task in question. current_cred() refers to the effective subjective credentials of the current task. prepare_creds() uses the objective creds as a base and commit_creds() changes both pointers in the task_struct (indeed commit_creds() requires them to be the same). override_creds() and revert_creds() change the subjective creds pointer only, and the former returns the old subjective creds. These are used by NFSD, faccessat() and do_coredump(), and will by used by CacheFiles. In SELinux, current_has_perm() is provided as an alternative to task_has_perm(). This uses the effective subjective context of current, whereas task_has_perm() uses the objective/real context of the subject. Signed-off-by: David Howells <dhowells@redhat.com> Signed-off-by: James Morris <jmorris@namei.org>
This commit is contained in:
parent
98870ab0a5
commit
3b11a1dece
7 changed files with 95 additions and 54 deletions
|
@ -146,8 +146,8 @@ extern struct cred *prepare_exec_creds(void);
|
|||
extern struct cred *prepare_usermodehelper_creds(void);
|
||||
extern int commit_creds(struct cred *);
|
||||
extern void abort_creds(struct cred *);
|
||||
extern const struct cred *override_creds(const struct cred *) __deprecated;
|
||||
extern void revert_creds(const struct cred *) __deprecated;
|
||||
extern const struct cred *override_creds(const struct cred *);
|
||||
extern void revert_creds(const struct cred *);
|
||||
extern void __init cred_init(void);
|
||||
|
||||
/**
|
||||
|
@ -202,32 +202,32 @@ static inline void put_cred(const struct cred *_cred)
|
|||
}
|
||||
|
||||
/**
|
||||
* current_cred - Access the current task's credentials
|
||||
* current_cred - Access the current task's subjective credentials
|
||||
*
|
||||
* Access the credentials of the current task.
|
||||
* Access the subjective credentials of the current task.
|
||||
*/
|
||||
#define current_cred() \
|
||||
(current->cred)
|
||||
|
||||
/**
|
||||
* __task_cred - Access another task's credentials
|
||||
* __task_cred - Access a task's objective credentials
|
||||
* @task: The task to query
|
||||
*
|
||||
* Access the credentials of another task. The caller must hold the
|
||||
* RCU readlock.
|
||||
* Access the objective credentials of a task. The caller must hold the RCU
|
||||
* readlock.
|
||||
*
|
||||
* The caller must make sure task doesn't go away, either by holding a ref on
|
||||
* task or by holding tasklist_lock to prevent it from being unlinked.
|
||||
*/
|
||||
#define __task_cred(task) \
|
||||
((const struct cred *)(rcu_dereference((task)->cred)))
|
||||
((const struct cred *)(rcu_dereference((task)->real_cred)))
|
||||
|
||||
/**
|
||||
* get_task_cred - Get another task's credentials
|
||||
* get_task_cred - Get another task's objective credentials
|
||||
* @task: The task to query
|
||||
*
|
||||
* Get the credentials of a task, pinning them so that they can't go away.
|
||||
* Accessing a task's credentials directly is not permitted.
|
||||
* Get the objective credentials of a task, pinning them so that they can't go
|
||||
* away. Accessing a task's credentials directly is not permitted.
|
||||
*
|
||||
* The caller must make sure task doesn't go away, either by holding a ref on
|
||||
* task or by holding tasklist_lock to prevent it from being unlinked.
|
||||
|
@ -243,10 +243,11 @@ static inline void put_cred(const struct cred *_cred)
|
|||
})
|
||||
|
||||
/**
|
||||
* get_current_cred - Get the current task's credentials
|
||||
* get_current_cred - Get the current task's subjective credentials
|
||||
*
|
||||
* Get the credentials of the current task, pinning them so that they can't go
|
||||
* away. Accessing the current task's credentials directly is not permitted.
|
||||
* Get the subjective credentials of the current task, pinning them so that
|
||||
* they can't go away. Accessing the current task's credentials directly is
|
||||
* not permitted.
|
||||
*/
|
||||
#define get_current_cred() \
|
||||
(get_cred(current_cred()))
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue