[cpp-sp] branch main updated: Sanitize NDC calls out.
Scott Cantor
cantor.2 at osu.edu
Mon Dec 2 17:27:02 UTC 2024
This is an automated email from the git hooks/post-receive script.
scantor pushed a commit to branch main
in repository cpp-sp.
View the commit online:
http://git.shibboleth.net/view/?p=cpp-sp.git;a=commit;h=6481f97a968e475e6b1283a77c493ce50b8fb301
The following commit(s) were added to refs/heads/main by this push:
new 6481f97a Sanitize NDC calls out.
6481f97a is described below
commit 6481f97a968e475e6b1283a77c493ce50b8fb301
Author: Scott Cantor <cantor.2 at osu.edu>
AuthorDate: Mon Dec 2 12:26:58 2024 -0500
Sanitize NDC calls out.
---
apache/mod_shib_24.cpp | 13 ----------
fastcgi/shibauthorizer.cpp | 6 -----
fastcgi/shibresponder.cpp | 7 -----
iis7_shib/IIS7Request.cpp | 25 ------------------
iis7_shib/ShibHttpModule.cpp | 11 --------
shibsp/SPConfig.cpp | 1 -
shibsp/handler/impl/DiscoveryFeed.cpp | 5 ++--
shibsp/impl/StorageServiceSessionCache.cpp | 41 ------------------------------
shibsp/impl/StoredSession.cpp | 9 -------
shibsp/impl/XMLApplication.cpp | 1 -
shibsp/impl/XMLRequestMapper.cpp | 4 ---
shibsp/impl/XMLServiceProvider.cpp | 3 ---
shibsp/remoting/impl/SocketListener.cpp | 17 -------------
shibsp/remoting/impl/UnixListener.cpp | 6 +++--
shibsp/util/DOMPropertySet.cpp | 4 ---
15 files changed, 7 insertions(+), 146 deletions(-)
diff --git a/apache/mod_shib_24.cpp b/apache/mod_shib_24.cpp
index 3934317a..bea85278 100644
--- a/apache/mod_shib_24.cpp
+++ b/apache/mod_shib_24.cpp
@@ -48,7 +48,6 @@
#include <xercesc/util/XMLUniDefs.hpp>
#include <xercesc/util/regx/RegularExpression.hpp>
#include <xmltooling/XMLToolingConfig.h>
-#include <xmltooling/util/NDC.h>
#include <xmltooling/util/ParserPool.h>
#include <xmltooling/util/Threads.h>
#include <xmltooling/util/XMLConstants.h>
@@ -647,10 +646,6 @@ extern "C" int shib_check_user(request_rec* r)
ap_log_rerror(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, 0, r, "shib_check_user entered in pid (%d)", (int)getpid());
- string threadid("[");
- threadid += lexical_cast<string>(getpid()) + "] shib_check_user";
- xmltooling::NDC ndc(threadid.c_str());
-
try {
shib_request_config* rc = (shib_request_config*)ap_get_module_config(r->request_config, &shib_module);
if (!rc || !rc->sta) {
@@ -714,10 +709,6 @@ extern "C" int shib_handler(request_rec* r)
if (((shib_dir_config*)ap_get_module_config(r->per_dir_config, &shib_module))->bOff == 1)
return DECLINED;
- string threadid("[");
- threadid += lexical_cast<string>(getpid()) + "] shib_handler";
- xmltooling::NDC ndc(threadid.c_str());
-
// With 2.x, this handler always runs, though last.
// We check if shib_check_user ran, because it will detect a handler request
// and dispatch it directly.
@@ -777,10 +768,6 @@ extern "C" int shib_auth_checker(request_rec* r)
ap_log_rerror(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, 0, r, "shib_auth_checker entered in pid (%d)", (int)getpid());
- string threadid("[");
- threadid += lexical_cast<string>(getpid()) + "] shib_auth_checker";
- xmltooling::NDC ndc(threadid.c_str());
-
try {
shib_request_config* rc = (shib_request_config*)ap_get_module_config(r->request_config, &shib_module);
if (!rc || !rc->sta) {
diff --git a/fastcgi/shibauthorizer.cpp b/fastcgi/shibauthorizer.cpp
index ba0bbfe4..8d2b3853 100644
--- a/fastcgi/shibauthorizer.cpp
+++ b/fastcgi/shibauthorizer.cpp
@@ -35,7 +35,6 @@
#include <shibsp/ServiceProvider.h>
#include <xmltooling/unicode.h>
#include <xmltooling/XMLToolingConfig.h>
-#include <xmltooling/util/NDC.h>
#include <xmltooling/util/XMLConstants.h>
#include <xmltooling/util/XMLHelper.h>
#include <xercesc/util/XMLUniDefs.hpp>
@@ -259,10 +258,6 @@ public:
return SHIB_RETURN_OK;
}
- const vector<string>& getClientCertificates() const {
- static vector<string> g_NoCerts;
- return g_NoCerts;
- }
};
static void print_ok(const map<string,string>& headers)
@@ -341,7 +336,6 @@ int main(void)
cerr.rdbuf(&cerr_fcgi_streambuf);
try {
- xmltooling::NDC ndc("FastCGI shibauthorizer");
ShibTargetFCGIAuth sta(&request, g_ServerScheme.c_str(), g_ServerName.c_str(), g_ServerPort);
pair<bool,long> res = sta.getServiceProvider().doAuthentication(sta);
diff --git a/fastcgi/shibresponder.cpp b/fastcgi/shibresponder.cpp
index 65e46003..330cd119 100644
--- a/fastcgi/shibresponder.cpp
+++ b/fastcgi/shibresponder.cpp
@@ -35,7 +35,6 @@
#include <shibsp/ServiceProvider.h>
#include <xmltooling/unicode.h>
#include <xmltooling/XMLToolingConfig.h>
-#include <xmltooling/util/NDC.h>
#include <xmltooling/util/XMLConstants.h>
#include <xmltooling/util/XMLHelper.h>
#include <xercesc/util/XMLUniDefs.hpp>
@@ -211,11 +210,6 @@ public:
return SHIB_RETURN_OK;
}
- const vector<string>& getClientCertificates() const {
- static vector<string> g_NoCerts;
- return g_NoCerts;
- }
-
// Not used in the extension.
virtual void clearHeader(const char* rawname, const char* cginame) {
@@ -351,7 +345,6 @@ int main(void)
auto_arrayptr<char> wrapper(content);
try {
- xmltooling::NDC ndc("FastCGI shibresponder");
ShibTargetFCGI stf(&request, content, g_ServerScheme.c_str(), g_ServerName.c_str(), g_ServerPort);
pair<bool,long> res = stf.getServiceProvider().doHandler(stf);
diff --git a/iis7_shib/IIS7Request.cpp b/iis7_shib/IIS7Request.cpp
index 2f10d9cd..ef68c761 100644
--- a/iis7_shib/IIS7Request.cpp
+++ b/iis7_shib/IIS7Request.cpp
@@ -24,7 +24,6 @@
#include <boost/tokenizer.hpp>
#include <xercesc/util/Base64.hpp>
-#include <xmltooling/util/NDC.h>
#include <shibsp/exceptions.h>
@@ -185,30 +184,6 @@ void IIS7Request::setRemoteUser(const char* user)
}
}
-const vector<string>& IIS7Request::getClientCertificates() const
-// TODO test - all the calls are commented out.
-{
- if (m_certs.empty()) {
- HTTP_SSL_CLIENT_CERT_INFO *certInfo = NULL;
- BOOL negotiated;
- HRESULT hr = m_request->GetClientCertificate(&certInfo, &negotiated);
- if (HRESULT_FROM_WIN32(ERROR_NOT_FOUND) == hr) {
- return m_certs;
- }
- else if (FAILED(hr)) {
- throwError("GetClientCertificate", hr);
- }
- if (nullptr == certInfo) {
- return m_certs;
- }
- XMLSize_t outlen;
- XMLByte* serialized = Base64::encode(reinterpret_cast<XMLByte*>(certInfo->pCertEncoded), certInfo->CertEncodedSize, &outlen);
- m_certs.push_back(reinterpret_cast<char*>(serialized));
- XMLString::release((char**)&serialized);
- }
- return m_certs;
-}
-
const char* IIS7Request::getMethod() const
{
return m_request->GetHttpMethod();
diff --git a/iis7_shib/ShibHttpModule.cpp b/iis7_shib/ShibHttpModule.cpp
index dbd8d68b..54646992 100644
--- a/iis7_shib/ShibHttpModule.cpp
+++ b/iis7_shib/ShibHttpModule.cpp
@@ -22,8 +22,6 @@
#include "io/HTTPResponse.h"
-#include <xmltooling/util/NDC.h>
-
#include "ShibHttpModule.hpp"
#include "IIS7Request.hpp"
#include "IIS7_shib.hpp"
@@ -54,10 +52,6 @@ ShibHttpModule::DoHandler(
if (map_i == g_Sites.end())
return RQ_NOTIFICATION_CONTINUE;
- string threadid("[");
- threadid += lexical_cast<string>(_getpid()) + "] iis_shib";
- xmltooling::NDC ndc(threadid.c_str());
-
IIS7Request handler(pHttpContext, pProvider, false, map_i->second);
pair<bool, long> res = handler.getServiceProvider().doHandler(handler);
@@ -80,11 +74,6 @@ ShibHttpModule::DoFilter(
if (map_i == g_Sites.end())
return RQ_NOTIFICATION_CONTINUE;
-
- string threadid("[");
- threadid += lexical_cast<string>(_getpid()) + "] iis_shib";
- xmltooling::NDC ndc(threadid.c_str());
-
IIS7Request filter(pHttpContext, pProvider, true, map_i->second);
pair<bool, long> res = filter.getServiceProvider().doAuthentication(filter, true);
diff --git a/shibsp/SPConfig.cpp b/shibsp/SPConfig.cpp
index 7346d49a..f41732df 100644
--- a/shibsp/SPConfig.cpp
+++ b/shibsp/SPConfig.cpp
@@ -55,7 +55,6 @@
#include <xercesc/util/XMLUniDefs.hpp>
#include <xmltooling/version.h>
#include <xmltooling/XMLToolingConfig.h>
-#include <xmltooling/util/NDC.h>
#include <xmltooling/util/ParserPool.h>
#include <xmltooling/util/PathResolver.h>
#include <xmltooling/util/TemplateEngine.h>
diff --git a/shibsp/handler/impl/DiscoveryFeed.cpp b/shibsp/handler/impl/DiscoveryFeed.cpp
index 7f572764..8d8142c8 100644
--- a/shibsp/handler/impl/DiscoveryFeed.cpp
+++ b/shibsp/handler/impl/DiscoveryFeed.cpp
@@ -25,19 +25,20 @@
*/
#include "internal.h"
+#include "AgentConfig.h"
#include "Application.h"
#include "exceptions.h"
#include "ServiceProvider.h"
#include "SPRequest.h"
#include "handler/AbstractHandler.h"
#include "handler/RemotedHandler.h"
+#include "util/PathResolver.h"
#include <ctime>
#include <fstream>
#include <sstream>
#include <xmltooling/XMLToolingConfig.h>
#include <xmltooling/util/Threads.h>
-#include <xmltooling/util/PathResolver.h>
using namespace shibsp;
using namespace xmltooling;
@@ -113,7 +114,7 @@ DiscoveryFeed::DiscoveryFeed(const DOMElement* e, const char* appId)
prop = getString("dir");
if (prop.first)
m_dir = prop.second;
- XMLToolingConfig::getConfig().getPathResolver()->resolve(m_dir, PathResolver::XMLTOOLING_CACHE_FILE);
+ AgentConfig::getConfig().getPathResolver().resolve(m_dir, PathResolver::SHIBSP_CACHE_FILE);
m_log.info("feed files will be cached in %s", m_dir.c_str());
#ifndef SHIBSP_LITE
m_feedLock.reset(Mutex::create());
diff --git a/shibsp/impl/StorageServiceSessionCache.cpp b/shibsp/impl/StorageServiceSessionCache.cpp
index 8531344e..84680eb8 100644
--- a/shibsp/impl/StorageServiceSessionCache.cpp
+++ b/shibsp/impl/StorageServiceSessionCache.cpp
@@ -294,9 +294,6 @@ bool SSCache::compareAddresses(const char* client_addr, const char* session_addr
void SSCache::insert(const char* key, time_t expires, const char* name, const char* index, short attempts)
{
-#ifdef _DEBUG
- xmltooling::NDC ndc("insert");
-#endif
if (attempts > 10) {
throw IOException("Exceeded retry limit.");
}
@@ -374,9 +371,6 @@ void SSCache::insert(
const vector<Attribute*>* attributes
)
{
-#ifdef _DEBUG
- xmltooling::NDC ndc("insert");
-#endif
if (!m_storage)
throw ConfigurationException("SessionCache insertion requires a StorageService.");
@@ -552,10 +546,6 @@ void SSCache::persist(
HTTPResponse::samesite_t sameSitePolicy
) const
{
-#ifdef _DEBUG
- xmltooling::NDC ndc("persist");
-#endif
-
m_log.debug("checking if session (%s) should be persisted to cookie", session.name());
// We don't save assertions...
@@ -632,10 +622,6 @@ vector<string>::size_type SSCache::_logout(
short attempts
)
{
-#ifdef _DEBUG
- xmltooling::NDC ndc("logout");
-#endif
-
if (!m_storage)
throw ConfigurationException("SessionCache logout requires a StorageService.");
else if (attempts > 10)
@@ -853,9 +839,6 @@ HTTPResponse::samesite_t SSCache::getSameSitePolicy(const Application& app) cons
Session* SSCache::_find(const Application& app, const char* key, const char* recovery, const char* client_addr, time_t* timeout)
{
-#ifdef _DEBUG
- xmltooling::NDC ndc("find");
-#endif
StoredSession* session=nullptr;
if (inproc) {
@@ -1023,9 +1006,6 @@ Session* SSCache::_find(const Application& app, const char* key, const char* rec
Session* SSCache::find(const Application& app, HTTPRequest& request, const char* client_addr, time_t* timeout)
{
-#ifdef _DEBUG
- xmltooling::NDC ndc("find");
-#endif
string id = active(app, request);
if (id.empty())
return nullptr;
@@ -1061,10 +1041,6 @@ Session* SSCache::find(const Application& app, HTTPRequest& request, const char*
bool SSCache::recover(const Application& app, const char* key, const char* data)
{
-#ifdef _DEBUG
- xmltooling::NDC ndc("recover");
-#endif
-
if (!SPConfig::getConfig().isEnabled(SPConfig::OutOfProcess)) {
m_log.debug("remoting recovery of session from sealed cookie");
// Remote the request.
@@ -1188,9 +1164,6 @@ bool SSCache::recover(const Application& app, const char* key, const char* data)
void SSCache::remove(const Application& app, const HTTPRequest& request, HTTPResponse* response, time_t revocationExp)
{
-#ifdef _DEBUG
- xmltooling::NDC ndc("remove");
-#endif
string session_id;
string shib_cookie = app.getCookieName("_shibsession_");
@@ -1216,9 +1189,6 @@ void SSCache::remove(const Application& app, const HTTPRequest& request, HTTPRes
void SSCache::remove(const Application& app, const char* key, time_t revocationExp)
{
-#ifdef _DEBUG
- xmltooling::NDC ndc("remove");
-#endif
// Take care of local copy.
if (inproc)
dormant(key);
@@ -1265,10 +1235,6 @@ void SSCache::remove(const Application& app, const char* key, time_t revocationE
void SSCache::dormant(const char* key)
{
-#ifdef _DEBUG
- xmltooling::NDC ndc("dormant");
-#endif
-
m_log.debug("deleting local copy of session (%s)", key);
// lock the cache for writing, which means we know nobody is sitting in find()
@@ -1297,10 +1263,6 @@ void SSCache::dormant(const char* key)
void* SSCache::cleanup_fn(void* p)
{
-#ifdef _DEBUG
- xmltooling::NDC ndc("cleanup");
-#endif
-
SSCache* pcache = reinterpret_cast<SSCache*>(p);
#ifndef WIN32
@@ -1381,9 +1343,6 @@ void* SSCache::cleanup_fn(void* p)
void SSCache::receive(DDF& in, ostream& out)
{
-#ifdef _DEBUG
- xmltooling::NDC ndc("receive");
-#endif
const Application* app = SPConfig::getConfig().getServiceProvider()->getApplication(in["application_id"].string());
if (!app)
throw ListenerException("Application not found, check configuration?");
diff --git a/shibsp/impl/StoredSession.cpp b/shibsp/impl/StoredSession.cpp
index 490cdf7d..828f0513 100644
--- a/shibsp/impl/StoredSession.cpp
+++ b/shibsp/impl/StoredSession.cpp
@@ -31,7 +31,6 @@
#include "impl/StoredSession.h"
#include "impl/StorageServiceSessionCache.h"
-#include <xmltooling/util/NDC.h>
#include <xmltooling/util/Threads.h>
#include <xercesc/util/XMLDateTime.hpp>
@@ -366,10 +365,6 @@ void StoredSession::validate(const Application& app, const char* client_addr, ti
void StoredSession::addAttributes(const vector<Attribute*>& attributes)
{
-#ifdef _DEBUG
- xmltooling::NDC ndc("addAttributes");
-#endif
-
if (!m_cache->m_storage)
throw ConfigurationException("Session modification requires a StorageService.");
@@ -481,10 +476,6 @@ const Assertion* StoredSession::getAssertion(const char* id) const
void StoredSession::addAssertion(Assertion* assertion)
{
-#ifdef _DEBUG
- xmltooling::NDC ndc("addAssertion");
-#endif
-
if (!m_cache->m_storage)
throw ConfigurationException("Session modification requires a StorageService.");
else if (!assertion)
diff --git a/shibsp/impl/XMLApplication.cpp b/shibsp/impl/XMLApplication.cpp
index 57527e33..bd0ffc50 100644
--- a/shibsp/impl/XMLApplication.cpp
+++ b/shibsp/impl/XMLApplication.cpp
@@ -38,7 +38,6 @@
#include <boost/algorithm/string.hpp>
#include <xercesc/util/XMLStringTokenizer.hpp>
#include <xmltooling/XMLToolingConfig.h>
-#include <xmltooling/util/NDC.h>
#include <xmltooling/util/XMLConstants.h>
#include <xmltooling/util/XMLHelper.h>
diff --git a/shibsp/impl/XMLRequestMapper.cpp b/shibsp/impl/XMLRequestMapper.cpp
index a5d8a949..b12d8a30 100644
--- a/shibsp/impl/XMLRequestMapper.cpp
+++ b/shibsp/impl/XMLRequestMapper.cpp
@@ -38,7 +38,6 @@
#include <boost/tokenizer.hpp>
#include <boost/tuple/tuple.hpp>
#include <boost/algorithm/string.hpp>
-#include <xmltooling/util/NDC.h>
#include <xmltooling/util/ReloadableXMLFile.h>
#include <xmltooling/util/Threads.h>
#include <xmltooling/util/XMLHelper.h>
@@ -500,9 +499,6 @@ const Override* Override::locate(const HTTPRequest& request) const
XMLRequestMapperImpl::XMLRequestMapperImpl(const DOMElement* e, Category& log) : m_document(nullptr)
{
-#ifdef _DEBUG
- xmltooling::NDC ndc("XMLRequestMapperImpl");
-#endif
static const XMLCh _RequestMap[] = UNICODE_LITERAL_10(R,e,q,u,e,s,t,M,a,p);
if (e && !XMLHelper::isNodeNamed(e, shibspconstants::SHIB2SPCONFIG_NS, _RequestMap)
diff --git a/shibsp/impl/XMLServiceProvider.cpp b/shibsp/impl/XMLServiceProvider.cpp
index 87438f5f..788b5db6 100644
--- a/shibsp/impl/XMLServiceProvider.cpp
+++ b/shibsp/impl/XMLServiceProvider.cpp
@@ -202,9 +202,6 @@ void XMLConfigImpl::doCaching(const DOMElement* e, XMLConfig* conf, Category& lo
XMLConfigImpl::XMLConfigImpl(const DOMElement* e, bool first, XMLConfig* outer, Category& log)
: m_document(nullptr), m_defaultApplication(nullptr), m_deprecationSupport(false)
{
-#ifdef _DEBUG
- xmltooling::NDC ndc("XMLConfigImpl");
-#endif
const SPConfig& conf=SPConfig::getConfig();
XMLToolingConfig& xmlConf=XMLToolingConfig::getConfig();
const DOMElement* SHAR=XMLHelper::getFirstChildElement(e, OutOfProcess);
diff --git a/shibsp/remoting/impl/SocketListener.cpp b/shibsp/remoting/impl/SocketListener.cpp
index ae45732d..8614637c 100644
--- a/shibsp/remoting/impl/SocketListener.cpp
+++ b/shibsp/remoting/impl/SocketListener.cpp
@@ -41,7 +41,6 @@
#include <xercesc/util/XMLUniDefs.hpp>
#include <xercesc/util/OutOfMemoryException.hpp>
-#include <xmltooling/util/NDC.h>
#include <xmltooling/util/XMLHelper.h>
#ifndef WIN32
@@ -99,9 +98,6 @@ namespace shibsp {
SocketListener::ShibSocket SocketPool::connect()
{
-#ifdef _DEBUG
- NDC ndc("connect");
-#endif
m_log.debug("trying to connect to listener");
@@ -199,9 +195,6 @@ SocketListener::~SocketListener()
bool SocketListener::init(bool force)
{
-#ifdef _DEBUG
- NDC ndc("init");
-#endif
log->info("listener service starting");
ServiceProvider* sp = SPConfig::getConfig().getServiceProvider();
@@ -238,9 +231,6 @@ void SocketListener::set_retry_errors(const string& retry_errors)
bool SocketListener::run(bool* shutdown)
{
-#ifdef _DEBUG
- NDC ndc("run");
-#endif
// Save flag to monitor for shutdown request.
m_shutdown = shutdown;
unsigned long count = 0;
@@ -310,10 +300,6 @@ void SocketListener::term()
DDF SocketListener::send(const DDF& in)
{
-#ifdef _DEBUG
- NDC ndc("send");
-#endif
-
log->debug("sending message (%s)", in.name() ? in.name() : "unnamed");
// Serialize data for transmission.
@@ -523,8 +509,6 @@ ServerThread::~ServerThread()
void ServerThread::run()
{
- NDC ndc(m_id);
-
// Before starting up, make sure we fully "own" this socket.
m_listener->m_child_lock->lock();
while (m_listener->m_children.find(m_sock) != m_listener->m_children.end())
@@ -615,7 +599,6 @@ int ServerThread::job()
const char* aid = in["application_id"].string();
if (aid)
appid = string("[") + aid + "]";
- NDC ndc(appid);
log.debug("dispatching message (%s)", in.name() ? in.name() : "unnamed");
diff --git a/shibsp/remoting/impl/UnixListener.cpp b/shibsp/remoting/impl/UnixListener.cpp
index 6a0a80e5..5238f0cc 100644
--- a/shibsp/remoting/impl/UnixListener.cpp
+++ b/shibsp/remoting/impl/UnixListener.cpp
@@ -25,12 +25,14 @@
*/
#include "internal.h"
+
+#include "AgentConfig.h"
#include "remoting/impl/SocketListener.h"
+#include "util/PathResolver.h"
#include <xercesc/util/XMLUniDefs.hpp>
#include <xmltooling/XMLToolingConfig.h>
#include <xmltooling/unicode.h>
-#include <xmltooling/util/PathResolver.h>
#include <xmltooling/util/XMLHelper.h>
#ifdef HAVE_UNISTD_H
@@ -105,7 +107,7 @@ UnixListener::UnixListener(const DOMElement* e) : SocketListener(e), m_bound(fal
log->info("using socket address: %s", m_address.c_str());
- XMLToolingConfig::getConfig().getPathResolver()->resolve(m_address, PathResolver::XMLTOOLING_RUN_FILE);
+ AgentConfig::getConfig().getPathResolver().resolve(m_address, PathResolver::SHIBSP_RUN_FILE);
}
#ifndef UNIX_PATH_MAX
diff --git a/shibsp/util/DOMPropertySet.cpp b/shibsp/util/DOMPropertySet.cpp
index 789dbc0a..0c2d01ea 100644
--- a/shibsp/util/DOMPropertySet.cpp
+++ b/shibsp/util/DOMPropertySet.cpp
@@ -31,7 +31,6 @@
#include <algorithm>
#include <boost/lexical_cast.hpp>
#include <boost/algorithm/string.hpp>
-#include <xmltooling/util/NDC.h>
#include <xmltooling/util/XMLConstants.h>
#include <xmltooling/util/XMLHelper.h>
@@ -97,9 +96,6 @@ void DOMPropertySet::load(
const xmltooling::QName* unsetter
)
{
-#ifdef _DEBUG
- NDC ndc("load");
-#endif
if (!e)
return;
m_root=e;
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.
More information about the commits
mailing list