Re: [PATCH] ao/alsa: Plug device leak if init() fails

Reimar Döffinger <[email protected]>
Newsgroups gmane.comp.video.mplayer.devel
Message-ID <[email protected]>
On 31.08.2017, at 01:12, Ville Syrjälä <[email protected]> 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
> [email protected]
> https://lists.mplayerhq.hu/mailman/listinfo/mplayer-dev-eng
_______________________________________________
MPlayer-dev-eng mailing list
[email protected]
https://lists.mplayerhq.hu/mailman/listinfo/mplayer-dev-eng
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.