summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMilian Wolff <mail@milianw.de>2014-02-06 17:30:55 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-02-06 20:17:10 +0100
commit6e7f54a014c43dcd6e32e8288415808623e306f4 (patch)
tree660a396149c93da25299ceb2e52d10f420e22d64
parent95655e87913556e69bdda4a9b3140da4602031e4 (diff)
downloadqtwebsockets-6e7f54a014c43dcd6e32e8288415808623e306f4.tar.gz
Do not access QObject API before its private data is initialized.
Inside the ctor of the private data, the QObject has not yet been associated with the data. Thus, accessing it indirectly i.e. to setup private signal/slot connections, will trigger crashes. Now we delay accessing this API and call an init() function manually in the parent QObject-inheriting class. Change-Id: I2c3ce7335c54d42af6bce87de867ee0ef197efc6 Reviewed-by: Kurt Pattyn <pattyn.kurt@gmail.com>
-rw-r--r--src/websockets/qwebsocket.cpp4
-rw-r--r--src/websockets/qwebsocket_p.cpp7
-rw-r--r--src/websockets/qwebsocketserver.cpp2
-rw-r--r--src/websockets/qwebsocketserver_p.cpp7
-rw-r--r--src/websockets/qwebsocketserver_p.h1
5 files changed, 18 insertions, 3 deletions
diff --git a/src/websockets/qwebsocket.cpp b/src/websockets/qwebsocket.cpp
index 45394e3..6e60230 100644
--- a/src/websockets/qwebsocket.cpp
+++ b/src/websockets/qwebsocket.cpp
@@ -262,6 +262,8 @@ QWebSocket::QWebSocket(const QString &origin,
QObject *parent) :
QObject(*(new QWebSocketPrivate(origin, version, this)), parent)
{
+ Q_D(QWebSocket);
+ d->init();
}
/*!
@@ -301,6 +303,8 @@ QWebSocket::QWebSocket(QTcpSocket *pTcpSocket,
QWebSocketProtocol::Version version, QObject *parent) :
QObject(*(new QWebSocketPrivate(pTcpSocket, version, this)), parent)
{
+ Q_D(QWebSocket);
+ d->init();
}
/*!
diff --git a/src/websockets/qwebsocket_p.cpp b/src/websockets/qwebsocket_p.cpp
index fe4dd8a..5d58fec 100644
--- a/src/websockets/qwebsocket_p.cpp
+++ b/src/websockets/qwebsocket_p.cpp
@@ -111,7 +111,6 @@ QWebSocketPrivate::QWebSocketPrivate(const QString &origin, QWebSocketProtocol::
m_dataProcessor(),
m_configuration()
{
- init();
}
/*!
@@ -142,8 +141,6 @@ QWebSocketPrivate::QWebSocketPrivate(QTcpSocket *pTcpSocket, QWebSocketProtocol:
m_dataProcessor(),
m_configuration()
{
- init();
- makeConnections(m_pSocket.data());
}
/*!
@@ -154,6 +151,10 @@ void QWebSocketPrivate::init()
Q_ASSERT(q_ptr);
//TODO: need a better randomizer
qsrand(static_cast<uint>(QDateTime::currentMSecsSinceEpoch()));
+
+ if (m_pSocket) {
+ makeConnections(m_pSocket.data());
+ }
}
/*!
diff --git a/src/websockets/qwebsocketserver.cpp b/src/websockets/qwebsocketserver.cpp
index 10ee83e..a8a25be 100644
--- a/src/websockets/qwebsocketserver.cpp
+++ b/src/websockets/qwebsocketserver.cpp
@@ -236,6 +236,8 @@ QWebSocketServer::QWebSocketServer(const QString &serverName, SslMode secureMode
#ifdef QT_NO_SSL
Q_UNUSED(secureMode)
#endif
+ Q_D(QWebSocketServer);
+ d->init();
}
/*!
diff --git a/src/websockets/qwebsocketserver_p.cpp b/src/websockets/qwebsocketserver_p.cpp
index 912c66e..6797cbc 100644
--- a/src/websockets/qwebsocketserver_p.cpp
+++ b/src/websockets/qwebsocketserver_p.cpp
@@ -73,6 +73,13 @@ QWebSocketServerPrivate::QWebSocketServerPrivate(const QString &serverName,
m_errorString()
{
Q_ASSERT(pWebSocketServer);
+}
+
+/*!
+ \internal
+ */
+void QWebSocketServerPrivate::init()
+{
if (m_secureMode == NonSecureMode) {
m_pTcpServer = new QTcpServer();
if (Q_LIKELY(m_pTcpServer))
diff --git a/src/websockets/qwebsocketserver_p.h b/src/websockets/qwebsocketserver_p.h
index a9aa880..c4afd3d 100644
--- a/src/websockets/qwebsocketserver_p.h
+++ b/src/websockets/qwebsocketserver_p.h
@@ -85,6 +85,7 @@ public:
QWebSocketServer * const pWebSocketServer);
virtual ~QWebSocketServerPrivate();
+ void init();
void close();
QString errorString() const;
bool hasPendingConnections() const;