diff options
Diffstat (limited to 'security/smack/smack_lsm.c')
| -rw-r--r-- | security/smack/smack_lsm.c | 51 | 
1 files changed, 10 insertions, 41 deletions
diff --git a/security/smack/smack_lsm.c b/security/smack/smack_lsm.c index 8221514cc99..2874c731678 100644 --- a/security/smack/smack_lsm.c +++ b/security/smack/smack_lsm.c @@ -1691,40 +1691,19 @@ static int smack_task_kill(struct task_struct *p, struct siginfo *info,   * smack_task_wait - Smack access check for waiting   * @p: task to wait for   * - * Returns 0 if current can wait for p, error code otherwise + * Returns 0   */  static int smack_task_wait(struct task_struct *p)  { -	struct smk_audit_info ad; -	char *sp = smk_of_current(); -	char *tsp = smk_of_forked(task_security(p)); -	int rc; - -	/* we don't log here, we can be overriden */ -	rc = smk_access(tsp, sp, MAY_WRITE, NULL); -	if (rc == 0) -		goto out_log; -  	/* -	 * Allow the operation to succeed if either task -	 * has privilege to perform operations that might -	 * account for the smack labels having gotten to -	 * be different in the first place. -	 * -	 * This breaks the strict subject/object access -	 * control ideal, taking the object's privilege -	 * state into account in the decision as well as -	 * the smack value. +	 * Allow the operation to succeed. +	 * Zombies are bad. +	 * In userless environments (e.g. phones) programs +	 * get marked with SMACK64EXEC and even if the parent +	 * and child shouldn't be talking the parent still +	 * may expect to know when the child exits.  	 */ -	if (smack_privileged(CAP_MAC_OVERRIDE) || -	    has_capability(p, CAP_MAC_OVERRIDE)) -		rc = 0; -	/* we log only if we didn't get overriden */ - out_log: -	smk_ad_init(&ad, __func__, LSM_AUDIT_DATA_TASK); -	smk_ad_setfield_u_tsk(&ad, p); -	smack_log(tsp, sp, MAY_WRITE, rc, &ad); -	return rc; +	return 0;  }  /** @@ -2705,9 +2684,7 @@ static int smack_getprocattr(struct task_struct *p, char *name, char **value)  static int smack_setprocattr(struct task_struct *p, char *name,  			     void *value, size_t size)  { -	int rc;  	struct task_smack *tsp; -	struct task_smack *oldtsp;  	struct cred *new;  	char *newsmack; @@ -2737,21 +2714,13 @@ static int smack_setprocattr(struct task_struct *p, char *name,  	if (newsmack == smack_known_web.smk_known)  		return -EPERM; -	oldtsp = p->cred->security;  	new = prepare_creds();  	if (new == NULL)  		return -ENOMEM; -	tsp = new_task_smack(newsmack, oldtsp->smk_forked, GFP_KERNEL); -	if (tsp == NULL) { -		kfree(new); -		return -ENOMEM; -	} -	rc = smk_copy_rules(&tsp->smk_rules, &oldtsp->smk_rules, GFP_KERNEL); -	if (rc != 0) -		return rc; +	tsp = new->security; +	tsp->smk_task = newsmack; -	new->security = tsp;  	commit_creds(new);  	return size;  }  |