Skip to content

Commit 95c12d2

Browse files
Fix crash on timeout
Avoid immediate destruction of NetworkManager when handling network errors. QNetworkAccessManager may defer timeout/error processing, which can lead to crashes if the manager is destroyed immediately
1 parent 3c0b2ce commit 95c12d2

3 files changed

Lines changed: 13 additions & 10 deletions

File tree

src/musesounds/internal/musesamplercheckupdateservice.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -87,12 +87,14 @@ Promise<RetVal<bool> > MuseSamplerCheckUpdateService::checkForUpdate()
8787
queryBuffer->setData(configuration()->getMuseSamplerVersionQuery().toUtf8());
8888
auto receivedData = std::make_shared<QBuffer>();
8989

90-
m_networkManager = networkManagerCreator()->makeNetworkManager();
90+
if (!m_networkManager) {
91+
m_networkManager = networkManagerCreator()->makeNetworkManager();
92+
}
93+
9194
RetVal<Progress> progress = m_networkManager->post(configuration()->checkForMuseSamplerUpdateUrl(),
9295
queryBuffer, receivedData,
9396
configuration()->headers());
9497
if (!progress.ret) {
95-
m_networkManager = nullptr;
9698
return resolve(RetVal<bool>::make_ret(progress.ret));
9799
}
98100

@@ -108,7 +110,6 @@ Promise<RetVal<bool> > MuseSamplerCheckUpdateService::checkForUpdate()
108110
}
109111

110112
(void)resolve(result);
111-
m_networkManager = nullptr;
112113
});
113114

114115
return Promise<RetVal<bool> >::dummy_result();

src/musesounds/internal/musesoundscheckupdateservice.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -78,19 +78,21 @@ Promise<RetVal<ReleaseInfo> > MuseSoundsCheckUpdateService::checkForUpdate()
7878

7979
auto buff = std::make_shared<QBuffer>();
8080
QUrl url = configuration()->checkForMuseSoundsUpdateUrl();
81-
m_networkManager = networkManagerCreator()->makeNetworkManager();
81+
82+
if (!m_networkManager) {
83+
m_networkManager = networkManagerCreator()->makeNetworkManager();
84+
}
85+
8286
RetVal<Progress> progress = m_networkManager->get(url, buff);
8387

8488
if (!progress.ret) {
8589
m_lastCheckResult.ret = progress.ret;
86-
m_networkManager = nullptr;
8790
return resolve(m_lastCheckResult);
8891
}
8992

9093
progress.val.finished().onReceive(this, [this, buff, resolve](const ProgressResult& res) {
9194
DEFER {
9295
(void)resolve(m_lastCheckResult);
93-
m_networkManager = nullptr;
9496
};
9597

9698
if (!res.ret) {

src/musesounds/internal/musesoundsrepository.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -96,18 +96,19 @@ void MuseSoundsRepository::init()
9696
device->setData(jsonData);
9797
auto receivedData = std::make_shared<QBuffer>();
9898

99-
m_networkManager = networkManagerCreator()->makeNetworkManager();
99+
if (!m_networkManager) {
100+
m_networkManager = networkManagerCreator()->makeNetworkManager();
101+
}
102+
100103
RetVal<Progress> progress = m_networkManager->post(url, device, receivedData, headers);
101104
if (!progress.ret) {
102105
LOGE() << progress.ret.toString();
103-
m_networkManager = nullptr;
104106
return;
105107
}
106108

107109
progress.val.finished().onReceive(this, [this, receivedData](const muse::ProgressResult& res) {
108110
if (!res.ret) {
109111
LOGE() << res.ret.toString();
110-
m_networkManager = nullptr;
111112
return;
112113
}
113114

@@ -124,7 +125,6 @@ void MuseSoundsRepository::init()
124125

125126
m_soundsСatalogs = result.val;
126127
m_soundsСatalogsChanged.notify();
127-
m_networkManager = nullptr;
128128
});
129129
}
130130

0 commit comments

Comments
 (0)