mirror of
				https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
				synced 2025-11-03 09:01:50 -05:00 
			
		
		
		
	core: memory leak, fix ref counting when moving streams
This commit is contained in:
		
							parent
							
								
									dcd4a73df9
								
							
						
					
					
						commit
						9ae8ca2c37
					
				
					 4 changed files with 40 additions and 12 deletions
				
			
		| 
						 | 
					@ -335,8 +335,8 @@ int pa_sink_input_new(
 | 
				
			||||||
            0,
 | 
					            0,
 | 
				
			||||||
            &i->sink->silence);
 | 
					            &i->sink->silence);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    pa_assert_se(pa_idxset_put(core->sink_inputs, pa_sink_input_ref(i), &i->index) == 0);
 | 
					    pa_assert_se(pa_idxset_put(core->sink_inputs, i, &i->index) == 0);
 | 
				
			||||||
    pa_assert_se(pa_idxset_put(i->sink->inputs, i, NULL) == 0);
 | 
					    pa_assert_se(pa_idxset_put(i->sink->inputs, pa_sink_input_ref(i), NULL) == 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (i->client)
 | 
					    if (i->client)
 | 
				
			||||||
        pa_assert_se(pa_idxset_put(i->client->sink_inputs, i, NULL) >= 0);
 | 
					        pa_assert_se(pa_idxset_put(i->client->sink_inputs, i, NULL) >= 0);
 | 
				
			||||||
| 
						 | 
					@ -1155,6 +1155,8 @@ int pa_sink_input_start_move(pa_sink_input *i) {
 | 
				
			||||||
    pa_sink_update_status(i->sink);
 | 
					    pa_sink_update_status(i->sink);
 | 
				
			||||||
    i->sink = NULL;
 | 
					    i->sink = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    pa_sink_input_unref(i);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return 0;
 | 
					    return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1202,7 +1204,7 @@ int pa_sink_input_finish_move(pa_sink_input *i, pa_sink *dest, pa_bool_t save) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    i->sink = dest;
 | 
					    i->sink = dest;
 | 
				
			||||||
    i->save_sink = save;
 | 
					    i->save_sink = save;
 | 
				
			||||||
    pa_idxset_put(dest->inputs, i, NULL);
 | 
					    pa_idxset_put(dest->inputs, pa_sink_input_ref(i), NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (pa_sink_input_get_state(i) == PA_SINK_INPUT_CORKED)
 | 
					    if (pa_sink_input_get_state(i) == PA_SINK_INPUT_CORKED)
 | 
				
			||||||
        i->sink->n_corked++;
 | 
					        i->sink->n_corked++;
 | 
				
			||||||
| 
						 | 
					@ -1267,11 +1269,19 @@ int pa_sink_input_move_to(pa_sink_input *i, pa_sink *dest, pa_bool_t save) {
 | 
				
			||||||
    if (!pa_sink_input_may_move_to(i, dest))
 | 
					    if (!pa_sink_input_may_move_to(i, dest))
 | 
				
			||||||
        return -PA_ERR_NOTSUPPORTED;
 | 
					        return -PA_ERR_NOTSUPPORTED;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if ((r = pa_sink_input_start_move(i)) < 0)
 | 
					    pa_sink_input_ref(i);
 | 
				
			||||||
        return r;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if ((r = pa_sink_input_finish_move(i, dest, save)) < 0)
 | 
					    if ((r = pa_sink_input_start_move(i)) < 0) {
 | 
				
			||||||
 | 
					        pa_sink_input_unref(i);
 | 
				
			||||||
        return r;
 | 
					        return r;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if ((r = pa_sink_input_finish_move(i, dest, save)) < 0) {
 | 
				
			||||||
 | 
					        pa_sink_input_unref(i);
 | 
				
			||||||
 | 
					        return r;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    pa_sink_input_unref(i);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return 0;
 | 
					    return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -515,8 +515,12 @@ pa_queue *pa_sink_move_all_start(pa_sink *s) {
 | 
				
			||||||
    for (i = PA_SINK_INPUT(pa_idxset_first(s->inputs, &idx)); i; i = n) {
 | 
					    for (i = PA_SINK_INPUT(pa_idxset_first(s->inputs, &idx)); i; i = n) {
 | 
				
			||||||
        n = PA_SINK_INPUT(pa_idxset_next(s->inputs, &idx));
 | 
					        n = PA_SINK_INPUT(pa_idxset_next(s->inputs, &idx));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        pa_sink_input_ref(i);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (pa_sink_input_start_move(i) >= 0)
 | 
					        if (pa_sink_input_start_move(i) >= 0)
 | 
				
			||||||
            pa_queue_push(q, pa_sink_input_ref(i));
 | 
					            pa_queue_push(q, i);
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					            pa_sink_input_unref(i);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return q;
 | 
					    return q;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -705,6 +705,8 @@ int pa_source_output_start_move(pa_source_output *o) {
 | 
				
			||||||
    pa_source_update_status(o->source);
 | 
					    pa_source_update_status(o->source);
 | 
				
			||||||
    o->source = NULL;
 | 
					    o->source = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    pa_source_output_unref(o);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return 0;
 | 
					    return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -752,7 +754,7 @@ int pa_source_output_finish_move(pa_source_output *o, pa_source *dest, pa_bool_t
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    o->source = dest;
 | 
					    o->source = dest;
 | 
				
			||||||
    o->save_source = save;
 | 
					    o->save_source = save;
 | 
				
			||||||
    pa_idxset_put(o->source->outputs, o, NULL);
 | 
					    pa_idxset_put(o->source->outputs, pa_source_output_ref(o), NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (pa_source_output_get_state(o) == PA_SOURCE_OUTPUT_CORKED)
 | 
					    if (pa_source_output_get_state(o) == PA_SOURCE_OUTPUT_CORKED)
 | 
				
			||||||
        o->source->n_corked++;
 | 
					        o->source->n_corked++;
 | 
				
			||||||
| 
						 | 
					@ -804,11 +806,19 @@ int pa_source_output_move_to(pa_source_output *o, pa_source *dest, pa_bool_t sav
 | 
				
			||||||
    if (!pa_source_output_may_move_to(o, dest))
 | 
					    if (!pa_source_output_may_move_to(o, dest))
 | 
				
			||||||
        return -PA_ERR_NOTSUPPORTED;
 | 
					        return -PA_ERR_NOTSUPPORTED;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if ((r = pa_source_output_start_move(o)) < 0)
 | 
					    pa_source_output_ref(o);
 | 
				
			||||||
        return r;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if ((r = pa_source_output_finish_move(o, dest, save)) < 0)
 | 
					    if ((r = pa_source_output_start_move(o)) < 0) {
 | 
				
			||||||
 | 
					        pa_source_output_unref(o);
 | 
				
			||||||
        return r;
 | 
					        return r;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if ((r = pa_source_output_finish_move(o, dest, save)) < 0) {
 | 
				
			||||||
 | 
					        pa_source_output_unref(o);
 | 
				
			||||||
 | 
					        return r;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    pa_source_output_unref(o);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return 0;
 | 
					    return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -466,8 +466,12 @@ pa_queue *pa_source_move_all_start(pa_source *s) {
 | 
				
			||||||
    for (o = PA_SOURCE_OUTPUT(pa_idxset_first(s->outputs, &idx)); o; o = n) {
 | 
					    for (o = PA_SOURCE_OUTPUT(pa_idxset_first(s->outputs, &idx)); o; o = n) {
 | 
				
			||||||
        n = PA_SOURCE_OUTPUT(pa_idxset_next(s->outputs, &idx));
 | 
					        n = PA_SOURCE_OUTPUT(pa_idxset_next(s->outputs, &idx));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        pa_source_output_ref(o);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (pa_source_output_start_move(o) >= 0)
 | 
					        if (pa_source_output_start_move(o) >= 0)
 | 
				
			||||||
            pa_queue_push(q, pa_source_output_ref(o));
 | 
					            pa_queue_push(q, o);
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					            pa_source_output_unref(o);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return q;
 | 
					    return q;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue