[Spice-devel] [PATCH spice-server] red-stream: Handle reading of 0 bytes in red_stream_async_read

Christophe de Dinechin cdupontd at redhat.com
Tue Jan 30 14:48:07 UTC 2018



> On 30 Jan 2018, at 12:22, Frediano Ziglio <fziglio at redhat.com> wrote:
> 
>>> 
>>> On 17 Jan 2018, at 11:19, Frediano Ziglio <fziglio at redhat.com> wrote:
>>> 
>>> Currently red_stream_async_read cannot handle read of 0 bytes.
>>> This would cause a wrong assert in async_read_handler.
>>> Fixing the assert would just make the code wrongly detect a
>>> disconnection (usually a return of 0 from read is handled that
>>> way but happens also if you try to read 0 bytes).
>>> Current callers of these function does not pass 0 as size however
>>> handling data protocols having data_length+data this can happen
>>> and is handled manually in red_sasl_handle_auth_steplen.
>>> Avoid needing manually to check for this condition.
>>> 
>>> Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
>>> ---
>>> server/red-stream.c | 8 ++++----
>>> 1 file changed, 4 insertions(+), 4 deletions(-)
>>> 
>>> diff --git a/server/red-stream.c b/server/red-stream.c
>>> index 8f2c9d32..bdc8bc1f 100644
>>> --- a/server/red-stream.c
>>> +++ b/server/red-stream.c
>>> @@ -550,6 +550,10 @@ void red_stream_async_read(RedStream *stream,
>>>    AsyncRead *async = &stream->priv->async_read;
>>> 
>>>    g_return_if_fail(async->now == NULL && async->end == NULL);
>>> +    if (size == 0) {
>>> +        read_done_cb(opaque);
>>> +        return;
>>> +    }
>>>    async->now = data;
>>>    async->end = async->now + size;
>>>    async->done = read_done_cb;
>>> @@ -904,10 +908,6 @@ static void red_sasl_handle_auth_steplen(void *opaque)
>>>        return red_sasl_async_result(opaque, auth->mechname ?
>>>        RED_SASL_ERROR_INVALID_DATA : RED_SASL_ERROR_GENERIC);
>>>    }
>>> 
>>> -    if (len == 0) {
>>> -        return red_sasl_handle_auth_step(auth);
>>> -    }
>>> -
>> 
>> I think from the commit message that you are saying that this condition
>> is handled in  red_sasl_handle_auth_steplen anyway, which is the reason
>> it’s OK to remove it here.
>> 
>> Assuming that’s what you mean, then
>> 
>> Acked-by: Christophe de Dinechin <dinechin at redhat.com>
>> 
> 
> I think so.
> Checking all the paths (callers) is always used with a value >0.
> In red_sasl_handle_auth_steplen the condition ==0 is handled with an
> explicit test to avoid it.
> However if you consider the "normal" read(2) function reading 0 bytes
> is allowed, in my man page:
> 
> "If count is zero, read() may detect the errors described below. 
> In the absence of any errors, or if read() does not check for errors,
> a read() with a count of 0 returns zero  and has no other effects."
> 
> this is actually a tricky case that confuse some code where 0 bytes
> returned is detected as a socket closed while you asked just 0 bytes.
> 
> I think from the API prospective that reading 0 bytes should be
> allowed instead of having to manually check it.
> 
>> (otherwise clarify the rationale in the commit message)
>> 
>> Also, did you have case where the assert actually triggers, or is that
>> just code inspection?
>> 
> 
> Code inspection and the removal of the code in red_sasl_handle_auth_steplen.
> So we can say both.
> 
>>>    auth->data = g_realloc(auth->data, len);
>>>    red_stream_async_read(auth->stream, (uint8_t *)auth->data, len,
>>>                          red_sasl_handle_auth_step, auth);
> 
> I read again the commit message and make sense to me but maybe just
> because I wrote it. Suggestion for better phrasing are welcome.

No. That’s how I had read it too. So again,

Acked-by: Christophe de Dinechin <dinechin at redhat.com> 


> 
> Frediano
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/spice-devel



More information about the Spice-devel mailing list