From 20c957ef6102fb7de070ae234812ba7c8fcef570 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sat, 23 Nov 2019 21:42:02 +0100 Subject: [PATCH] LibCore: Have CNetworkJob protect itself during the on_finish callback Otherwise, the callback may trigger the destruction of the CNetworkJob and make it difficult to continue execution correctly. --- Libraries/LibCore/CNetworkJob.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Libraries/LibCore/CNetworkJob.cpp b/Libraries/LibCore/CNetworkJob.cpp index f668fac9a3..7cc563f26b 100644 --- a/Libraries/LibCore/CNetworkJob.cpp +++ b/Libraries/LibCore/CNetworkJob.cpp @@ -14,6 +14,10 @@ CNetworkJob::~CNetworkJob() void CNetworkJob::did_finish(NonnullRefPtr&& response) { + // NOTE: We protect ourselves here, since the on_finish callback may otherwise + // trigger destruction of this job somehow. + NonnullRefPtr protector(*this); + m_response = move(response); #ifdef CNETWORKJOB_DEBUG dbg() << *this << " job did_finish!"; @@ -25,6 +29,10 @@ void CNetworkJob::did_finish(NonnullRefPtr&& response) void CNetworkJob::did_fail(Error error) { + // NOTE: We protect ourselves here, since the on_finish callback may otherwise + // trigger destruction of this job somehow. + NonnullRefPtr protector(*this); + m_error = error; #ifdef CNETWORKJOB_DEBUG dbgprintf("%s{%p} job did_fail! error: %u (%s)\n", class_name(), this, (unsigned)error, to_string(error));