[MPlayer-dev-eng] [PATCH] ao/alsa: Plug device leak if init() fails
Ville Syrjälä
syrjala at sci.fi
Thu Aug 31 02:12:27 EEST 2017
Close the device instead of leaking it when init() fails. Otherwise
subsequent attempts at using the device are going to fail if the
device doesn't support mixing multiple streams.
---
libao2/ao_alsa.c | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)
diff --git a/libao2/ao_alsa.c b/libao2/ao_alsa.c
index 36dcc1136926..2ada64d3bec8 100644
--- a/libao2/ao_alsa.c
+++ b/libao2/ao_alsa.c
@@ -508,10 +508,12 @@ static int init(int rate_hz, int channels, int format, int flags)
mp_msg(MSGT_AO,MSGL_INFO,MSGTR_AO_ALSA_OpenInNonblockModeFailed);
if ((err = try_open_device(alsa_device, 0, isac3)) < 0) {
mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_ALSA_PlaybackOpenError, snd_strerror(err));
+ uninit(1);
return 0;
}
} else {
mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_ALSA_PlaybackOpenError, snd_strerror(err));
+ uninit(1);
return 0;
}
}
@@ -530,6 +532,7 @@ static int init(int rate_hz, int channels, int format, int flags)
{
mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_ALSA_UnableToGetInitialParameters,
snd_strerror(err));
+ uninit(1);
return 0;
}
@@ -538,6 +541,7 @@ static int init(int rate_hz, int channels, int format, int flags)
if (err < 0) {
mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_ALSA_UnableToSetAccessType,
snd_strerror(err));
+ uninit(1);
return 0;
}
@@ -562,6 +566,7 @@ static int init(int rate_hz, int channels, int format, int flags)
{
mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_ALSA_UnableToSetFormat,
snd_strerror(err));
+ uninit(1);
return 0;
}
@@ -570,6 +575,7 @@ static int init(int rate_hz, int channels, int format, int flags)
{
mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_ALSA_UnableToSetChannels,
snd_strerror(err));
+ uninit(1);
return 0;
}
@@ -582,6 +588,7 @@ static int init(int rate_hz, int channels, int format, int flags)
{
mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_ALSA_UnableToDisableResampling,
snd_strerror(err));
+ uninit(1);
return 0;
}
#endif
@@ -591,6 +598,7 @@ static int init(int rate_hz, int channels, int format, int flags)
{
mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_ALSA_UnableToSetSamplerate2,
snd_strerror(err));
+ uninit(1);
return 0;
}
@@ -603,6 +611,7 @@ static int init(int rate_hz, int channels, int format, int flags)
{
mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_ALSA_UnableToSetBufferTimeNear,
snd_strerror(err));
+ uninit(1);
return 0;
}
@@ -610,6 +619,7 @@ static int init(int rate_hz, int channels, int format, int flags)
&alsa_fragcount, NULL)) < 0) {
mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_ALSA_UnableToSetPeriods,
snd_strerror(err));
+ uninit(1);
return 0;
}
@@ -618,6 +628,7 @@ static int init(int rate_hz, int channels, int format, int flags)
{
mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_ALSA_UnableToSetHwParameters,
snd_strerror(err));
+ uninit(1);
return 0;
}
// end setting hw-params
@@ -627,6 +638,7 @@ static int init(int rate_hz, int channels, int format, int flags)
if ((err = snd_pcm_hw_params_get_buffer_size(alsa_hwparams, &bufsize)) < 0)
{
mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_ALSA_UnableToGetBufferSize, snd_strerror(err));
+ uninit(1);
return 0;
}
else {
@@ -636,6 +648,7 @@ static int init(int rate_hz, int channels, int format, int flags)
if ((err = snd_pcm_hw_params_get_period_size(alsa_hwparams, &chunk_size, NULL)) < 0) {
mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_ALSA_UnableToGetPeriodSize, snd_strerror(err));
+ uninit(1);
return 0;
} else {
mp_msg(MSGT_AO,MSGL_V,"alsa-init: got period size %li\n", chunk_size);
@@ -646,12 +659,14 @@ static int init(int rate_hz, int channels, int format, int flags)
if ((err = snd_pcm_sw_params_current(alsa_handler, alsa_swparams)) < 0) {
mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_ALSA_UnableToGetSwParameters,
snd_strerror(err));
+ uninit(1);
return 0;
}
#if SND_LIB_VERSION >= 0x000901
if ((err = snd_pcm_sw_params_get_boundary(alsa_swparams, &boundary)) < 0) {
mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_ALSA_UnableToGetBoundary,
snd_strerror(err));
+ uninit(1);
return 0;
}
#else
@@ -661,12 +676,14 @@ static int init(int rate_hz, int channels, int format, int flags)
if ((err = snd_pcm_sw_params_set_start_threshold(alsa_handler, alsa_swparams, chunk_size)) < 0) {
mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_ALSA_UnableToSetStartThreshold,
snd_strerror(err));
+ uninit(1);
return 0;
}
/* disable underrun reporting */
if ((err = snd_pcm_sw_params_set_stop_threshold(alsa_handler, alsa_swparams, boundary)) < 0) {
mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_ALSA_UnableToSetStopThreshold,
snd_strerror(err));
+ uninit(1);
return 0;
}
#if SND_LIB_VERSION >= 0x000901
@@ -674,12 +691,14 @@ static int init(int rate_hz, int channels, int format, int flags)
if ((err = snd_pcm_sw_params_set_silence_size(alsa_handler, alsa_swparams, boundary)) < 0) {
mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_ALSA_UnableToSetSilenceSize,
snd_strerror(err));
+ uninit(1);
return 0;
}
#endif
if ((err = snd_pcm_sw_params(alsa_handler, alsa_swparams)) < 0) {
mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_ALSA_UnableToGetSwParameters,
snd_strerror(err));
+ uninit(1);
return 0;
}
/* end setting sw-params */
--
2.13.0
More information about the MPlayer-dev-eng
mailing list