summaryrefslogtreecommitdiffstats
path: root/src/core
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2022-04-06 15:32:17 +0200
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2022-05-25 13:09:44 +0200
commit384d503d7a12c74762952e802c8cd41a60a88bc1 (patch)
tree23f82ee62080456771b0be764b4d03318d6ccc7a /src/core
parent50d7bfe1dfa25621e25cccbc9b920669bb8464b3 (diff)
Fix leak if loader error is seen first
For some reason the proxied_loader_receiver can still be bound in this case. Change-Id: If0bbe181eca5de41e82eebaced412361fe12fb40 Reviewed-by: Michal Klocek <michal.klocek@qt.io> (cherry picked from commit ffb831d9896dcdd3d469fdbeee407d96d631dbda)
Diffstat (limited to 'src/core')
-rw-r--r--src/core/net/proxying_url_loader_factory_qt.cpp7
1 files changed, 6 insertions, 1 deletions
diff --git a/src/core/net/proxying_url_loader_factory_qt.cpp b/src/core/net/proxying_url_loader_factory_qt.cpp
index 94faff545..0a7256c45 100644
--- a/src/core/net/proxying_url_loader_factory_qt.cpp
+++ b/src/core/net/proxying_url_loader_factory_qt.cpp
@@ -175,6 +175,8 @@ private:
bool local_access_ = false;
bool remote_access_ = true;
+ bool loader_error_seen_ = false;
+
// If the |target_loader_| called OnComplete with an error this stores it.
// That way the destructor can send it to OnReceivedError if safe browsing
// error didn't occur.
@@ -396,6 +398,7 @@ void InterceptedRequest::ContinueAfterIntercept()
}
if (!target_loader_ && target_factory_) {
+ loader_error_seen_ = false;
target_factory_->CreateLoaderAndStart(target_loader_.BindNewPipeAndPassReceiver(), routing_id_, request_id_,
options_, request_, proxied_client_receiver_.BindNewPipeAndPassRemote(),
traffic_annotation_);
@@ -501,6 +504,8 @@ void InterceptedRequest::OnURLLoaderError(uint32_t custom_reason, const std::str
// If CallOnComplete was already called, then this object is ready to be deleted.
if (!target_client_)
delete this;
+ else
+ loader_error_seen_ = true;
}
void InterceptedRequest::CallOnComplete(const network::URLLoaderCompletionStatus &status, bool wait_for_loader_error)
@@ -514,7 +519,7 @@ void InterceptedRequest::CallOnComplete(const network::URLLoaderCompletionStatus
if (target_client_)
target_client_->OnComplete(status);
- if (proxied_loader_receiver_.is_bound() && wait_for_loader_error) {
+ if (proxied_loader_receiver_.is_bound() && wait_for_loader_error && !loader_error_seen_) {
// Since the original client is gone no need to continue loading the
// request.
proxied_client_receiver_.reset();