From 9a5a31268e1fc1c86796dcf7f9ab757c4a599a49 Mon Sep 17 00:00:00 2001 From: Lorn Potter Date: Wed, 21 Sep 2022 18:39:55 +1000 Subject: [PATCH] wasm: fix crash when network reply is closed MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We do not need to call QNetworkReply::close as that closes the QIODevice that we do not use (or have) Pick-to: 6.4 Fixes: QTBUG-77210 Change-Id: I812bc324f49ae28b8c622cfa89f9690e012bf216 Reviewed-by: Morten Johan Sørvig --- src/network/access/qnetworkreplywasmimpl.cpp | 26 ++++++++++++++++---- src/network/access/qnetworkreplywasmimpl_p.h | 1 + 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/src/network/access/qnetworkreplywasmimpl.cpp b/src/network/access/qnetworkreplywasmimpl.cpp index 9ed01d06ce3..44541bb501a 100644 --- a/src/network/access/qnetworkreplywasmimpl.cpp +++ b/src/network/access/qnetworkreplywasmimpl.cpp @@ -68,22 +68,37 @@ QByteArray QNetworkReplyWasmImpl::methodName() const void QNetworkReplyWasmImpl::close() { + Q_D(QNetworkReplyWasmImpl); + + if (d->state != QNetworkReplyPrivate::Aborted && + d->state != QNetworkReplyPrivate::Finished && + d->state != QNetworkReplyPrivate::Idle) { + d->state = QNetworkReplyPrivate::Finished; + d->setCanceled(); + } + QNetworkReply::close(); - setFinished(true); - emit finished(); } void QNetworkReplyWasmImpl::abort() { Q_D(QNetworkReplyWasmImpl); + if (d->state == QNetworkReplyPrivate::Finished || d->state == QNetworkReplyPrivate::Aborted) return; d->state = QNetworkReplyPrivate::Aborted; - d->m_fetch->userData = nullptr; + d->setCanceled(); +} - d->emitReplyError(QNetworkReply::OperationCanceledError, QStringLiteral("Operation canceled")); - close(); +void QNetworkReplyWasmImplPrivate::setCanceled() +{ + Q_Q(QNetworkReplyWasmImpl); + m_fetch->userData = nullptr; + + emitReplyError(QNetworkReply::OperationCanceledError, QStringLiteral("Operation canceled")); + q->setFinished(true); + emit q->finished(); } qint64 QNetworkReplyWasmImpl::bytesAvailable() const @@ -239,6 +254,7 @@ void QNetworkReplyWasmImplPrivate::doSendRequest() attr.destinationPath = destinationPath.constData(); m_fetch = emscripten_fetch(&attr, request.url().toString().toUtf8()); + state = Working; } void QNetworkReplyWasmImplPrivate::emitReplyError(QNetworkReply::NetworkError errorCode, const QString &errorString) diff --git a/src/network/access/qnetworkreplywasmimpl_p.h b/src/network/access/qnetworkreplywasmimpl_p.h index ff933b49f80..d8c814621b9 100644 --- a/src/network/access/qnetworkreplywasmimpl_p.h +++ b/src/network/access/qnetworkreplywasmimpl_p.h @@ -112,6 +112,7 @@ public: emscripten_fetch_t *m_fetch; void setReplyFinished(); + void setCanceled(); Q_DECLARE_PUBLIC(QNetworkReplyWasmImpl) };