Igor Karpov created LOG4J2-1538:
-----------------------------------

             Summary: dynamic addition of filter may cause NPE
                 Key: LOG4J2-1538
                 URL: https://issues.apache.org/jira/browse/LOG4J2-1538
             Project: Log4j 2
          Issue Type: Bug
          Components: Core
    Affects Versions: 2.6.2
            Reporter: Igor Karpov


In my application, I need to add and remove a filter dynamically.
The problem is, that it occasionally causes NPE because of the subtle bug in 
AppenderControl.isFilteredByAppenderControl:

@PerformanceSensitive
    private boolean isFilteredByAppenderControl(LogEvent event) {
        return this.getFilter() != null && Result.DENY == 
this.getFilter().filter(event);
    }

here, this.getFilter() is called twice.
getFilter() is defined in superclass, AbstractFilterable:

private volatile Filter filter;

so, it's volatile, and in my case, when I dynamically remove the filter it 
becomes null, and in certain cases it happens right between the two calls to 
getFilter().
The first call to getFilter() returns non-null, so the secand call is 
performed, which returns null and it causes NPE.

The easy fix for this is not to call getFilter() twice:

@PerformanceSensitive
    private boolean isFilteredByAppenderControl(LogEvent event) {
        Filter filter = this.getFilter(); // do not inline, filter is volatile
        return filter != null && Result.DENY == filter.filter(event);
    }




--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to