storage/curl: move start call out of the constructor

This can cause request completion in the I/O thread before this
constructor returns, leaving the object in an abstract state, causing
a crash due to pure virtual method call.  We should not start the
request until this object is fully constructed.

Closes https://github.com/MusicPlayerDaemon/MPD/issues/665
This commit is contained in:
Max Kellermann 2019-12-23 13:37:58 +01:00
parent 7bfe6a3304
commit d01fb6730a
2 changed files with 7 additions and 0 deletions

2
NEWS
View File

@ -1,6 +1,8 @@
ver 0.21.18 (not yet released)
* output
- alsa: fix hang bug with ALSA "null" outputs
* storage
- curl: fix crash bug
* reduce unnecessary CPU wakeups
ver 0.21.17 (2019/12/16)

View File

@ -109,7 +109,9 @@ public:
BIND_THIS_METHOD(OnDeferredStart)),
request(curl, uri, *this) {
// TODO: use CurlInputStream's configuration
}
void DeferStart() noexcept {
/* start the transfer inside the IOThread */
defer_start.Schedule();
}
@ -283,6 +285,7 @@ public:
}
using BlockingHttpRequest::GetEasy;
using BlockingHttpRequest::DeferStart;
using BlockingHttpRequest::Wait;
protected:
@ -430,6 +433,7 @@ public:
}
const StorageFileInfo &Perform() {
DeferStart();
Wait();
return info;
}
@ -481,6 +485,7 @@ public:
base_path(UriPathOrSlash(uri)) {}
std::unique_ptr<StorageDirectoryReader> Perform() {
DeferStart();
Wait();
return ToReader();
}