mirror of
https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
synced 2025-12-16 08:56:40 -05:00
alsa-card: Don't free the modargs in pa__init
The modargs are in both cases (a succesfull as well as a failed module initialization) freed already in pa__done(). To avoid leaking modargs memory before they are assigned to u->modargs, the code is reorganized to first allocate userdata, and then allocate the modargs. Local variable ma is not needed anymore. discussion here http://lists.freedesktop.org/archives/pulseaudio-discuss/2013-December/019661.html Signed-off-by: Peter Meerwald <pmeerw@pmeerw.net> Reported-by: poljar (Damir Jelić) <poljarinho@gmail.com>
This commit is contained in:
parent
56e007ebfb
commit
56e578c310
1 changed files with 19 additions and 26 deletions
|
|
@ -607,7 +607,6 @@ static pa_hook_result_t source_output_unlink_hook_callback(pa_core *c, pa_source
|
||||||
|
|
||||||
int pa__init(pa_module *m) {
|
int pa__init(pa_module *m) {
|
||||||
pa_card_new_data data;
|
pa_card_new_data data;
|
||||||
pa_modargs *ma;
|
|
||||||
bool ignore_dB = false;
|
bool ignore_dB = false;
|
||||||
struct userdata *u;
|
struct userdata *u;
|
||||||
pa_reserve_wrapper *reserve = NULL;
|
pa_reserve_wrapper *reserve = NULL;
|
||||||
|
|
@ -620,30 +619,29 @@ int pa__init(pa_module *m) {
|
||||||
|
|
||||||
pa_assert(m);
|
pa_assert(m);
|
||||||
|
|
||||||
if (!(ma = pa_modargs_new(m->argument, valid_modargs))) {
|
|
||||||
pa_log("Failed to parse module arguments");
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pa_modargs_get_value_boolean(ma, "ignore_dB", &ignore_dB) < 0) {
|
|
||||||
pa_log("Failed to parse ignore_dB argument.");
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
m->userdata = u = pa_xnew0(struct userdata, 1);
|
m->userdata = u = pa_xnew0(struct userdata, 1);
|
||||||
u->core = m->core;
|
u->core = m->core;
|
||||||
u->module = m;
|
u->module = m;
|
||||||
u->device_id = pa_xstrdup(pa_modargs_get_value(ma, "device_id", DEFAULT_DEVICE_ID));
|
|
||||||
u->modargs = ma;
|
|
||||||
|
|
||||||
u->use_ucm = true;
|
u->use_ucm = true;
|
||||||
u->ucm.core = m->core;
|
u->ucm.core = m->core;
|
||||||
|
|
||||||
|
if (!(u->modargs = pa_modargs_new(m->argument, valid_modargs))) {
|
||||||
|
pa_log("Failed to parse module arguments.");
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
u->device_id = pa_xstrdup(pa_modargs_get_value(u->modargs, "device_id", DEFAULT_DEVICE_ID));
|
||||||
|
|
||||||
if ((u->alsa_card_index = snd_card_get_index(u->device_id)) < 0) {
|
if ((u->alsa_card_index = snd_card_get_index(u->device_id)) < 0) {
|
||||||
pa_log("Card '%s' doesn't exist: %s", u->device_id, pa_alsa_strerror(u->alsa_card_index));
|
pa_log("Card '%s' doesn't exist: %s", u->device_id, pa_alsa_strerror(u->alsa_card_index));
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (pa_modargs_get_value_boolean(u->modargs, "ignore_dB", &ignore_dB) < 0) {
|
||||||
|
pa_log("Failed to parse ignore_dB argument.");
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
if (!pa_in_system_mode()) {
|
if (!pa_in_system_mode()) {
|
||||||
char *rname;
|
char *rname;
|
||||||
|
|
||||||
|
|
@ -656,7 +654,7 @@ int pa__init(pa_module *m) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pa_modargs_get_value_boolean(ma, "use_ucm", &u->use_ucm);
|
pa_modargs_get_value_boolean(u->modargs, "use_ucm", &u->use_ucm);
|
||||||
if (u->use_ucm && !pa_alsa_ucm_query_profiles(&u->ucm, u->alsa_card_index)) {
|
if (u->use_ucm && !pa_alsa_ucm_query_profiles(&u->ucm, u->alsa_card_index)) {
|
||||||
pa_log_info("Found UCM profiles");
|
pa_log_info("Found UCM profiles");
|
||||||
|
|
||||||
|
|
@ -682,9 +680,9 @@ int pa__init(pa_module *m) {
|
||||||
fn = pa_udev_get_property(u->alsa_card_index, "PULSE_PROFILE_SET");
|
fn = pa_udev_get_property(u->alsa_card_index, "PULSE_PROFILE_SET");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (pa_modargs_get_value(ma, "profile_set", NULL)) {
|
if (pa_modargs_get_value(u->modargs, "profile_set", NULL)) {
|
||||||
pa_xfree(fn);
|
pa_xfree(fn);
|
||||||
fn = pa_xstrdup(pa_modargs_get_value(ma, "profile_set", NULL));
|
fn = pa_xstrdup(pa_modargs_get_value(u->modargs, "profile_set", NULL));
|
||||||
}
|
}
|
||||||
|
|
||||||
u->profile_set = pa_alsa_profile_set_new(fn, &u->core->default_channel_map);
|
u->profile_set = pa_alsa_profile_set_new(fn, &u->core->default_channel_map);
|
||||||
|
|
@ -707,14 +705,14 @@ int pa__init(pa_module *m) {
|
||||||
|
|
||||||
pa_proplist_sets(data.proplist, PA_PROP_DEVICE_STRING, u->device_id);
|
pa_proplist_sets(data.proplist, PA_PROP_DEVICE_STRING, u->device_id);
|
||||||
pa_alsa_init_description(data.proplist);
|
pa_alsa_init_description(data.proplist);
|
||||||
set_card_name(&data, ma, u->device_id);
|
set_card_name(&data, u->modargs, u->device_id);
|
||||||
|
|
||||||
/* We need to give pa_modargs_get_value_boolean() a pointer to a local
|
/* We need to give pa_modargs_get_value_boolean() a pointer to a local
|
||||||
* variable instead of using &data.namereg_fail directly, because
|
* variable instead of using &data.namereg_fail directly, because
|
||||||
* data.namereg_fail is a bitfield and taking the address of a bitfield
|
* data.namereg_fail is a bitfield and taking the address of a bitfield
|
||||||
* variable is impossible. */
|
* variable is impossible. */
|
||||||
namereg_fail = data.namereg_fail;
|
namereg_fail = data.namereg_fail;
|
||||||
if (pa_modargs_get_value_boolean(ma, "namereg_fail", &namereg_fail) < 0) {
|
if (pa_modargs_get_value_boolean(u->modargs, "namereg_fail", &namereg_fail) < 0) {
|
||||||
pa_log("Failed to parse namereg_fail argument.");
|
pa_log("Failed to parse namereg_fail argument.");
|
||||||
pa_card_new_data_done(&data);
|
pa_card_new_data_done(&data);
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
@ -735,13 +733,13 @@ int pa__init(pa_module *m) {
|
||||||
|
|
||||||
add_disabled_profile(data.profiles);
|
add_disabled_profile(data.profiles);
|
||||||
|
|
||||||
if (pa_modargs_get_proplist(ma, "card_properties", data.proplist, PA_UPDATE_REPLACE) < 0) {
|
if (pa_modargs_get_proplist(u->modargs, "card_properties", data.proplist, PA_UPDATE_REPLACE) < 0) {
|
||||||
pa_log("Invalid properties");
|
pa_log("Invalid properties");
|
||||||
pa_card_new_data_done(&data);
|
pa_card_new_data_done(&data);
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((profile = pa_modargs_get_value(ma, "profile", NULL)))
|
if ((profile = pa_modargs_get_value(u->modargs, "profile", NULL)))
|
||||||
pa_card_new_data_set_profile(&data, profile);
|
pa_card_new_data_set_profile(&data, profile);
|
||||||
|
|
||||||
u->card = pa_card_new(m->core, &data);
|
u->card = pa_card_new(m->core, &data);
|
||||||
|
|
@ -768,17 +766,12 @@ int pa__init(pa_module *m) {
|
||||||
"is abused (i.e. fixes are not pushed to ALSA), the decibel fix feature may be removed in some future "
|
"is abused (i.e. fixes are not pushed to ALSA), the decibel fix feature may be removed in some future "
|
||||||
"PulseAudio version.", u->card->name);
|
"PulseAudio version.", u->card->name);
|
||||||
|
|
||||||
pa_modargs_free(ma);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
fail:
|
fail:
|
||||||
if (reserve)
|
if (reserve)
|
||||||
pa_reserve_wrapper_unref(reserve);
|
pa_reserve_wrapper_unref(reserve);
|
||||||
|
|
||||||
if (ma)
|
|
||||||
pa_modargs_free(ma);
|
|
||||||
|
|
||||||
pa__done(m);
|
pa__done(m);
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue