On Thu, 2012-04-12 at 15:42 +0200, David Henningsson wrote: > On 04/12/2012 01:59 PM, Tanu Kaskinen wrote: > > diff --git a/src/pulse/introspect.c b/src/pulse/introspect.c > > index 38a9d1c..be65fdd 100644 > > --- a/src/pulse/introspect.c > > +++ b/src/pulse/introspect.c > > @@ -200,29 +200,33 @@ static void context_get_sink_info_callback(pa_pdispatch *pd, uint32_t command, u > > > > if (o->context->version>= 16) { > > if (i.n_ports> 0) { > > - i.ports = pa_xnew(pa_sink_port_info*, i.n_ports+1); > > - i.ports[0] = pa_xnew(pa_sink_port_info, i.n_ports); > > + i.ports = pa_xnew0(pa_sink_port_info*, i.n_ports+1); > > + i.ports[0] = pa_xnew0(pa_sink_port_info, i.n_ports); > > > > for (j = 0; j< i.n_ports; j++) { > > - if (pa_tagstruct_gets(t,&i.ports[0][j].name)< 0 || > > - pa_tagstruct_gets(t,&i.ports[0][j].description)< 0 || > > - pa_tagstruct_getu32(t,&i.ports[0][j].priority)< 0) { > > + i.ports[j] =&i.ports[0][j]; > > + > > + if (pa_tagstruct_gets(t,&i.ports[j]->name)< 0 || > > + pa_tagstruct_gets(t,&i.ports[j]->description)< 0 || > > + pa_tagstruct_getu32(t,&i.ports[j]->priority)< 0) { > > > > goto fail; > > } > > > > - i.ports[0][j].available = PA_PORT_AVAILABLE_UNKNOWN; > > + i.ports[j]->available = PA_PORT_AVAILABLE_UNKNOWN; > > if (o->context->version>= 24) { > > uint32_t av; > > if (pa_tagstruct_getu32(t,&av)< 0 || av> PA_PORT_AVAILABLE_YES) > > goto fail; > > - i.ports[0][j].available = av; > > + i.ports[j]->available = av; > > } > > > > - i.ports[j] =&i.ports[0][j]; > > + i.ports[j]->proplist = pa_proplist_new(); > > + if (o->context->version>= 27) { > > + if (pa_tagstruct_get_proplist(t, i.ports[j]->proplist)< 0) > > + goto fail; > > + } > > } > > - > > - i.ports[j] = NULL; > > } > > > > if (pa_tagstruct_gets(t,&ap)< 0) > > @@ -268,6 +272,9 @@ static void context_get_sink_info_callback(pa_pdispatch *pd, uint32_t command, u > > pa_xfree(i.formats); > > } > > if (i.ports) { > > + for (j = 0; i.ports[j]; j++) > > + pa_proplist_free(i.ports[j]->proplist); > > + > > pa_xfree(i.ports[0]); > > pa_xfree(i.ports); > > } > > @@ -296,6 +303,11 @@ fail: > > pa_xfree(i.formats); > > } > > if (i.ports) { > > + for (j = 0; i.ports[j]; j++) { > > + if (i.ports[j]->proplist) > > + pa_proplist_free(i.ports[j]->proplist); > > Just a random dive-in here: is it possible that the pa_proplist_new has > not been called for the last port, therefore pa_proplist_free will raise > an assertion failure? It's possible that pa_proplist_new() hasn't been called, but in that case the pointer is NULL, and the if condition on the previous line is false, so pa_proplist_free() won't be called. -- Tanu