You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by sw...@apache.org on 2024/07/25 23:21:46 UTC
(logging-log4cxx) branch master updated: Prevent undefined behaviour when an appender is deleted without being closed (#400)
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 1a8875ad Prevent undefined behaviour when an appender is deleted without being closed (#400)
1a8875ad is described below
commit 1a8875ad839a37d2fcf31876c0bbfe61181c9f21
Author: Stephen Webb <st...@ieee.org>
AuthorDate: Fri Jul 26 09:21:42 2024 +1000
Prevent undefined behaviour when an appender is deleted without being closed (#400)
---
src/main/cpp/aprserversocket.cpp | 18 +++++++++++-------
src/main/cpp/filewatchdog.cpp | 2 +-
src/main/cpp/telnetappender.cpp | 18 +++++++++---------
.../log4cxx/private/socketappenderskeleton_priv.h | 6 +++---
src/test/cpp/net/telnetappendertestcase.cpp | 1 -
5 files changed, 24 insertions(+), 21 deletions(-)
diff --git a/src/main/cpp/aprserversocket.cpp b/src/main/cpp/aprserversocket.cpp
index 080a6a29..580f757f 100644
--- a/src/main/cpp/aprserversocket.cpp
+++ b/src/main/cpp/aprserversocket.cpp
@@ -81,7 +81,8 @@ APRServerSocket::APRServerSocket(int port) :
}
}
-void APRServerSocket::close(){
+void APRServerSocket::close()
+{
std::lock_guard<std::mutex> lock(_priv->mutex);
if (_priv->socket != 0)
@@ -103,11 +104,14 @@ accepts it
*/
SocketPtr APRServerSocket::accept()
{
- std::lock_guard<std::mutex> lock(_priv->mutex);
-
- if (_priv->socket == 0)
+ apr_socket_t* s;
+ {
+ std::lock_guard<std::mutex> lock(_priv->mutex);
+ s = _priv->socket;
+ }
+ if (s == 0)
{
- throw IOException();
+ throw IOException(LOG4CXX_STR("socket is 0"));
}
apr_pollfd_t poll;
@@ -115,7 +119,7 @@ SocketPtr APRServerSocket::accept()
poll.desc_type = APR_POLL_SOCKET;
poll.reqevents = APR_POLLIN;
poll.rtnevents = 0;
- poll.desc.s = _priv->socket;
+ poll.desc.s = s;
poll.client_data = NULL;
apr_int32_t signaled;
@@ -140,7 +144,7 @@ SocketPtr APRServerSocket::accept()
}
apr_socket_t* newSocket;
- status = apr_socket_accept(&newSocket, _priv->socket, newPool);
+ status = apr_socket_accept(&newSocket, s, newPool);
if (status != APR_SUCCESS)
{
diff --git a/src/main/cpp/filewatchdog.cpp b/src/main/cpp/filewatchdog.cpp
index 351358be..ef9f80cd 100644
--- a/src/main/cpp/filewatchdog.cpp
+++ b/src/main/cpp/filewatchdog.cpp
@@ -41,7 +41,7 @@ struct FileWatchdog::FileWatchdogPrivate{
#if LOG4CXX_EVENTS_AT_EXIT
, atExitRegistryRaii([this]{stopWatcher();})
#endif
- {}
+ { stopWatcher(); }
/**
The name of the file to observe for changes.
*/
diff --git a/src/main/cpp/telnetappender.cpp b/src/main/cpp/telnetappender.cpp
index 09d33def..204aba30 100644
--- a/src/main/cpp/telnetappender.cpp
+++ b/src/main/cpp/telnetappender.cpp
@@ -52,7 +52,7 @@ struct TelnetAppender::TelnetAppenderPriv : public AppenderSkeletonPrivate
#if LOG4CXX_EVENTS_AT_EXIT
, atExitRegistryRaii([this]{stopAcceptingConnections();})
#endif
- {}
+ { stopAcceptingConnections(); }
int port;
ConnectionList connections;
@@ -73,14 +73,14 @@ struct TelnetAppender::TelnetAppenderPriv : public AppenderSkeletonPrivate
if (!this->serverSocket || this->closed)
return;
this->closed = true;
- // Interrupt accept()
- try
- {
- this->serverSocket->close();
- }
- catch (Exception&)
- {
- }
+ }
+ // Interrupt accept()
+ try
+ {
+ this->serverSocket->close();
+ }
+ catch (Exception&)
+ {
}
if (this->sh.joinable())
this->sh.join();
diff --git a/src/main/include/log4cxx/private/socketappenderskeleton_priv.h b/src/main/include/log4cxx/private/socketappenderskeleton_priv.h
index 537a107f..9519db1a 100644
--- a/src/main/include/log4cxx/private/socketappenderskeleton_priv.h
+++ b/src/main/include/log4cxx/private/socketappenderskeleton_priv.h
@@ -42,7 +42,7 @@ struct SocketAppenderSkeleton::SocketAppenderSkeletonPriv : public AppenderSkele
#if LOG4CXX_EVENTS_AT_EXIT
, atExitRegistryRaii([this]{stopMonitor();})
#endif
- {}
+ { stopMonitor(); }
SocketAppenderSkeletonPriv(helpers::InetAddressPtr address, int defaultPort, int reconnectionDelay) :
AppenderSkeletonPrivate(),
@@ -54,7 +54,7 @@ struct SocketAppenderSkeleton::SocketAppenderSkeletonPriv : public AppenderSkele
#if LOG4CXX_EVENTS_AT_EXIT
, atExitRegistryRaii([this]{stopMonitor();})
#endif
- {}
+ { stopMonitor(); }
SocketAppenderSkeletonPriv(const LogString& host, int port, int delay) :
AppenderSkeletonPrivate(),
@@ -66,7 +66,7 @@ struct SocketAppenderSkeleton::SocketAppenderSkeletonPriv : public AppenderSkele
#if LOG4CXX_EVENTS_AT_EXIT
, atExitRegistryRaii([this]{stopMonitor();})
#endif
- {}
+ { stopMonitor(); }
/**
host name
diff --git a/src/test/cpp/net/telnetappendertestcase.cpp b/src/test/cpp/net/telnetappendertestcase.cpp
index 1268c227..b7aebbe5 100644
--- a/src/test/cpp/net/telnetappendertestcase.cpp
+++ b/src/test/cpp/net/telnetappendertestcase.cpp
@@ -118,7 +118,6 @@ class TelnetAppenderTestCase : public AppenderSkeletonTestCase
#endif
LOG4CXX_INFO(root, "Hello, World " << i);
}
- appender->close();
}
};