db/simple: fix dangling LightSong::tag reference in moved ExportedSong
After commit 1afa33c3c7, an old bug was revealed:
SimpleDatabase::GetSong() constructs an ExportedSong instance by
moving the return value of Song::Export(), which causes the
LightSong::tag field to be dangling on the moved-from
ExportedSong::tag_buffer. This broke tags from CUE sheets.
Closes https://github.com/MusicPlayerDaemon/MPD/issues/1070
This commit is contained in:
@@ -88,6 +88,19 @@ struct LightSong {
|
||||
LightSong(const char *_uri, const Tag &_tag) noexcept
|
||||
:uri(_uri), tag(_tag) {}
|
||||
|
||||
/**
|
||||
* A copy constructor which copies all fields, but only sets
|
||||
* the tag to a caller-provided reference. This is used by
|
||||
* the #ExportedSong move constructor.
|
||||
*/
|
||||
LightSong(const LightSong &src, const Tag &_tag) noexcept
|
||||
:directory(src.directory), uri(src.uri),
|
||||
real_uri(src.real_uri),
|
||||
tag(_tag),
|
||||
mtime(src.mtime),
|
||||
start_time(src.start_time), end_time(src.end_time),
|
||||
audio_format(src.audio_format) {}
|
||||
|
||||
gcc_pure
|
||||
std::string GetURI() const noexcept {
|
||||
if (directory == nullptr)
|
||||
|
||||
Reference in New Issue
Block a user