This is an automated email from the ASF dual-hosted git repository.

swebb2066 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/logging-log4cxx.git


The following commit(s) were added to refs/heads/master by this push:
     new fe6667df Prevent undefined behavior during a configuration change 
(#601)
fe6667df is described below

commit fe6667df3600f2e3cc3f658c7edc33b3bf879640
Author: Stephen Webb <[email protected]>
AuthorDate: Sat Mar 7 10:53:03 2026 +1100

    Prevent undefined behavior during a configuration change (#601)
---
 src/main/cpp/appenderskeleton.cpp                  |  8 ++++++++
 src/main/cpp/dbappender.cpp                        |  4 +++-
 src/main/cpp/nteventlogappender.cpp                | 22 +++++++++++++++-------
 src/main/cpp/odbcappender.cpp                      |  2 +-
 src/main/cpp/smtpappender.cpp                      |  2 +-
 src/main/cpp/socketappenderskeleton.cpp            |  2 +-
 src/main/cpp/syslogappender.cpp                    |  2 +-
 src/main/cpp/telnetappender.cpp                    | 10 ++++------
 src/main/cpp/writerappender.cpp                    |  5 +----
 .../log4cxx/private/appenderskeleton_priv.h        |  5 +++++
 src/test/cpp/vectorappender.cpp                    | 11 ++++++-----
 src/test/cpp/vectorappender.h                      |  6 +-----
 12 files changed, 47 insertions(+), 32 deletions(-)

diff --git a/src/main/cpp/appenderskeleton.cpp 
b/src/main/cpp/appenderskeleton.cpp
index 7f63cd0f..ec7c44f7 100644
--- a/src/main/cpp/appenderskeleton.cpp
+++ b/src/main/cpp/appenderskeleton.cpp
@@ -144,6 +144,14 @@ bool 
AppenderSkeleton::AppenderSkeletonPrivate::checkNotClosed()
        return true;
 }
 
+bool AppenderSkeleton::AppenderSkeletonPrivate::setClosed()
+{
+       std::lock_guard<std::recursive_mutex> lock(this->mutex);
+       bool wasOpen = !this->closed;
+       this->closed = true;
+       return wasOpen;
+}
+
 bool AppenderSkeleton::AppenderSkeletonPrivate::checkLayout()
 {
        if (!this->layout)
diff --git a/src/main/cpp/dbappender.cpp b/src/main/cpp/dbappender.cpp
index 1f38e2b1..846c79b3 100644
--- a/src/main/cpp/dbappender.cpp
+++ b/src/main/cpp/dbappender.cpp
@@ -109,7 +109,9 @@ DBAppender::~DBAppender()
     close();
 }
 
-void DBAppender::close(){
+void DBAppender::close()
+{
+    _priv->setClosed();
     if(_priv->m_driver && _priv->m_databaseHandle){
         apr_dbd_close(_priv->m_driver, _priv->m_databaseHandle);
     }
diff --git a/src/main/cpp/nteventlogappender.cpp 
b/src/main/cpp/nteventlogappender.cpp
index 42dbbf2c..e00ff4a4 100644
--- a/src/main/cpp/nteventlogappender.cpp
+++ b/src/main/cpp/nteventlogappender.cpp
@@ -50,6 +50,8 @@ struct NTEventLogAppender::NTEventLogAppenderPrivate : public 
AppenderSkeleton::
        LogString source;
        HANDLE hEventLog;
        SID* pCurrentUserSID;
+
+       void close();
 };
 
 class CCtUserSIDHelper
@@ -133,16 +135,22 @@ NTEventLogAppender::~NTEventLogAppender()
 
 void NTEventLogAppender::close()
 {
-       if (priv->hEventLog != NULL)
+       priv->setClosed();
+       priv->close();
+}
+
+void NTEventLogAppender::NTEventLogAppenderPrivate::close()
+{
+       if (this->hEventLog != NULL)
        {
-               ::DeregisterEventSource(priv->hEventLog);
-               priv->hEventLog = NULL;
+               ::DeregisterEventSource(this->hEventLog);
+               this->hEventLog = NULL;
        }
 
-       if (priv->pCurrentUserSID != NULL)
+       if (this->pCurrentUserSID != NULL)
        {
-               CCtUserSIDHelper::FreeSid((::SID*) priv->pCurrentUserSID);
-               priv->pCurrentUserSID = NULL;
+               CCtUserSIDHelper::FreeSid((::SID*) this->pCurrentUserSID);
+               this->pCurrentUserSID = NULL;
        }
 }
 
@@ -181,7 +189,7 @@ void NTEventLogAppender::activateOptions(Pool&)
                priv->log = LOG4CXX_STR("Application");
        }
 
-       close();
+       priv->close();
 
        // current user security identifier
        CCtUserSIDHelper::GetCurrentUserSID((::SID**) &priv->pCurrentUserSID);
diff --git a/src/main/cpp/odbcappender.cpp b/src/main/cpp/odbcappender.cpp
index b66d18d7..4616b2f8 100644
--- a/src/main/cpp/odbcappender.cpp
+++ b/src/main/cpp/odbcappender.cpp
@@ -392,6 +392,7 @@ void ODBCAppender::close()
                _priv->errorHandler->error(LOG4CXX_STR("Error closing 
connection"),
                        e, ErrorCode::GENERIC_FAILURE);
        }
+       _priv->setClosed();
 
 #if LOG4CXX_HAVE_ODBC
 
@@ -407,7 +408,6 @@ void ODBCAppender::close()
        }
 
 #endif
-       _priv->closed = true;
 }
 
 #if LOG4CXX_HAVE_ODBC
diff --git a/src/main/cpp/smtpappender.cpp b/src/main/cpp/smtpappender.cpp
index 752d25db..fdf3c489 100644
--- a/src/main/cpp/smtpappender.cpp
+++ b/src/main/cpp/smtpappender.cpp
@@ -694,7 +694,7 @@ bool SMTPAppender::checkEntryConditions()
 
 void SMTPAppender::close()
 {
-       _priv->closed = true;
+       _priv->setClosed();
 }
 
 LogString SMTPAppender::getTo() const
diff --git a/src/main/cpp/socketappenderskeleton.cpp 
b/src/main/cpp/socketappenderskeleton.cpp
index a0bdecfa..896c8061 100644
--- a/src/main/cpp/socketappenderskeleton.cpp
+++ b/src/main/cpp/socketappenderskeleton.cpp
@@ -235,7 +235,7 @@ void SocketAppenderSkeleton::retryConnect()
 
 void SocketAppenderSkeleton::SocketAppenderSkeletonPriv::stopMonitor()
 {
-       this->closed = true;
+       this->setClosed();
        if (this->taskName.empty())
                ;
        else if (auto pManager = this->taskManager.lock())
diff --git a/src/main/cpp/syslogappender.cpp b/src/main/cpp/syslogappender.cpp
index aee1ae80..a7d746b4 100644
--- a/src/main/cpp/syslogappender.cpp
+++ b/src/main/cpp/syslogappender.cpp
@@ -69,7 +69,7 @@ SyslogAppender::~SyslogAppender()
 /** Release any resources held by this SyslogAppender.*/
 void SyslogAppender::close()
 {
-       _priv->closed = true;
+       _priv->setClosed();
 
        if (_priv->sw)
        {
diff --git a/src/main/cpp/telnetappender.cpp b/src/main/cpp/telnetappender.cpp
index 0da39124..40506ee0 100644
--- a/src/main/cpp/telnetappender.cpp
+++ b/src/main/cpp/telnetappender.cpp
@@ -82,12 +82,10 @@ struct TelnetAppender::TelnetAppenderPriv : public 
AppenderSkeletonPrivate
 
        void stopAcceptingConnections()
        {
-               {
-                       std::lock_guard<std::recursive_mutex> lock(this->mutex);
-                       if (!this->serverSocket || this->closed)
-                               return;
-                       this->closed = true;
-               }
+               if (!this->setClosed())
+                       return;
+               if (!this->serverSocket)
+                       return;
                // Interrupt accept()
                try
                {
diff --git a/src/main/cpp/writerappender.cpp b/src/main/cpp/writerappender.cpp
index 1be53e87..7830fbd6 100644
--- a/src/main/cpp/writerappender.cpp
+++ b/src/main/cpp/writerappender.cpp
@@ -147,14 +147,11 @@ bool WriterAppender::WriterAppenderPriv::checkWriter()
    */
 void WriterAppender::close()
 {
-       std::lock_guard<std::recursive_mutex> lock(_priv->mutex);
-
-       if (_priv->closed)
+       if (!_priv->setClosed())
        {
                return;
        }
 
-       _priv->closed = true;
        closeWriter();
 }
 
diff --git a/src/main/include/log4cxx/private/appenderskeleton_priv.h 
b/src/main/include/log4cxx/private/appenderskeleton_priv.h
index cba7bec4..6c512b42 100644
--- a/src/main/include/log4cxx/private/appenderskeleton_priv.h
+++ b/src/main/include/log4cxx/private/appenderskeleton_priv.h
@@ -76,6 +76,11 @@ struct AppenderSkeleton::AppenderSkeletonPrivate
 
        bool warnedNoLayout = false;
        bool checkLayout();
+
+       /**
+       @returns true if the appender was not already closed
+       */
+       bool setClosed();
 };
 
 }
diff --git a/src/test/cpp/vectorappender.cpp b/src/test/cpp/vectorappender.cpp
index e01dbad8..aa7999a3 100644
--- a/src/test/cpp/vectorappender.cpp
+++ b/src/test/cpp/vectorappender.cpp
@@ -16,6 +16,7 @@
  */
 
 #include "vectorappender.h"
+#include <log4cxx/private/appenderskeleton_priv.h>
 #include <thread>
 
 using namespace log4cxx;
@@ -30,12 +31,12 @@ void VectorAppender::append(const spi::LoggingEventPtr& 
event, Pool& /*p*/)
        this->vector.push_back(event);
 }
 
-void VectorAppender::close()
+bool VectorAppender::isClosed() const
 {
-       if (m_priv->closed)
-       {
-               return;
-       }
+       return m_priv->closed;
+}
 
+void VectorAppender::close()
+{
        m_priv->closed = true;
 }
diff --git a/src/test/cpp/vectorappender.h b/src/test/cpp/vectorappender.h
index 0d379fd4..25c47814 100644
--- a/src/test/cpp/vectorappender.h
+++ b/src/test/cpp/vectorappender.h
@@ -18,7 +18,6 @@
 #include <log4cxx/appenderskeleton.h>
 #include <vector>
 #include <log4cxx/spi/loggingevent.h>
-#include <log4cxx/private/appenderskeleton_priv.h>
 
 namespace LOG4CXX_NS
 {
@@ -52,10 +51,7 @@ class VectorAppender : public AppenderSkeleton
 
                void close() override;
 
-               bool isClosed() const
-               {
-                       return m_priv->closed;
-               }
+               bool isClosed() const;
 
                bool requiresLayout() const override
                {

Reply via email to