From: Tanu Kaskinen Date: Thu, 14 Mar 2013 20:07:12 +0000 (+0200) Subject: loopback: Fix segfault in may_move_to() callbacks X-Git-Tag: v3.99.1~44 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=f8b57af2c890f3cb98ee07ed7c0192e75146cbf1;p=platform%2Fupstream%2Fpulseaudio.git loopback: Fix segfault in may_move_to() callbacks The sink input may_move_to() callbacks can be called while the source output is not connected to any source (i.e. is currently moving too), and vice versa. Thanks to Frédéric Dalleau for reporting this bug. --- diff --git a/src/modules/module-loopback.c b/src/modules/module-loopback.c index 461c4a7..ea24c3b 100644 --- a/src/modules/module-loopback.c +++ b/src/modules/module-loopback.c @@ -379,13 +379,16 @@ static void source_output_kill_cb(pa_source_output *o) { } /* Called from main thread */ -static pa_bool_t source_output_may_move_to_cb(pa_source_output *o, pa_source *dest) { +static bool source_output_may_move_to_cb(pa_source_output *o, pa_source *dest) { struct userdata *u; pa_source_output_assert_ref(o); pa_assert_ctl_context(); pa_assert_se(u = o->userdata); + if (!u->sink_input || !u->sink_input->sink) + return true; + return dest != u->sink_input->sink->monitor_source; } @@ -667,15 +670,15 @@ static void sink_input_moving_cb(pa_sink_input *i, pa_sink *dest) { } /* Called from main thread */ -static pa_bool_t sink_input_may_move_to_cb(pa_sink_input *i, pa_sink *dest) { +static bool sink_input_may_move_to_cb(pa_sink_input *i, pa_sink *dest) { struct userdata *u; pa_sink_input_assert_ref(i); pa_assert_ctl_context(); pa_assert_se(u = i->userdata); - if (!u->source_output->source->monitor_of) - return TRUE; + if (!u->source_output || !u->source_output->source) + return true; return dest != u->source_output->source->monitor_of; }