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
This commit is contained in:
parent
a91fba6a3d
commit
80531ef8d8
1
NEWS
1
NEWS
|
@ -1,4 +1,5 @@
|
||||||
ver 0.22.6 (not yet released)
|
ver 0.22.6 (not yet released)
|
||||||
|
* fix missing tags on songs in queue
|
||||||
|
|
||||||
ver 0.22.5 (2021/02/15)
|
ver 0.22.5 (2021/02/15)
|
||||||
* protocol
|
* protocol
|
||||||
|
|
|
@ -29,6 +29,12 @@
|
||||||
* a #LightSong, e.g. a merged #Tag.
|
* a #LightSong, e.g. a merged #Tag.
|
||||||
*/
|
*/
|
||||||
class ExportedSong : public LightSong {
|
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;
|
Tag tag_buffer;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
@ -42,10 +48,20 @@ public:
|
||||||
points to this instance's #Tag field instead of leaving a
|
points to this instance's #Tag field instead of leaving a
|
||||||
dangling reference to the source object's #Tag field */
|
dangling reference to the source object's #Tag field */
|
||||||
ExportedSong(ExportedSong &&src) noexcept
|
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)) {}
|
tag_buffer(std::move(src.tag_buffer)) {}
|
||||||
|
|
||||||
ExportedSong &operator=(ExportedSong &&) = delete;
|
ExportedSong &operator=(ExportedSong &&) = delete;
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool OwnsTag() const noexcept {
|
||||||
|
return &tag == &tag_buffer;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue