Commit 80531ef8 authored by Max Kellermann's avatar Max Kellermann

db/simple: fix ExportedSong move constructor for non-owning sources

If the constructor moves from an ExportedSong instance which refers to somebody else's "Tag" instance, the newly constructed instance will instead refer to its own empty "tag_buffer" field. This broke SimpleDatabase::GetSong(), i.e. all songs on the queue restored from the state file or added using the "addid" command. Closes https://github.com/MusicPlayerDaemon/MPD/issues/1089
parent a91fba6a
ver 0.22.6 (not yet released)
* fix missing tags on songs in queue
ver 0.22.5 (2021/02/15)
* protocol
......
......@@ -29,6 +29,12 @@
* a #LightSong, e.g. a merged #Tag.
*/
class ExportedSong : public LightSong {
/**
* A reference target for LightSong::tag, but it is only used
* if this instance "owns" the #Tag. For instances referring
* to a foreign #Tag instance (e.g. a Song::tag), this field
* is not used (and empty).
*/
Tag tag_buffer;
public:
......@@ -42,10 +48,20 @@ public:
points to this instance's #Tag field instead of leaving a
dangling reference to the source object's #Tag field */
ExportedSong(ExportedSong &&src) noexcept
:LightSong(src, tag_buffer),
:LightSong(src,
/* refer to tag_buffer only if the
moved-from instance also owned the Tag
which its LightSong::tag field refers
to */
OwnsTag() ? tag_buffer : src.tag),
tag_buffer(std::move(src.tag_buffer)) {}
ExportedSong &operator=(ExportedSong &&) = delete;
private:
bool OwnsTag() const noexcept {
return &tag == &tag_buffer;
}
};
#endif
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment