Skip to content

Commit f17490e

Browse files
committed
CEF memory leaks #2
1 parent bd7a2af commit f17490e

File tree

4 files changed

+35
-5
lines changed

4 files changed

+35
-5
lines changed

Client/cefweb/CAjaxResourceHandler.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,15 @@ CAjaxResourceHandler::CAjaxResourceHandler(std::vector<SString>& vecGet, std::ve
1818
{
1919
}
2020

21+
CAjaxResourceHandler::~CAjaxResourceHandler()
22+
{
23+
// Ensure callback is released if handler is destroyed before completion
24+
if (m_callback)
25+
{
26+
m_callback = nullptr;
27+
}
28+
}
29+
2130
std::vector<SString>& CAjaxResourceHandler::GetGetData()
2231
{
2332
return m_vecGetData;

Client/cefweb/CAjaxResourceHandler.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ class CAjaxResourceHandler : public CefResourceHandler, public CAjaxResourceHand
2020
{
2121
public:
2222
CAjaxResourceHandler(std::vector<SString>& vecGet, std::vector<SString>& vecPost, const CefString& mimeType);
23+
virtual ~CAjaxResourceHandler();
2324

2425
virtual std::vector<SString>& GetGetData() override;
2526
virtual std::vector<SString>& GetPostData() override;

Client/cefweb/CWebCore.cpp

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,13 +109,22 @@ void CWebCore::DestroyWebView(CWebViewInterface* pWebViewInterface)
109109
CefRefPtr<CWebView> pWebView = dynamic_cast<CWebView*>(pWebViewInterface);
110110
if (pWebView)
111111
{
112+
// Mark as being destroyed to prevent new events/tasks
113+
pWebView->SetBeingDestroyed(true);
114+
112115
// Ensure that no attached events or tasks are in the queue
113116
RemoveWebViewEvents(pWebView.get());
114117
RemoveWebViewTasks(pWebView.get());
115118

119+
// Remove from list before closing to break reference cycles early
116120
m_WebViews.remove(pWebView);
117-
// pWebView->Release(); // Do not release since other references get corrupted then
121+
122+
// CloseBrowser will eventually trigger OnBeforeClose which clears m_pWebView
123+
// This breaks the circular reference: CWebView -> CefBrowser -> CWebView
118124
pWebView->CloseBrowser();
125+
126+
// Note: Do not call Release() - let CefRefPtr manage the lifecycle
127+
// The circular reference is broken via OnBeforeClose setting m_pWebView = nullptr
119128
}
120129
}
121130

Client/cefweb/CWebView.cpp

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,12 @@ CWebView::~CWebView()
4747
// Clean up AJAX handlers to prevent accumulation
4848
m_AjaxHandlers.clear();
4949

50-
// Ensure that CefRefPtr::~CefRefPtr doesn't try to release it twice (it has already been released in CWebView::OnBeforeClose)
51-
m_pWebView = nullptr;
50+
// Break circular reference: ensure browser reference is cleared
51+
// This is to prevent memory leaks from CWebView <-> CefBrowser cycles
52+
if (m_pWebView)
53+
{
54+
m_pWebView = nullptr;
55+
}
5256

5357
OutputDebugLine("CWebView::~CWebView");
5458
}
@@ -86,6 +90,9 @@ void CWebView::CloseBrowser()
8690
// Make sure we don't dead lock the CEF render thread
8791
ResumeCefThread();
8892

93+
// Clear AJAX handlers early to prevent late event processing
94+
m_AjaxHandlers.clear();
95+
8996
if (m_pWebView)
9097
m_pWebView->GetHost()->CloseBrowser(true);
9198
}
@@ -503,8 +510,12 @@ bool CWebView::HasAjaxHandler(const SString& strURL)
503510

504511
void CWebView::HandleAjaxRequest(const SString& strURL, CAjaxResourceHandler* pHandler)
505512
{
506-
auto func = std::bind(&CWebBrowserEventsInterface::Events_OnAjaxRequest, m_pEventsInterface, pHandler, strURL);
507-
g_pCore->GetWebCore()->AddEventToEventQueue(func, this, "AjaxResourceRequest");
513+
// Only queue event if not being destroyed to prevent UAF
514+
if (!m_bBeingDestroyed)
515+
{
516+
auto func = std::bind(&CWebBrowserEventsInterface::Events_OnAjaxRequest, m_pEventsInterface, pHandler, strURL);
517+
g_pCore->GetWebCore()->AddEventToEventQueue(func, this, "AjaxResourceRequest");
518+
}
508519
}
509520

510521
bool CWebView::ToggleDevTools(bool visible)

0 commit comments

Comments
 (0)