Pedro Teixeira created JCR-3882: ----------------------------------- Summary: GlobalPattern's equals() implementation throws NullPointerException Key: JCR-3882 URL: https://issues.apache.org/jira/browse/JCR-3882 Project: Jackrabbit Content Repository Issue Type: Bug Components: jackrabbit-core Affects Versions: 2.10 Reporter: Pedro Teixeira Priority: Critical
Current GlobalPattern's equals() implementation is throwing NPE under specific circumstances: https://github.com/apache/jackrabbit/blob/2.10.0/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/security/authorization/GlobPattern.java#L160-L161 Looks like the *intended* predicate logic was something on the lines of "return X && Y" , where Y is a ternary IF clause: "return X && ( outcome of Y predicate ) This is not the *actual* case; current implementation, *because is lacking parenthesis around the second predicate*, causes a behaviour of "return ( X && Y ) ? outcome1 : outcome2"; Under a scenario of: nodePath = "mycompany/tenant0" other.nodePath = "mycompany" restriction = null; other.restriction = null; then {code:java} nodePath.equals(other.nodePath) && (restriction == null) ? (...) {code} is false, and the return value is the outcome of the ternary IF's else clause {code:java} (...) ? other.restriction == null : restriction.equals(other.restriction) {code} is the outcome of {code:java} restriction.equals(other.restriction) {code} when restriction is null, an NPE gets thrown \\ \\ \\ *Possible solution* wrapping the second statement in parenthesis would fix the behaviour {code:java} return nodePath.equals(other.nodePath) && ( (restriction == null) ? other.restriction == null : restriction.equals(other.restriction) ); {code} -- This message was sent by Atlassian JIRA (v6.3.4#6332)