diff --git a/NEWS b/NEWS index 1e7a8389..caca51d0 100644 --- a/NEWS +++ b/NEWS @@ -5,6 +5,7 @@ ncmpcpp-0.6.5 (????-??-??) * Searching in text fields now respects regular expression configuration. * When numbering tracks in tag editor all the other track tags are discarded. * Xiph tag DESCRIPTION is now rewritten as COMMENT when updating tags. +* Possible access of already freed memory when downloading artist info is fixed. ncmpcpp-0.6.4 (2015-05-02) diff --git a/src/actions.cpp b/src/actions.cpp index 34e7964f..6e84b5ec 100644 --- a/src/actions.cpp +++ b/src/actions.cpp @@ -2314,7 +2314,7 @@ void ShowArtistInfo::run() if (!artist.empty()) { - myLastfm->queueJob(LastFm::ArtistInfo(artist, Config.lastfm_preferred_language)); + myLastfm->queueJob(new LastFm::ArtistInfo(artist, Config.lastfm_preferred_language)); myLastfm->switchTo(); } # endif // HAVE_CURL_CURL_H diff --git a/src/lastfm.h b/src/lastfm.h index 051dc8aa..f2407fa5 100644 --- a/src/lastfm.h +++ b/src/lastfm.h @@ -51,27 +51,25 @@ struct Lastfm: Screen, Tabbable virtual bool isMergable() OVERRIDE { return true; } template - void queueJob(ServiceT &&service) + void queueJob(ServiceT *service) { - typedef typename std::remove_reference::type ServiceNoRef; - - auto old_service = dynamic_cast(m_service.get()); + auto old_service = dynamic_cast(m_service.get()); // if the same service and arguments were used, leave old info - if (old_service != nullptr && *old_service == service) + if (old_service != nullptr && *old_service == *service) return; - - m_service = std::make_shared(std::forward(service)); - m_worker = boost::async(boost::launch::async, boost::bind(&LastFm::Service::fetch, m_service.get())); - + + m_service = std::shared_ptr(service); + m_worker = boost::async(boost::launch::async, std::bind(&LastFm::Service::fetch, m_service)); + w.clear(); w << "Fetching information..."; w.flush(); m_title = ToWString(m_service->name()); } - + protected: virtual bool isLockable() OVERRIDE { return false; } - + private: void getResult();