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;
++      }
+ }
+ 
+ 

Reply via email to