[MPlayer-dev-eng] [PATCH] ao/alsa: Plug device leak if init() fails

Reimar Döffinger Reimar.Doeffinger at gmx.de
Fri Sep 8 09:12:36 EEST 2017


On 31.08.2017, at 01:12, Ville Syrjälä <syrjala at sci.fi> wrote:

> 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.

I suspect this really should be using "goto error".
I haven't reviewed if uninit is carefully written to always be safe to call on a half-initialized module.


> ---
> 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
> 
> _______________________________________________
> MPlayer-dev-eng mailing list
> MPlayer-dev-eng at mplayerhq.hu
> https://lists.mplayerhq.hu/mailman/listinfo/mplayer-dev-eng


More information about the MPlayer-dev-eng mailing list