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:
parent
efde78db77
commit
d4d06da2f8
2
NEWS
2
NEWS
@ -1,4 +1,6 @@
|
|||||||
ver 0.22.5 (not yet released)
|
ver 0.22.5 (not yet released)
|
||||||
|
* database
|
||||||
|
- simple: fix missing CUE sheet metadata in "addid" command
|
||||||
* tags
|
* tags
|
||||||
- id: translate TPE3 to Conductor, not Performer
|
- id: translate TPE3 to Conductor, not Performer
|
||||||
* archive
|
* archive
|
||||||
|
@ -37,6 +37,15 @@ public:
|
|||||||
ExportedSong(const char *_uri, Tag &&_tag) noexcept
|
ExportedSong(const char *_uri, Tag &&_tag) noexcept
|
||||||
:LightSong(_uri, tag_buffer),
|
:LightSong(_uri, tag_buffer),
|
||||||
tag_buffer(std::move(_tag)) {}
|
tag_buffer(std::move(_tag)) {}
|
||||||
|
|
||||||
|
/* this custom move constructor is necessary so LightSong::tag
|
||||||
|
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),
|
||||||
|
tag_buffer(std::move(src.tag_buffer)) {}
|
||||||
|
|
||||||
|
ExportedSong &operator=(ExportedSong &&) = delete;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -88,6 +88,19 @@ struct LightSong {
|
|||||||
LightSong(const char *_uri, const Tag &_tag) noexcept
|
LightSong(const char *_uri, const Tag &_tag) noexcept
|
||||||
:uri(_uri), tag(_tag) {}
|
: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
|
gcc_pure
|
||||||
std::string GetURI() const noexcept {
|
std::string GetURI() const noexcept {
|
||||||
if (directory == nullptr)
|
if (directory == nullptr)
|
||||||
|
Loading…
Reference in New Issue
Block a user