diff options
author | Lorn Potter <lorn.potter@gmail.com> | 2022-12-16 19:03:32 +1000 |
---|---|---|
committer | Lorn Potter <lorn.potter@gmail.com> | 2022-12-28 11:48:08 +1000 |
commit | c321349f285913dd32718e74ad48c5972f6d1f87 (patch) | |
tree | 665e79b64b1abe39897d3917712dff64235c9136 | |
parent | d0243c5cd351209155b0e18c80349c6659200a53 (diff) | |
download | qtwebsockets-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.cpp | 4 | ||||
-rw-r--r-- | src/websockets/qwebsocket_wasm_p.cpp | 7 |
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 |