fix a segfault when registering a service with avahi fails

git-svn-id: file:///home/lennart/svn/public/pulseaudio/trunk@1253 fefdeb5f-60dc-0310-8127-8f9354f1896f
This commit is contained in:
Lennart Poettering 2006-08-13 20:44:32 +00:00
parent cdb173f6ab
commit 3334814ebb

View file

@ -225,9 +225,8 @@ finish:
if (s->published == UNPUBLISHED) { if (s->published == UNPUBLISHED) {
/* Remove this service */ /* Remove this service */
if (s->entry_group) { if (s->entry_group)
avahi_entry_group_free(s->entry_group); avahi_entry_group_free(s->entry_group);
}
pa_hashmap_remove(u->services, s->name); pa_hashmap_remove(u->services, s->name);
pa_xfree(s->name); pa_xfree(s->name);
@ -263,6 +262,7 @@ static struct service *get_service(struct userdata *u, const char *name) {
static int publish_sink(struct userdata *u, pa_sink *s) { static int publish_sink(struct userdata *u, pa_sink *s) {
struct service *svc; struct service *svc;
int ret;
assert(u && s); assert(u && s);
svc = get_service(u, s->name); svc = get_service(u, s->name);
@ -273,13 +273,17 @@ static int publish_sink(struct userdata *u, pa_sink *s) {
svc->loaded.type = PA_NAMEREG_SINK; svc->loaded.type = PA_NAMEREG_SINK;
svc->loaded.index = s->index; svc->loaded.index = s->index;
pa_dynarray_put(u->sink_dynarray, s->index, svc); if ((ret = publish_service(u, svc)) < 0)
return ret;
return publish_service(u, svc); pa_dynarray_put(u->sink_dynarray, s->index, svc);
return ret;
} }
static int publish_source(struct userdata *u, pa_source *s) { static int publish_source(struct userdata *u, pa_source *s) {
struct service *svc; struct service *svc;
int ret;
assert(u && s); assert(u && s);
svc = get_service(u, s->name); svc = get_service(u, s->name);
@ -292,11 +296,17 @@ static int publish_source(struct userdata *u, pa_source *s) {
pa_dynarray_put(u->source_dynarray, s->index, svc); pa_dynarray_put(u->source_dynarray, s->index, svc);
return publish_service(u, svc); if ((ret = publish_service(u, svc)) < 0)
return ret;
pa_dynarray_put(u->sink_dynarray, s->index, svc);
return ret;
} }
static int publish_autoload(struct userdata *u, pa_autoload_entry *s) { static int publish_autoload(struct userdata *u, pa_autoload_entry *s) {
struct service *svc; struct service *svc;
int ret;
assert(u && s); assert(u && s);
svc = get_service(u, s->name); svc = get_service(u, s->name);
@ -307,9 +317,11 @@ static int publish_autoload(struct userdata *u, pa_autoload_entry *s) {
svc->autoload.type = s->type; svc->autoload.type = s->type;
svc->autoload.index = s->index; svc->autoload.index = s->index;
pa_dynarray_put(u->autoload_dynarray, s->index, svc); if ((ret = publish_service(u, svc)) < 0)
return ret;
return publish_service(u, svc); pa_dynarray_put(u->autoload_dynarray, s->index, svc);
return ret;
} }
static int remove_sink(struct userdata *u, uint32_t idx) { static int remove_sink(struct userdata *u, uint32_t idx) {
@ -653,6 +665,9 @@ void pa__done(pa_core *c, pa_module*m) {
if (u->services) if (u->services)
pa_hashmap_free(u->services, service_free, u); pa_hashmap_free(u->services, service_free, u);
if (u->subscription)
pa_subscription_free(u->subscription);
if (u->sink_dynarray) if (u->sink_dynarray)
pa_dynarray_free(u->sink_dynarray, NULL, NULL); pa_dynarray_free(u->sink_dynarray, NULL, NULL);
if (u->source_dynarray) if (u->source_dynarray)
@ -660,8 +675,6 @@ void pa__done(pa_core *c, pa_module*m) {
if (u->autoload_dynarray) if (u->autoload_dynarray)
pa_dynarray_free(u->autoload_dynarray, NULL, NULL); pa_dynarray_free(u->autoload_dynarray, NULL, NULL);
if (u->subscription)
pa_subscription_free(u->subscription);
if (u->main_entry_group) if (u->main_entry_group)
avahi_entry_group_free(u->main_entry_group); avahi_entry_group_free(u->main_entry_group);