mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-11 07:03:09 -04:00
Merge ec7b2e7b36 ("i2c: i801: unregister tco_pdev in i801_probe() error path") into android11-5.4-lts
Steps on the way to 5.4.258 Change-Id: I62d8abfa7b4b354b8205212c08264431faaeb479 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
commit
74e7ad6a22
17 changed files with 147 additions and 51 deletions
|
|
@ -117,6 +117,7 @@ struct inode_smack {
|
|||
struct task_smack {
|
||||
struct smack_known *smk_task; /* label for access control */
|
||||
struct smack_known *smk_forked; /* label when forked */
|
||||
struct smack_known *smk_transmuted;/* label when transmuted */
|
||||
struct list_head smk_rules; /* per task access rules */
|
||||
struct mutex smk_rules_lock; /* lock for the rules */
|
||||
struct list_head smk_relabel; /* transit allowed labels */
|
||||
|
|
|
|||
|
|
@ -983,8 +983,9 @@ static int smack_inode_init_security(struct inode *inode, struct inode *dir,
|
|||
const struct qstr *qstr, const char **name,
|
||||
void **value, size_t *len)
|
||||
{
|
||||
struct task_smack *tsp = smack_cred(current_cred());
|
||||
struct inode_smack *issp = smack_inode(inode);
|
||||
struct smack_known *skp = smk_of_current();
|
||||
struct smack_known *skp = smk_of_task(tsp);
|
||||
struct smack_known *isp = smk_of_inode(inode);
|
||||
struct smack_known *dsp = smk_of_inode(dir);
|
||||
int may;
|
||||
|
|
@ -993,20 +994,34 @@ static int smack_inode_init_security(struct inode *inode, struct inode *dir,
|
|||
*name = XATTR_SMACK_SUFFIX;
|
||||
|
||||
if (value && len) {
|
||||
rcu_read_lock();
|
||||
may = smk_access_entry(skp->smk_known, dsp->smk_known,
|
||||
&skp->smk_rules);
|
||||
rcu_read_unlock();
|
||||
/*
|
||||
* If equal, transmuting already occurred in
|
||||
* smack_dentry_create_files_as(). No need to check again.
|
||||
*/
|
||||
if (tsp->smk_task != tsp->smk_transmuted) {
|
||||
rcu_read_lock();
|
||||
may = smk_access_entry(skp->smk_known, dsp->smk_known,
|
||||
&skp->smk_rules);
|
||||
rcu_read_unlock();
|
||||
}
|
||||
|
||||
/*
|
||||
* If the access rule allows transmutation and
|
||||
* the directory requests transmutation then
|
||||
* by all means transmute.
|
||||
* In addition to having smk_task equal to smk_transmuted,
|
||||
* if the access rule allows transmutation and the directory
|
||||
* requests transmutation then by all means transmute.
|
||||
* Mark the inode as changed.
|
||||
*/
|
||||
if (may > 0 && ((may & MAY_TRANSMUTE) != 0) &&
|
||||
smk_inode_transmutable(dir)) {
|
||||
isp = dsp;
|
||||
if ((tsp->smk_task == tsp->smk_transmuted) ||
|
||||
(may > 0 && ((may & MAY_TRANSMUTE) != 0) &&
|
||||
smk_inode_transmutable(dir))) {
|
||||
/*
|
||||
* The caller of smack_dentry_create_files_as()
|
||||
* should have overridden the current cred, so the
|
||||
* inode label was already set correctly in
|
||||
* smack_inode_alloc_security().
|
||||
*/
|
||||
if (tsp->smk_task != tsp->smk_transmuted)
|
||||
isp = dsp;
|
||||
issp->smk_flags |= SMK_INODE_CHANGED;
|
||||
}
|
||||
|
||||
|
|
@ -1440,10 +1455,19 @@ static int smack_inode_getsecurity(struct inode *inode,
|
|||
struct super_block *sbp;
|
||||
struct inode *ip = (struct inode *)inode;
|
||||
struct smack_known *isp;
|
||||
struct inode_smack *ispp;
|
||||
size_t label_len;
|
||||
char *label = NULL;
|
||||
|
||||
if (strcmp(name, XATTR_SMACK_SUFFIX) == 0)
|
||||
if (strcmp(name, XATTR_SMACK_SUFFIX) == 0) {
|
||||
isp = smk_of_inode(inode);
|
||||
else {
|
||||
} else if (strcmp(name, XATTR_SMACK_TRANSMUTE) == 0) {
|
||||
ispp = smack_inode(inode);
|
||||
if (ispp->smk_flags & SMK_INODE_TRANSMUTE)
|
||||
label = TRANS_TRUE;
|
||||
else
|
||||
label = "";
|
||||
} else {
|
||||
/*
|
||||
* The rest of the Smack xattrs are only on sockets.
|
||||
*/
|
||||
|
|
@ -1465,13 +1489,18 @@ static int smack_inode_getsecurity(struct inode *inode,
|
|||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
if (!label)
|
||||
label = isp->smk_known;
|
||||
|
||||
label_len = strlen(label);
|
||||
|
||||
if (alloc) {
|
||||
*buffer = kstrdup(isp->smk_known, GFP_KERNEL);
|
||||
*buffer = kstrdup(label, GFP_KERNEL);
|
||||
if (*buffer == NULL)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
return strlen(isp->smk_known);
|
||||
return label_len;
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -4516,7 +4545,7 @@ static int smack_inode_copy_up(struct dentry *dentry, struct cred **new)
|
|||
/*
|
||||
* Get label from overlay inode and set it in create_sid
|
||||
*/
|
||||
isp = smack_inode(d_inode(dentry->d_parent));
|
||||
isp = smack_inode(d_inode(dentry));
|
||||
skp = isp->smk_inode;
|
||||
tsp->smk_task = skp;
|
||||
*new = new_creds;
|
||||
|
|
@ -4567,8 +4596,10 @@ static int smack_dentry_create_files_as(struct dentry *dentry, int mode,
|
|||
* providing access is transmuting use the containing
|
||||
* directory label instead of the process label.
|
||||
*/
|
||||
if (may > 0 && (may & MAY_TRANSMUTE))
|
||||
if (may > 0 && (may & MAY_TRANSMUTE)) {
|
||||
ntsp->smk_task = isp->smk_inode;
|
||||
ntsp->smk_transmuted = ntsp->smk_task;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue