Hi, This patch fixes nasty crash if a musicbrainz query returns null For example, if musicbrainz.org cannot be resolved:
MusicBrainz: Connecting to http://musicbrainz.org:80 MusicBrainz: GET /ws/1/release/?type=xml&artist=Prince&title=Parade MusicBrainz: Result: 2 (Could not resolve hostname `musicbrainz.org': non-recoverable failure in name resolution) MusicBrainz: Status: 0 MusicBrainz: Response: Program received signal SIGABRT, Aborted. [Switching to process 5046, thread 0x8b79e400] 0x04e82f19 in kill () from /usr/lib/libc.so.50.1 (gdb) bt #0 0x04e82f19 in kill () from /usr/lib/libc.so.50.1 #1 0x04ecf89f in abort () at /usr/src/lib/libc/stdlib/abort.c:68 #2 0x011204bc in __cxxabiv1::__terminate () from /usr/lib/libstdc++.so.47.0 #3 0x011204f0 in std::terminate () from /usr/lib/libstdc++.so.47.0 #4 0x01120639 in __cxa_throw () from /usr/lib/libstdc++.so.47.0 #5 0x04bf4b8a in MusicBrainz::WebService::get (this=0x7dea4480, enti...@0x8af92650, i...@0x8af92670, inclu...@0x8af925e0, filt...@0x8af925d0, versi...@0x8af925b0) at /usr/ports/audio/libmusicbrainz/w-libmusicbrainz-3.0.1/libmusicbrainz-3.0.1/src/webservice.cpp:238 #6 0x04c05543 in MusicBrainz::Query::getFromWebService (this=0x8b7911f0, enti...@0x8af92650, i...@0x8af92670, include=0x0, filter=0x8b791ba0) at /usr/ports/audio/libmusicbrainz/w-libmusicbrainz-3.0.1/libmusicbrainz-3.0.1/src/query.cpp:166 #7 0x04c050d9 in MusicBrainz::Query::getReleases (this=0x8b7911f0, filter=0x8b791ba0) at /usr/ports/audio/libmusicbrainz/w-libmusicbrainz-3.0.1/libmusicbrainz-3.0.1/src/query.cpp:143 #8 0x04bf95f6 in mb_query_get_releases (q=0x8b7911f0, flt=0x8b791ba0) at /usr/ports/audio/libmusicbrainz/w-libmusicbrainz-3.0.1/libmusicbrainz-3.0.1/src/mb_c.cpp:289 #9 0x1c02b5a7 in get_cover_art_url (artist=0x85647620 "Prince", title=0x88652e80 "Kiss", album=0x85647580 "Parade") Taken from upstream SVN... Please, commit. TIA, David Index: Makefile =================================================================== RCS file: /cvs/openbsd/ports/audio/libmusicbrainz/Makefile,v retrieving revision 1.1.1.1 diff -u -p -r1.1.1.1 Makefile --- Makefile 25 Mar 2008 09:19:23 -0000 1.1.1.1 +++ Makefile 5 Feb 2009 11:48:03 -0000 @@ -3,6 +3,8 @@ COMMENT= library for audio metadata lookup DISTNAME= libmusicbrainz-3.0.1 +PKGNAME= ${DISTNAME}p0 + SHARED_LIBS= musicbrainz3 0.0 # .6.1 CATEGORIES= audio Index: patches/patch-src_mb_c_cpp =================================================================== RCS file: patches/patch-src_mb_c_cpp diff -N patches/patch-src_mb_c_cpp --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ patches/patch-src_mb_c_cpp 5 Feb 2009 11:48:03 -0000 @@ -0,0 +1,163 @@ +$OpenBSD$ +--- src/mb_c.cpp.orig Thu Feb 5 13:17:20 2009 ++++ src/mb_c.cpp Thu Feb 5 13:17:54 2009 +@@ -214,28 +214,48 @@ MbArtist + mb_query_get_artist_by_id(MbQuery q, const char *id, MbArtistIncludes inc) + { + Query *query = (Query *)q; +- return (MbArtist)query->getArtistById(id, (ArtistIncludes *)inc); ++ try { ++ return (MbArtist)query->getArtistById(id, (ArtistIncludes *)inc); ++ } ++ catch (...) { ++ return NULL; ++ } + } + + MbRelease + mb_query_get_release_by_id(MbQuery q, const char *id, MbReleaseIncludes inc) + { + Query *query = (Query *)q; +- return (MbRelease)query->getReleaseById(id, (ReleaseIncludes *)inc); ++ try { ++ return (MbRelease)query->getReleaseById(id, (ReleaseIncludes *)inc); ++ } ++ catch (...) { ++ return NULL; ++ } + } + + MbTrack + mb_query_get_track_by_id(MbQuery q, const char *id, MbTrackIncludes inc) + { + Query *query = (Query *)q; +- return (MbTrack)query->getTrackById(id, (TrackIncludes *)inc); ++ try { ++ return (MbTrack)query->getTrackById(id, (TrackIncludes *)inc); ++ } ++ catch (...) { ++ return NULL; ++ } + } + + MbUser + mb_query_get_user_by_name(MbQuery q, const char *name) + { + Query *query = (Query *)q; +- return (MbUser)query->getUserByName(name); ++ try { ++ return (MbUser)query->getUserByName(name); ++ } ++ catch (...) { ++ return NULL; ++ } + } + + void +@@ -247,55 +267,95 @@ mb_result_list_free(MbResultList list) + int + mb_result_list_get_size(MbResultList list) + { +- return ((ResultList *)list)->size(); ++ try { ++ return ((ResultList *)list)->size(); ++ } ++ catch (...) { ++ return 0; ++ } + } + + int + mb_result_list_get_score(MbResultList list, int index) + { +- return (*((ResultList *)list))[index]->getScore(); ++ try { ++ return (*((ResultList *)list))[index]->getScore(); ++ } ++ catch (...) { ++ return 0; ++ } + } + + MbArtist + mb_result_list_get_artist(MbResultList list, int index) + { +- return (MbArtist)(*((ArtistResultList *)list))[index]->getArtist(); ++ try { ++ return (MbArtist)(*((ArtistResultList *)list))[index]->getArtist(); ++ } ++ catch (...) { ++ return NULL; ++ } + } + + MbRelease + mb_result_list_get_release(MbResultList list, int index) + { +- return (*((ReleaseResultList *)list))[index]->getRelease(); ++ try { ++ return (*((ReleaseResultList *)list))[index]->getRelease(); ++ } ++ catch (...) { ++ return NULL; ++ } + } + + MbTrack + mb_result_list_get_track(MbResultList list, int index) + { +- return (*((TrackResultList *)list))[index]->getTrack(); ++ try { ++ return (*((TrackResultList *)list))[index]->getTrack(); ++ } ++ catch (...) { ++ return NULL; ++ } + } + + MB_API MbResultList + mb_query_get_artists(MbQuery q, MbArtistFilter flt) + { + Query *query = (Query *)q; +- ArtistResultList *results = new ArtistResultList(query->getArtists((ArtistFilter *)flt)); +- return (MbResultList)results; ++ try { ++ ArtistResultList *results = new ArtistResultList(query->getArtists((ArtistFilter *)flt)); ++ return (MbResultList)results; ++ } ++ catch (...) { ++ return NULL; ++ } + } + + MB_API MbResultList + mb_query_get_releases(MbQuery q, MbReleaseFilter flt) + { + Query *query = (Query *)q; +- ReleaseResultList *results = new ReleaseResultList(query->getReleases((ReleaseFilter *)flt)); +- return (MbResultList)results; ++ try { ++ ReleaseResultList *results = new ReleaseResultList(query->getReleases((ReleaseFilter *)flt)); ++ return (MbResultList)results; ++ } ++ catch (...) { ++ return NULL; ++ } + } + + MB_API MbResultList + mb_query_get_tracks(MbQuery q, MbTrackFilter flt) + { + Query *query = (Query *)q; +- TrackResultList *results = new TrackResultList(query->getTracks((TrackFilter *)flt)); +- return (MbResultList)results; ++ try { ++ TrackResultList *results = new TrackResultList(query->getTracks((TrackFilter *)flt)); ++ return (MbResultList)results; ++ } ++ catch (...) { ++ return NULL; ++ } + } + +
