Merge tag 'audit-pr-20190702' of git://git.kernel.org/pub/scm/linux/kernel/git/pcmoor...
[muen/linux.git] / kernel / auditfilter.c
index 9f8e190..b0126e9 100644 (file)
@@ -322,7 +322,7 @@ static u32 audit_to_op(u32 op)
 /* check if an audit field is valid */
 static int audit_field_valid(struct audit_entry *entry, struct audit_field *f)
 {
-       switch(f->type) {
+       switch (f->type) {
        case AUDIT_MSGTYPE:
                if (entry->rule.listnr != AUDIT_FILTER_EXCLUDE &&
                    entry->rule.listnr != AUDIT_FILTER_USER)
@@ -334,7 +334,7 @@ static int audit_field_valid(struct audit_entry *entry, struct audit_field *f)
                break;
        }
 
-       switch(entry->rule.listnr) {
+       switch (entry->rule.listnr) {
        case AUDIT_FILTER_FS:
                switch(f->type) {
                case AUDIT_FSTYPE:
@@ -345,9 +345,16 @@ static int audit_field_valid(struct audit_entry *entry, struct audit_field *f)
                }
        }
 
-       switch(f->type) {
-       default:
-               return -EINVAL;
+       /* Check for valid field type and op */
+       switch (f->type) {
+       case AUDIT_ARG0:
+       case AUDIT_ARG1:
+       case AUDIT_ARG2:
+       case AUDIT_ARG3:
+       case AUDIT_PERS: /* <uapi/linux/personality.h> */
+       case AUDIT_DEVMINOR:
+               /* all ops are valid */
+               break;
        case AUDIT_UID:
        case AUDIT_EUID:
        case AUDIT_SUID:
@@ -360,46 +367,53 @@ static int audit_field_valid(struct audit_entry *entry, struct audit_field *f)
        case AUDIT_FSGID:
        case AUDIT_OBJ_GID:
        case AUDIT_PID:
-       case AUDIT_PERS:
        case AUDIT_MSGTYPE:
        case AUDIT_PPID:
        case AUDIT_DEVMAJOR:
-       case AUDIT_DEVMINOR:
        case AUDIT_EXIT:
        case AUDIT_SUCCESS:
        case AUDIT_INODE:
        case AUDIT_SESSIONID:
+       case AUDIT_SUBJ_SEN:
+       case AUDIT_SUBJ_CLR:
+       case AUDIT_OBJ_LEV_LOW:
+       case AUDIT_OBJ_LEV_HIGH:
+       case AUDIT_SADDR_FAM:
                /* bit ops are only useful on syscall args */
                if (f->op == Audit_bitmask || f->op == Audit_bittest)
                        return -EINVAL;
                break;
-       case AUDIT_ARG0:
-       case AUDIT_ARG1:
-       case AUDIT_ARG2:
-       case AUDIT_ARG3:
        case AUDIT_SUBJ_USER:
        case AUDIT_SUBJ_ROLE:
        case AUDIT_SUBJ_TYPE:
-       case AUDIT_SUBJ_SEN:
-       case AUDIT_SUBJ_CLR:
        case AUDIT_OBJ_USER:
        case AUDIT_OBJ_ROLE:
        case AUDIT_OBJ_TYPE:
-       case AUDIT_OBJ_LEV_LOW:
-       case AUDIT_OBJ_LEV_HIGH:
        case AUDIT_WATCH:
        case AUDIT_DIR:
        case AUDIT_FILTERKEY:
-               break;
        case AUDIT_LOGINUID_SET:
-               if ((f->val != 0) && (f->val != 1))
-                       return -EINVAL;
-       /* FALL THROUGH */
        case AUDIT_ARCH:
        case AUDIT_FSTYPE:
+       case AUDIT_PERM:
+       case AUDIT_FILETYPE:
+       case AUDIT_FIELD_COMPARE:
+       case AUDIT_EXE:
+               /* only equal and not equal valid ops */
                if (f->op != Audit_not_equal && f->op != Audit_equal)
                        return -EINVAL;
                break;
+       default:
+               /* field not recognized */
+               return -EINVAL;
+       }
+
+       /* Check for select valid field values */
+       switch (f->type) {
+       case AUDIT_LOGINUID_SET:
+               if ((f->val != 0) && (f->val != 1))
+                       return -EINVAL;
+               break;
        case AUDIT_PERM:
                if (f->val & ~15)
                        return -EINVAL;
@@ -412,11 +426,14 @@ static int audit_field_valid(struct audit_entry *entry, struct audit_field *f)
                if (f->val > AUDIT_MAX_FIELD_COMPARE)
                        return -EINVAL;
                break;
-       case AUDIT_EXE:
-               if (f->op != Audit_not_equal && f->op != Audit_equal)
+       case AUDIT_SADDR_FAM:
+               if (f->val >= AF_MAX)
                        return -EINVAL;
                break;
+       default:
+               break;
        }
+
        return 0;
 }
 
@@ -1190,7 +1207,6 @@ int audit_comparator(u32 left, u32 op, u32 right)
        case Audit_bittest:
                return ((left & right) == right);
        default:
-               BUG();
                return 0;
        }
 }
@@ -1213,7 +1229,6 @@ int audit_uid_comparator(kuid_t left, u32 op, kuid_t right)
        case Audit_bitmask:
        case Audit_bittest:
        default:
-               BUG();
                return 0;
        }
 }
@@ -1236,7 +1251,6 @@ int audit_gid_comparator(kgid_t left, u32 op, kgid_t right)
        case Audit_bitmask:
        case Audit_bittest:
        default:
-               BUG();
                return 0;
        }
 }