mirror of
https://bitbucket.org/chromiumembedded/cef
synced 2025-06-05 21:39:12 +02:00
Fix crash if CefAuthCallback outlives the matching URLRequest (issue #2612)
This commit is contained in:
committed by
Marshall Greenblatt
parent
3cf50ed942
commit
8d1453fd24
@@ -30,6 +30,9 @@
|
|||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
|
const void* kAuthCallbackHolderUserDataKey =
|
||||||
|
static_cast<const void*>(&kAuthCallbackHolderUserDataKey);
|
||||||
|
|
||||||
class CefBeforeResourceLoadCallbackImpl : public CefRequestCallback {
|
class CefBeforeResourceLoadCallbackImpl : public CefRequestCallback {
|
||||||
public:
|
public:
|
||||||
typedef net::CompletionOnceCallback CallbackType;
|
typedef net::CompletionOnceCallback CallbackType;
|
||||||
@@ -223,6 +226,19 @@ class CefAuthCallbackImpl : public CefAuthCallback {
|
|||||||
IMPLEMENT_REFCOUNTING(CefAuthCallbackImpl);
|
IMPLEMENT_REFCOUNTING(CefAuthCallbackImpl);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Invalidates CefAuthCallbackImpl::callback_ if the URLRequest is deleted
|
||||||
|
// before the callback.
|
||||||
|
class AuthCallbackHolder : public base::SupportsUserData::Data {
|
||||||
|
public:
|
||||||
|
explicit AuthCallbackHolder(CefRefPtr<CefAuthCallbackImpl> callback)
|
||||||
|
: callback_(callback) {}
|
||||||
|
|
||||||
|
~AuthCallbackHolder() override { callback_->Disconnect().Reset(); }
|
||||||
|
|
||||||
|
private:
|
||||||
|
CefRefPtr<CefAuthCallbackImpl> callback_;
|
||||||
|
};
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
CefNetworkDelegate::CefNetworkDelegate() : force_google_safesearch_(nullptr) {}
|
CefNetworkDelegate::CefNetworkDelegate() : force_google_safesearch_(nullptr) {}
|
||||||
@@ -401,6 +417,9 @@ net::NetworkDelegate::AuthRequiredResponse CefNetworkDelegate::OnAuthRequired(
|
|||||||
browser.get(), frame, auth_info.is_proxy,
|
browser.get(), frame, auth_info.is_proxy,
|
||||||
auth_info.challenger.host(), auth_info.challenger.port(),
|
auth_info.challenger.host(), auth_info.challenger.port(),
|
||||||
auth_info.realm, auth_info.scheme, callbackPtr.get())) {
|
auth_info.realm, auth_info.scheme, callbackPtr.get())) {
|
||||||
|
request->SetUserData(
|
||||||
|
kAuthCallbackHolderUserDataKey,
|
||||||
|
std::make_unique<AuthCallbackHolder>(callbackPtr));
|
||||||
return AUTH_REQUIRED_RESPONSE_IO_PENDING;
|
return AUTH_REQUIRED_RESPONSE_IO_PENDING;
|
||||||
} else {
|
} else {
|
||||||
callback = callbackPtr->Disconnect();
|
callback = callbackPtr->Disconnect();
|
||||||
@@ -421,6 +440,8 @@ net::NetworkDelegate::AuthRequiredResponse CefNetworkDelegate::OnAuthRequired(
|
|||||||
auth_info.is_proxy, auth_info.challenger.host(),
|
auth_info.is_proxy, auth_info.challenger.host(),
|
||||||
auth_info.challenger.port(), auth_info.realm, auth_info.scheme,
|
auth_info.challenger.port(), auth_info.realm, auth_info.scheme,
|
||||||
callbackPtr.get())) {
|
callbackPtr.get())) {
|
||||||
|
request->SetUserData(kAuthCallbackHolderUserDataKey,
|
||||||
|
std::make_unique<AuthCallbackHolder>(callbackPtr));
|
||||||
return AUTH_REQUIRED_RESPONSE_IO_PENDING;
|
return AUTH_REQUIRED_RESPONSE_IO_PENDING;
|
||||||
} else {
|
} else {
|
||||||
callback = callbackPtr->Disconnect();
|
callback = callbackPtr->Disconnect();
|
||||||
|
Reference in New Issue
Block a user