Added a helper class SocketRef and use it instead of all ad-hoc similar classes.

Fixed a memory leak in Jabber SSL listeners.


git-svn-id: http://yate.null.ro/svn/yate/trunk@6299 acf43c95-373e-0410-b603-e72c3f656dc1
This commit is contained in:
paulc 2018-02-20 11:58:02 +00:00
parent 65bc140298
commit 1dc8d69a8e
5 changed files with 45 additions and 83 deletions

View File

@ -3881,23 +3881,6 @@ TcpListener::~TcpListener()
__plugin.listener(this,false);
}
// Objects added to socket.ssl message when incoming connection is using SSL
class RefSocket : public RefObject
{
public:
inline RefSocket(Socket** sock)
: m_socket(sock)
{}
virtual void* getObject(const String& name) const {
if (name == YATOM("Socket*"))
return (void*)m_socket;
return RefObject::getObject(name);
}
Socket** m_socket;
private:
RefSocket() {}
};
// Bind and listen
void TcpListener::run()
{
@ -3942,7 +3925,9 @@ void TcpListener::run()
processed = m_engine && m_engine->acceptConn(sock,addr,m_type);
else {
Message m("socket.ssl");
m.userData(new RefSocket(&sock));
SocketRef* s = new SocketRef(sock);
m.userData(s);
TelEngine::destruct(s);
m.addParam("server",String::boolText(true));
m.addParam("context",m_sslContext);
if (Engine::dispatch(m))

View File

@ -161,22 +161,6 @@ static ObjList s_listeners;
class Connection;
class RManagerThread;
class SockRef : public RefObject
{
public:
inline SockRef(Socket** sock)
: m_sock(sock)
{ }
void* getObject(const String& name) const
{
if (name == YATOM("Socket*"))
return m_sock;
return RefObject::getObject(name);
}
private:
Socket** m_sock;
};
class RManagerListener : public RefObject
{
friend class RManagerThread;
@ -409,7 +393,7 @@ Connection* RManagerListener::checkCreate(Socket* sock, const char* addr)
m.addParam("server",String::boolText(true));
m.addParam(secure->name(),*secure);
m.copyParam(m_cfg,"verify");
SockRef* s = new SockRef(&sock);
SocketRef* s = new SocketRef(sock);
m.userData(s);
TelEngine::destruct(s);
if (!(Engine::dispatch(m) && sock)) {

View File

@ -38,7 +38,6 @@ namespace { // anonymous
class Transport;
class TransportWorker;
class TransportThread;
class SockRef;
class MessageReader;
class TReader;
class StreamReader;
@ -78,22 +77,6 @@ private:
Mutex m_threadMutex;
};
class SockRef : public RefObject
{
public:
inline SockRef(Socket** sock)
: m_sock(sock)
{ }
void* getObject(const String& name) const
{
if (name == "Socket*")
return m_sock;
return RefObject::getObject(name);
}
private:
Socket** m_sock;
};
class TransportThread : public Thread
{
friend class TransportWorker;
@ -396,7 +379,7 @@ bool ListenerThread::init(const NamedList& param)
{
Socket* soc = 0;
Message m("socket.sctp");
SockRef* s = new SockRef(&soc);
SocketRef* s = new SocketRef(soc);
m.userData(s);
TelEngine::destruct(s);
if (!(Engine::dispatch(m) && soc)) {
@ -780,7 +763,7 @@ bool Transport::bindSocket()
{
Socket* soc = 0;
Message m("socket.sctp");
SockRef* s = new SockRef(&soc);
SocketRef* s = new SocketRef(soc);
m.userData(s);
TelEngine::destruct(s);
if (!(Engine::dispatch(m) && soc)) {
@ -905,7 +888,7 @@ bool Transport::connectSocket()
case Sctp :
{
Message m("socket.sctp");
SockRef* s = new SockRef(&sock);
SocketRef* s = new SocketRef(sock);
m.userData(s);
TelEngine::destruct(s);
if (!(Engine::dispatch(m) && sock)) {
@ -1088,7 +1071,7 @@ bool Transport::addSocket(Socket* socket,SocketAddr& socketAddress)
Message m("socket.sctp");
m.addParam("handle",String(socket->detach()));
delete socket;
SockRef* s = new SockRef(&sock);
SocketRef* s = new SocketRef(sock);
m.userData(s);
TelEngine::destruct(s);
if (!(Engine::dispatch(m) && sock)) {

View File

@ -1096,32 +1096,6 @@ private:
int m_code;
};
// Proxy class used to transport a data buffer or a socket
// The object doesn't own its data
class RefObjectProxy : public RefObject
{
public:
inline RefObjectProxy()
: m_data(0), m_socket(0)
{}
inline RefObjectProxy(DataBlock* data)
: m_data(data), m_socket(0)
{}
inline RefObjectProxy(Socket** sock)
: m_data(0), m_socket(sock)
{}
virtual void* getObject(const String& name) const {
if (name == YATOM("DataBlock"))
return m_data;
if (name == YATOM("Socket*"))
return (void*)m_socket;
return RefObject::getObject(name);
}
private:
DataBlock* m_data;
Socket** m_socket;
};
class SIPDriver : public Driver
{
public:
@ -9550,7 +9524,7 @@ bool SIPDriver::socketSsl(Socket** sock, bool server, const String& context)
m.addParam("key",s_sslKeyFile,false);
}
if (sock && *sock) {
RefObjectProxy* p = new RefObjectProxy(sock);
SocketRef* p = new SocketRef(sock);
m.userData(p);
TelEngine::destruct(p);
}

View File

@ -7473,6 +7473,42 @@ public:
virtual bool setPayload(u_int32_t payload) = 0;
};
/**
* Helper class for insering a Socket pointer as a RefObject in a Message
* @short RefObject holding a Socket pointer
*/
class YATE_API SocketRef : public RefObject
{
public:
/**
* Constructor from pointer
* @param socket Pointer to the Socket* to hold
*/
inline SocketRef(Socket** socket)
: m_socket(socket)
{ }
/**
* Constructor from reference
* @param socket Reference to the Socket* to hold
*/
inline SocketRef(Socket*& socket)
: m_socket(&socket)
{ }
/**
* Get a pointer to a derived class given that class name
* @param name Name of the class we are asking for
* @return Pointer to the requested class or NULL if this object doesn't implement it
*/
virtual void* getObject(const String& name) const
{ return (name == YATOM("Socket*")) ? m_socket : RefObject::getObject(name); }
private:
SocketRef();
void* m_socket;
};
/**
* This class holds a DNS (resolver) record
* @short A DNS record