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:
parent
7bfe6a3304
commit
d01fb6730a
2
NEWS
2
NEWS
|
@ -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)
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue