diff options
| author | Colin Guthrie <colin@mageia.org> | 2011-06-08 20:18:12 +0100 | 
|---|---|---|
| committer | Colin Guthrie <colin@mageia.org> | 2011-06-22 22:45:28 +0100 | 
| commit | ec4fa4c668a61de8ed7c9452e73919ba0bb1a870 (patch) | |
| tree | 2cd3643615f5124322efa2b79a08d9c94c951cbc /src | |
| parent | 32927c50a8fef49f8a24eee82bf4ca64253a3dfc (diff) | |
esound,streams: Fix some crashes.
After the rework to the add pa_sink_input_new_data_set_sink() (and
the source equiv) calling with a NULL sink object will hit an assert.
This caused crashes with the esd protocol and there was the potential
(albeit unlikely) for a crash when creating a sink input without any
sinks available (module-always-sink mitigates this risk but it's still
a potential crasher).
Diffstat (limited to 'src')
| -rw-r--r-- | src/pulsecore/protocol-esound.c | 6 | ||||
| -rw-r--r-- | src/pulsecore/sink-input.c | 9 | ||||
| -rw-r--r-- | src/pulsecore/source-output.c | 8 | 
3 files changed, 14 insertions, 9 deletions
| diff --git a/src/pulsecore/protocol-esound.c b/src/pulsecore/protocol-esound.c index edca96a1..484821c5 100644 --- a/src/pulsecore/protocol-esound.c +++ b/src/pulsecore/protocol-esound.c @@ -426,7 +426,8 @@ static int esd_proto_stream_play(connection *c, esd_proto_t request, const void      sdata.driver = __FILE__;      sdata.module = c->options->module;      sdata.client = c->client; -    pa_sink_input_new_data_set_sink(&sdata, sink, FALSE); +    if (sink) +        pa_sink_input_new_data_set_sink(&sdata, sink, FALSE);      pa_sink_input_new_data_set_sample_spec(&sdata, &ss);      pa_sink_input_new(&c->sink_input, c->protocol->core, &sdata); @@ -524,7 +525,8 @@ static int esd_proto_stream_record(connection *c, esd_proto_t request, const voi      sdata.driver = __FILE__;      sdata.module = c->options->module;      sdata.client = c->client; -    pa_source_output_new_data_set_source(&sdata, source, FALSE); +    if (source) +        pa_source_output_new_data_set_source(&sdata, source, FALSE);      pa_source_output_new_data_set_sample_spec(&sdata, &ss);      pa_source_output_new(&c->source_output, c->protocol->core, &sdata); diff --git a/src/pulsecore/sink-input.c b/src/pulsecore/sink-input.c index 9a43e044..2e718c45 100644 --- a/src/pulsecore/sink-input.c +++ b/src/pulsecore/sink-input.c @@ -273,9 +273,11 @@ int pa_sink_input_new(      pa_return_val_if_fail(!data->driver || pa_utf8_valid(data->driver), -PA_ERR_INVALID); -    if (!data->sink) -        pa_sink_input_new_data_set_sink(data, pa_namereg_get(core, NULL, PA_NAMEREG_SINK), FALSE); - +    if (!data->sink) { +        pa_sink *sink = pa_namereg_get(core, NULL, PA_NAMEREG_SINK); +        pa_return_val_if_fail(sink, -PA_ERR_NOENTITY); +        pa_sink_input_new_data_set_sink(data, sink, FALSE); +    }      /* Routing's done, we have a sink. Now let's fix the format and set up the       * sample spec */ @@ -298,7 +300,6 @@ int pa_sink_input_new(          pa_sink_input_new_data_set_sample_spec(data, &ss);      } -    pa_return_val_if_fail(data->sink, -PA_ERR_NOENTITY);      pa_return_val_if_fail(PA_SINK_IS_LINKED(pa_sink_get_state(data->sink)), -PA_ERR_BADSTATE);      pa_return_val_if_fail(!data->sync_base || (data->sync_base->sink == data->sink && pa_sink_input_get_state(data->sync_base) == PA_SINK_INPUT_CORKED), -PA_ERR_INVALID); diff --git a/src/pulsecore/source-output.c b/src/pulsecore/source-output.c index e6cec605..59b6c2ff 100644 --- a/src/pulsecore/source-output.c +++ b/src/pulsecore/source-output.c @@ -253,8 +253,11 @@ int pa_source_output_new(      pa_return_val_if_fail(!data->driver || pa_utf8_valid(data->driver), -PA_ERR_INVALID); -    if (!data->source) -        pa_source_output_new_data_set_source(data, pa_namereg_get(core, NULL, PA_NAMEREG_SOURCE), FALSE); +    if (!data->source) { +        pa_source *source = pa_namereg_get(core, NULL, PA_NAMEREG_SOURCE); +        pa_return_val_if_fail(source, -PA_ERR_NOENTITY); +        pa_source_output_new_data_set_source(data, source, FALSE); +    }      /* Routing's done, we have a source. Now let's fix the format and set up the       * sample spec */ @@ -278,7 +281,6 @@ int pa_source_output_new(          pa_source_output_new_data_set_sample_spec(data, &ss);      } -    pa_return_val_if_fail(data->source, -PA_ERR_NOENTITY);      pa_return_val_if_fail(PA_SOURCE_IS_LINKED(pa_source_get_state(data->source)), -PA_ERR_BADSTATE);      pa_return_val_if_fail(!data->direct_on_input || data->direct_on_input->sink == data->source->monitor_of, -PA_ERR_INVALID); | 
