Fixed assert / infinite loop that may actually occur if artist name is too long (> 512chars), fixes #710
This commit is contained in:
@@ -35,6 +35,7 @@
|
|||||||
#include "SqlQuery.hpp"
|
#include "SqlQuery.hpp"
|
||||||
#include "Utils.hpp"
|
#include "Utils.hpp"
|
||||||
#include "traits/IdTypeTraits.hpp"
|
#include "traits/IdTypeTraits.hpp"
|
||||||
|
#include "traits/StringViewTraits.hpp"
|
||||||
|
|
||||||
DBO_INSTANTIATE_TEMPLATES(lms::db::Artist)
|
DBO_INSTANTIATE_TEMPLATES(lms::db::Artist)
|
||||||
|
|
||||||
@@ -257,7 +258,10 @@ namespace lms::db
|
|||||||
{
|
{
|
||||||
session.checkReadTransaction();
|
session.checkReadTransaction();
|
||||||
|
|
||||||
return utils::fetchQueryResults<Artist::pointer>(session.getDboSession()->query<Wt::Dbo::ptr<Artist>>("SELECT a FROM artist a").where("a.name = ?").bind(std::string{ name, 0, _maxNameLength }).orderBy("LENGTH(a.mbid) DESC")); // put mbid entries first
|
if (name.size() > maxNameLength)
|
||||||
|
name = name.substr(0, maxNameLength);
|
||||||
|
|
||||||
|
return utils::fetchQueryResults<Artist::pointer>(session.getDboSession()->query<Wt::Dbo::ptr<Artist>>("SELECT a FROM artist a").where("a.name = ?").bind(name).orderBy("LENGTH(a.mbid) DESC")); // put mbid entries first
|
||||||
}
|
}
|
||||||
|
|
||||||
Artist::pointer Artist::find(Session& session, const core::UUID& mbid)
|
Artist::pointer Artist::find(Session& session, const core::UUID& mbid)
|
||||||
@@ -444,15 +448,14 @@ AND NOT EXISTS (
|
|||||||
|
|
||||||
void Artist::setName(std::string_view name)
|
void Artist::setName(std::string_view name)
|
||||||
{
|
{
|
||||||
_name.assign(name, 0, _maxNameLength);
|
_name.assign(name, 0, maxNameLength);
|
||||||
LMS_LOG_IF(DB, WARNING, name.size() > _maxNameLength, "Artist name too long, truncated to '" << _name << "'");
|
LMS_LOG_IF(DB, WARNING, name.size() > maxNameLength, "Artist name too long, truncated to '" << _name << "'");
|
||||||
}
|
}
|
||||||
|
|
||||||
void Artist::setSortName(std::string_view sortName)
|
void Artist::setSortName(std::string_view sortName)
|
||||||
{
|
{
|
||||||
_sortName.assign(sortName, 0, _maxNameLength);
|
_sortName.assign(sortName, 0, maxNameLength);
|
||||||
|
LMS_LOG_IF(DB, WARNING, sortName.size() > maxNameLength, "Artist sort name too long, truncated to '" << _sortName << "'");
|
||||||
LMS_LOG_IF(DB, WARNING, sortName.size() > _maxNameLength, "Artist sort name too long, truncated to '" << _sortName << "'");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Artist::setPreferredArtwork(ObjectPtr<Artwork> artwork)
|
void Artist::setPreferredArtwork(ObjectPtr<Artwork> artwork)
|
||||||
|
|||||||
@@ -21,6 +21,7 @@
|
|||||||
|
|
||||||
#include <Wt/Dbo/Impl.h>
|
#include <Wt/Dbo/Impl.h>
|
||||||
|
|
||||||
|
#include "core/ILogger.hpp"
|
||||||
#include "database/Session.hpp"
|
#include "database/Session.hpp"
|
||||||
#include "database/objects/Artist.hpp"
|
#include "database/objects/Artist.hpp"
|
||||||
#include "database/objects/Track.hpp"
|
#include "database/objects/Track.hpp"
|
||||||
@@ -177,11 +178,13 @@ namespace lms::db
|
|||||||
|
|
||||||
void TrackArtistLink::setArtistName(std::string_view artistName)
|
void TrackArtistLink::setArtistName(std::string_view artistName)
|
||||||
{
|
{
|
||||||
_artistName = artistName;
|
_artistName.assign(artistName, 0, Artist::maxNameLength);
|
||||||
|
LMS_LOG_IF(DB, WARNING, artistName.size() > Artist::maxNameLength, "Artist link name too long, truncated to '" << _artistName << "'");
|
||||||
}
|
}
|
||||||
|
|
||||||
void TrackArtistLink::setArtistSortName(std::string_view artistSortName)
|
void TrackArtistLink::setArtistSortName(std::string_view artistSortName)
|
||||||
{
|
{
|
||||||
_artistSortName = artistSortName;
|
_artistSortName.assign(artistSortName, 0, Artist::maxNameLength);
|
||||||
|
LMS_LOG_IF(DB, WARNING, artistSortName.size() > Artist::maxNameLength, "Artist link sort name too long, truncated to '" << _artistSortName << "'");
|
||||||
}
|
}
|
||||||
} // namespace lms::db
|
} // namespace lms::db
|
||||||
|
|||||||
@@ -58,6 +58,8 @@ namespace lms::db
|
|||||||
class Artist final : public Object<Artist, ArtistId>
|
class Artist final : public Object<Artist, ArtistId>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
static constexpr std::size_t maxNameLength{ 512 };
|
||||||
|
|
||||||
struct FindParameters
|
struct FindParameters
|
||||||
{
|
{
|
||||||
Filters filters;
|
Filters filters;
|
||||||
@@ -173,8 +175,6 @@ namespace lms::db
|
|||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static constexpr std::size_t _maxNameLength{ 512 };
|
|
||||||
|
|
||||||
friend class Session;
|
friend class Session;
|
||||||
// Create
|
// Create
|
||||||
Artist(const std::string& name, const std::optional<core::UUID>& MBID = {});
|
Artist(const std::string& name, const std::optional<core::UUID>& MBID = {});
|
||||||
|
|||||||
Reference in New Issue
Block a user