[PATCH] modargs: Fix get_sample_rate if no "rate" is present in the modarg

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hello, 

> This patch fixes a bug which was introduced in:
>     e74d4244a285a7e29300c19df7b202ba7c51ecef
> 
> The offending function was introduced in:
>     832ad693f5081b09a36d180f81c19be9092eb2e9
> pa_modargs_get_samplerate() is not safe to be called if the modarg does
> not contain an entry with a "rate" key.

Tanu made a point here
http://lists.freedesktop.org/archives/pulseaudio-discuss/2013-October/019015.html
saying that the function's output 'rate' should only be modified on 
success 

unfortunately the local variable does not get initialized, leading to the 
bug you observed when no "rate" modarg is present

I think the correct way to fix this is to initialize local_rate to rate; 
this matches the logic of pa_modargs_get_sample_spec() and most other 
getter functions, except pa_modargs_get_alternate_sample_rate()

I'll post fixes addressing this issues; there are complains on the mail 
list regarding this issues, sorry for the delay

regards, p.

> pa_modargs_get_value_u32 returns 0 (success) if no value with the
> specified key is found, in this case the rate_local variable inside
> pa_modargs_get_samplerate() remains uninitialized.
 
> This patch modifies the pa_modargs_get_samplerate() function to modify
> the function argument rate. The function must now be called with an
> initialized rate argument.
> ---
>  src/pulsecore/modargs.c | 10 +++-------
>  1 file changed, 3 insertions(+), 7 deletions(-)
> 
> diff --git a/src/pulsecore/modargs.c b/src/pulsecore/modargs.c
> index 432e480..f3bf803 100644
> --- a/src/pulsecore/modargs.c
> +++ b/src/pulsecore/modargs.c
> @@ -365,17 +365,13 @@ int pa_modargs_get_value_volume(pa_modargs *ma, const char *key, pa_volume_t *va
>  }
>  
>  int pa_modargs_get_sample_rate(pa_modargs *ma, uint32_t *rate) {
> -    uint32_t rate_local;
> -
>      pa_assert(rate);
>  
> -    if ((pa_modargs_get_value_u32(ma, "rate", &rate_local)) < 0 ||
> -        rate_local <= 0 ||
> -        rate_local > PA_RATE_MAX)
> +    if ((pa_modargs_get_value_u32(ma, "rate", rate)) < 0 ||
> +        *rate <= 0 ||
> +        *rate > PA_RATE_MAX)
>          return -1;
>  
> -    *rate = rate_local;
> -
>      return 0;
>  }
>  
> 

-- 

Peter Meerwald
+43-664-2444418 (mobile)


[Index of Archives]     [Linux Audio Users]     [AMD Graphics]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux