diff options
Diffstat (limited to 'kernel/auditfilter.c')
| -rw-r--r-- | kernel/auditfilter.c | 17 | 
1 files changed, 12 insertions, 5 deletions
| diff --git a/kernel/auditfilter.c b/kernel/auditfilter.c index f8277c80d678..a6c3f1abd206 100644 --- a/kernel/auditfilter.c +++ b/kernel/auditfilter.c @@ -235,13 +235,15 @@ static inline struct audit_entry *audit_to_entry_common(struct audit_rule *rule)  	switch(listnr) {  	default:  		goto exit_err; -	case AUDIT_FILTER_USER: -	case AUDIT_FILTER_TYPE:  #ifdef CONFIG_AUDITSYSCALL  	case AUDIT_FILTER_ENTRY: +		if (rule->action == AUDIT_ALWAYS) +			goto exit_err;  	case AUDIT_FILTER_EXIT:  	case AUDIT_FILTER_TASK:  #endif +	case AUDIT_FILTER_USER: +	case AUDIT_FILTER_TYPE:  		;  	}  	if (unlikely(rule->action == AUDIT_POSSIBLE)) { @@ -385,7 +387,7 @@ static struct audit_entry *audit_rule_to_entry(struct audit_rule *rule)  				goto exit_free;  			break;  		case AUDIT_FILETYPE: -			if ((f->val & ~S_IFMT) > S_IFMT) +			if (f->val & ~S_IFMT)  				goto exit_free;  			break;  		case AUDIT_INODE: @@ -459,6 +461,8 @@ static struct audit_entry *audit_data_to_entry(struct audit_rule_data *data,  		case AUDIT_ARG1:  		case AUDIT_ARG2:  		case AUDIT_ARG3: +		case AUDIT_OBJ_UID: +		case AUDIT_OBJ_GID:  			break;  		case AUDIT_ARCH:  			entry->rule.arch_f = f; @@ -522,7 +526,6 @@ static struct audit_entry *audit_data_to_entry(struct audit_rule_data *data,  				goto exit_free;  			break;  		case AUDIT_FILTERKEY: -			err = -EINVAL;  			if (entry->rule.filterkey || f->val > AUDIT_MAX_KEY_LEN)  				goto exit_free;  			str = audit_unpack_string(&bufp, &remain, f->val); @@ -536,7 +539,11 @@ static struct audit_entry *audit_data_to_entry(struct audit_rule_data *data,  				goto exit_free;  			break;  		case AUDIT_FILETYPE: -			if ((f->val & ~S_IFMT) > S_IFMT) +			if (f->val & ~S_IFMT) +				goto exit_free; +			break; +		case AUDIT_FIELD_COMPARE: +			if (f->val > AUDIT_MAX_FIELD_COMPARE)  				goto exit_free;  			break;  		default: | 
