[pulseaudio-discuss] [PATCH 1/6] padsp: Fix flush

Tanu Kaskinen tanuk at iki.fi
Fri Aug 19 15:02:58 UTC 2016


On Thu, 2016-08-18 at 18:17 +0200, Peter Meerwald-Stadler wrote:
> read() can return a number of bytes read less than k

There seem to be other fixes too, which are not mentioned in the commit
message: handling of EAGAIN (but not EINTR - looks like pa_read() would
be suitable here too), fix for the completely broken error handling
(errors didn't cause termination of the loop), and handling of EOF
(AFAIK not all fds have a concept of EOF, and not knowing what this
function is used on, I don't know if the EOF handling is necessary -
but it can't hurt either).

> CID 1137981
> ---
>  src/utils/padsp.c | 11 +++++++++--
>  1 file changed, 9 insertions(+), 2 deletions(-)
> 
> diff --git a/src/utils/padsp.c b/src/utils/padsp.c
> index 943479b..bb01f7f 100644
> --- a/src/utils/padsp.c
> +++ b/src/utils/padsp.c
> @@ -1768,11 +1768,18 @@ static int dsp_flush_fd(int fd) {
>      while (l > 0) {
>          char buf[1024];
>          size_t k;
> +        ssize_t r;
>  
>          k = (size_t) l > sizeof(buf) ? sizeof(buf) : (size_t) l;
> -        if (read(fd, buf, k) < 0)
> +        r = read(fd, buf, k);
> +        if (r < 0) {
> +            if (errno == EAGAIN)
> +                break;
>              debug(DEBUG_LEVEL_NORMAL, __FILE__": read(): %s\n",
> strerror(errno));
> -        l -= k;
> +            return -1;
> +        } else if (r == 0)
> +            return 0;

Nitpicking: is there a reason why the errno == EAGAIN check uses
"break", but this returns zero directly? The end result is the same
anyway.

-- 
Tanu


More information about the pulseaudio-discuss mailing list