diff options
Diffstat (limited to 'kernel/auditsc.c')
| -rw-r--r-- | kernel/auditsc.c | 12 | 
1 files changed, 10 insertions, 2 deletions
diff --git a/kernel/auditsc.c b/kernel/auditsc.c index 2cd5256dbff7..cf1fa43512c1 100644 --- a/kernel/auditsc.c +++ b/kernel/auditsc.c @@ -446,6 +446,7 @@ static int audit_filter_rules(struct task_struct *tsk,  	const struct cred *cred;  	int i, need_sid = 1;  	u32 sid; +	unsigned int sessionid;  	cred = rcu_dereference_check(tsk->cred, tsk == current || task_creation); @@ -508,6 +509,10 @@ static int audit_filter_rules(struct task_struct *tsk,  		case AUDIT_FSGID:  			result = audit_gid_comparator(cred->fsgid, f->op, f->gid);  			break; +		case AUDIT_SESSIONID: +			sessionid = audit_get_sessionid(current); +			result = audit_comparator(sessionid, f->op, f->val); +			break;  		case AUDIT_PERS:  			result = audit_comparator(tsk->personality, f->op, f->val);  			break; @@ -1000,7 +1005,7 @@ static void audit_log_execve_info(struct audit_context *context,  	long len_rem;  	long len_full;  	long len_buf; -	long len_abuf; +	long len_abuf = 0;  	long len_tmp;  	bool require_data;  	bool encode; @@ -2025,8 +2030,11 @@ int audit_set_loginuid(kuid_t loginuid)  		goto out;  	/* are we setting or clearing? */ -	if (uid_valid(loginuid)) +	if (uid_valid(loginuid)) {  		sessionid = (unsigned int)atomic_inc_return(&session_id); +		if (unlikely(sessionid == (unsigned int)-1)) +			sessionid = (unsigned int)atomic_inc_return(&session_id); +	}  	task->sessionid = sessionid;  	task->loginuid = loginuid;  |