• Dustin Kirkland's avatar
    [PATCH] Fix audit operators · d9d9ec6e
    Dustin Kirkland authored
    Darrel Goeddel initiated a discussion on IRC regarding the possibility
    of audit_comparator() returning -EINVAL signaling an invalid operator.
    
    It is possible when creating the rule to assure that the operator is one
    of the 6 sane values.  Here's a snip from include/linux/audit.h  Note
    that 0 (nonsense) and 7 (all operators) are not valid values for an
    operator.
    
    ...
    
    /* These are the supported operators.
     *      4  2  1
     *      =  >  <
     *      -------
     *      0  0  0         0       nonsense
     *      0  0  1         1       <
     *      0  1  0         2       >
     *      0  1  1         3       !=
     *      1  0  0         4       =
     *      1  0  1         5       <=
     *      1  1  0         6       >=
     *      1  1  1         7       all operators
     */
    ...
    
    Furthermore, prior to adding these extended operators, flagging the
    AUDIT_NEGATE bit implied !=, and otherwise == was assumed.
    
    The following code forces the operator to be != if the AUDIT_NEGATE bit
    was flipped on.  And if no operator was specified, == is assumed.  The
    only invalid condition is if the AUDIT_NEGATE bit is off and all of the
    AUDIT_EQUAL, AUDIT_LESS_THAN, and AUDIT_GREATER_THAN bits are
    on--clearly a nonsensical operator.
    
    Now that this is handled at rule insertion time, the default -EINVAL
    return of audit_comparator() is eliminated such that the function can
    only return 1 or 0.
    
    If this is acceptable, let's get this applied to the current tree.
    
    :-Dustin
    
    --
    Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
    (cherry picked from 9bf0a8e137040f87d1b563336d4194e38fb2ba1a commit)
    d9d9ec6e
auditfilter.c 15.2 KB