This is an automated email from the ASF dual-hosted git repository. FreeAndNil pushed a commit to branch Feature/AVSS-Fixes in repository https://gitbox.apache.org/repos/asf/logging-log4net.git
commit 9dd998ab6d50e40ce1c01ab6c7fa851006e3a769 Author: Jan Friedrich <[email protected]> AuthorDate: Sun Jun 21 23:18:10 2026 +0200 Fix race condition in AppenderSkeleton filter chain modification Add lock(LockObj) to AddFilter and ClearFilters to synchronize with FilterEvent under concurrent logging (CWE-362). --- ...8-fix-appender-filter-chain-synchronization.xml | 11 ++++++++++ src/log4net/Appender/AppenderSkeleton.cs | 25 +++++++++++++++------- 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/src/changelog/3.3.2/298-fix-appender-filter-chain-synchronization.xml b/src/changelog/3.3.2/298-fix-appender-filter-chain-synchronization.xml new file mode 100644 index 00000000..bcac92b1 --- /dev/null +++ b/src/changelog/3.3.2/298-fix-appender-filter-chain-synchronization.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="UTF-8"?> +<entry xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xmlns="https://logging.apache.org/xml/ns" + xsi:schemaLocation="https://logging.apache.org/xml/ns https://logging.apache.org/xml/ns/log4j-changelog-0.xsd" + type="fixed"> + <issue id="f57d7b3-001" link="https://github.com/apache/tooling-agents/blob/main/ASVS/reports/logging-log4net/f57d7b3/issues.md#issue-finding-001---filter-chain-modification-methods-lack-synchronization-creating-potential-race-with-filterevent-under-active-logging"/> + <issue id="298" link="https://github.com/apache/logging-log4net/pull/298"/> + <description format="asciidoc"> + fix race condition in `AppenderSkeleton.AddFilter` and `ClearFilters` under concurrent logging (CWE-362) + </description> +</entry> diff --git a/src/log4net/Appender/AppenderSkeleton.cs b/src/log4net/Appender/AppenderSkeleton.cs index 5e0052c2..6fb3ab3a 100644 --- a/src/log4net/Appender/AppenderSkeleton.cs +++ b/src/log4net/Appender/AppenderSkeleton.cs @@ -456,14 +456,17 @@ protected virtual bool FilterEvent(LoggingEvent loggingEvent) public virtual void AddFilter(IFilter filter) { filter.EnsureNotNull(); - if (FilterHead is null) - { - FilterHead = _tailFilter = filter; - } - else + lock (LockObj) { - _tailFilter!.Next = filter; - _tailFilter = filter; + if (FilterHead is null) + { + FilterHead = _tailFilter = filter; + } + else + { + _tailFilter!.Next = filter; + _tailFilter = filter; + } } } @@ -475,7 +478,13 @@ public virtual void AddFilter(IFilter filter) /// Clears the filter list for this appender. /// </para> /// </remarks> - public virtual void ClearFilters() => FilterHead = _tailFilter = null; + public virtual void ClearFilters() + { + lock (LockObj) + { + FilterHead = _tailFilter = null; + } + } /// <summary> /// Checks if the message level is below this appender's threshold.
