summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLorn Potter <lorn.potter@gmail.com>2022-12-16 19:03:32 +1000
committerLorn Potter <lorn.potter@gmail.com>2022-12-28 11:48:08 +1000
commitc321349f285913dd32718e74ad48c5972f6d1f87 (patch)
tree665e79b64b1abe39897d3917712dff64235c9136
parentd0243c5cd351209155b0e18c80349c6659200a53 (diff)
downloadqtwebsockets-c321349f285913dd32718e74ad48c5972f6d1f87.tar.gz
wasm: fix heap-use-after-free when using deleteLater
QWebSocketPrivate was getting destroyed before the emscripten close callback was getting called, which was then calling back into the already destroyed object. So we set the UnconnectedState before it gets destroyed. Fixes: QTBUG-108996 Pick-to: 6.5 6.4 Change-Id: I8ebbe5a55188a31209a95d2a71eea2faee3465ad Reviewed-by: Morten Johan Sørvig <morten.sorvig@qt.io>
-rw-r--r--src/websockets/qwebsocket_p.cpp4
-rw-r--r--src/websockets/qwebsocket_wasm_p.cpp7
2 files changed, 7 insertions, 4 deletions
diff --git a/src/websockets/qwebsocket_p.cpp b/src/websockets/qwebsocket_p.cpp
index 5ee1b45..dfb06ee 100644
--- a/src/websockets/qwebsocket_p.cpp
+++ b/src/websockets/qwebsocket_p.cpp
@@ -178,6 +178,10 @@ void QWebSocketPrivate::init()
*/
QWebSocketPrivate::~QWebSocketPrivate()
{
+#ifdef Q_OS_WASM
+ if (m_socketContext)
+ emscripten_websocket_delete(m_socketContext);
+#endif
}
/*!
diff --git a/src/websockets/qwebsocket_wasm_p.cpp b/src/websockets/qwebsocket_wasm_p.cpp
index 4255203..31ea6a5 100644
--- a/src/websockets/qwebsocket_wasm_p.cpp
+++ b/src/websockets/qwebsocket_wasm_p.cpp
@@ -111,14 +111,14 @@ void QWebSocketPrivate::close(QWebSocketProtocol::CloseCode closeCode, QString r
Q_EMIT q->aboutToClose();
setSocketState(QAbstractSocket::ClosingState);
-
emscripten_websocket_get_ready_state(m_socketContext, &m_readyState);
if (m_readyState == 1) {
emscripten_websocket_close(m_socketContext, (int)closeCode, reason.toUtf8());
}
+ setSocketState(QAbstractSocket::UnconnectedState);
+ emit q->disconnected();
emscripten_websocket_get_ready_state(m_socketContext, &m_readyState);
-
}
void QWebSocketPrivate::open(const QNetworkRequest &request,
@@ -242,8 +242,7 @@ void QWebSocketPrivate::setSocketClosed(const EmscriptenWebSocketCloseEvent *emC
m_errorString = QStringLiteral("The remote host closed the connection");
emit q->error(error());
}
- setSocketState(QAbstractSocket::UnconnectedState);
- emit q->disconnected();
+
emscripten_websocket_get_ready_state(m_socketContext, &m_readyState);
if (m_readyState == 3) { // closed