mirror of
				https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
				synced 2025-11-03 09:01:50 -05:00 
			
		
		
		
	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).
This commit is contained in:
		
							parent
							
								
									32927c50a8
								
							
						
					
					
						commit
						ec4fa4c668
					
				
					 3 changed files with 14 additions and 9 deletions
				
			
		| 
						 | 
					@ -426,6 +426,7 @@ static int esd_proto_stream_play(connection *c, esd_proto_t request, const void
 | 
				
			||||||
    sdata.driver = __FILE__;
 | 
					    sdata.driver = __FILE__;
 | 
				
			||||||
    sdata.module = c->options->module;
 | 
					    sdata.module = c->options->module;
 | 
				
			||||||
    sdata.client = c->client;
 | 
					    sdata.client = c->client;
 | 
				
			||||||
 | 
					    if (sink)
 | 
				
			||||||
        pa_sink_input_new_data_set_sink(&sdata, sink, FALSE);
 | 
					        pa_sink_input_new_data_set_sink(&sdata, sink, FALSE);
 | 
				
			||||||
    pa_sink_input_new_data_set_sample_spec(&sdata, &ss);
 | 
					    pa_sink_input_new_data_set_sample_spec(&sdata, &ss);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -524,6 +525,7 @@ static int esd_proto_stream_record(connection *c, esd_proto_t request, const voi
 | 
				
			||||||
    sdata.driver = __FILE__;
 | 
					    sdata.driver = __FILE__;
 | 
				
			||||||
    sdata.module = c->options->module;
 | 
					    sdata.module = c->options->module;
 | 
				
			||||||
    sdata.client = c->client;
 | 
					    sdata.client = c->client;
 | 
				
			||||||
 | 
					    if (source)
 | 
				
			||||||
        pa_source_output_new_data_set_source(&sdata, source, FALSE);
 | 
					        pa_source_output_new_data_set_source(&sdata, source, FALSE);
 | 
				
			||||||
    pa_source_output_new_data_set_sample_spec(&sdata, &ss);
 | 
					    pa_source_output_new_data_set_sample_spec(&sdata, &ss);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -273,9 +273,11 @@ int pa_sink_input_new(
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    pa_return_val_if_fail(!data->driver || pa_utf8_valid(data->driver), -PA_ERR_INVALID);
 | 
					    pa_return_val_if_fail(!data->driver || pa_utf8_valid(data->driver), -PA_ERR_INVALID);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!data->sink)
 | 
					    if (!data->sink) {
 | 
				
			||||||
        pa_sink_input_new_data_set_sink(data, pa_namereg_get(core, NULL, PA_NAMEREG_SINK), FALSE);
 | 
					        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
 | 
					    /* Routing's done, we have a sink. Now let's fix the format and set up the
 | 
				
			||||||
     * sample spec */
 | 
					     * sample spec */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -298,7 +300,6 @@ int pa_sink_input_new(
 | 
				
			||||||
        pa_sink_input_new_data_set_sample_spec(data, &ss);
 | 
					        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(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);
 | 
					    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);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -253,8 +253,11 @@ int pa_source_output_new(
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    pa_return_val_if_fail(!data->driver || pa_utf8_valid(data->driver), -PA_ERR_INVALID);
 | 
					    pa_return_val_if_fail(!data->driver || pa_utf8_valid(data->driver), -PA_ERR_INVALID);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!data->source)
 | 
					    if (!data->source) {
 | 
				
			||||||
        pa_source_output_new_data_set_source(data, pa_namereg_get(core, NULL, PA_NAMEREG_SOURCE), FALSE);
 | 
					        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
 | 
					    /* Routing's done, we have a source. Now let's fix the format and set up the
 | 
				
			||||||
     * sample spec */
 | 
					     * sample spec */
 | 
				
			||||||
| 
						 | 
					@ -278,7 +281,6 @@ int pa_source_output_new(
 | 
				
			||||||
        pa_source_output_new_data_set_sample_spec(data, &ss);
 | 
					        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(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);
 | 
					    pa_return_val_if_fail(!data->direct_on_input || data->direct_on_input->sink == data->source->monitor_of, -PA_ERR_INVALID);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue