17.12.2018 18:30, Eric Blake wrote:
> On 12/15/18 9:19 AM, Richard W.M. Jones wrote:
>> On Sat, Dec 15, 2018 at 07:53:14AM -0600, Eric Blake wrote:
>>> Always allocate space for the reply returned by the server and
>>> hoist the trace earlier, as it is more interesting to trace the
>>> server's reply (even if it is unexpected) than parroting our
>>> request only on success.  After all, skipping the allocation
>>> for a wrong size was merely a micro-optimization that only
>>> benefitted a broken server, rather than the common case of a
>>> compliant server that meets our expectations.
>>>
>>> Then turn the reply handling into a loop (even though we still
>>> never iterate more than once), to make this code easier to use
>>> when later patches do support multiple server replies.  This
>>> changes the error message for a server with two replies (a
>>> corner case we are unlikely to hit in practice) from:
>>>
>>> Unexpected reply type 4 (meta context), expected 0 (ack)
>>>
>>> to:
>>>
>>> Server replied with more than one context
>>>
>>> Signed-off-by: Eric Blake <ebl...@redhat.com>
>>>
>>> ---
>>> v2: split patch into easier-to-review pieces [Rich, Vladimir]
>>> ---
>>>   nbd/client.c | 16 ++++++++++++----
>>>   1 file changed, 12 insertions(+), 4 deletions(-)
>>>
>>> diff --git a/nbd/client.c b/nbd/client.c
>>> index bcccd5f555e..b6a85fc3ef8 100644
>>> --- a/nbd/client.c
>>> +++ b/nbd/client.c
>>> @@ -684,10 +684,11 @@ static int 
>>> nbd_negotiate_simple_meta_context(QIOChannel *ioc,
>>>           return ret;
>>>       }
>>>
>>> -    if (reply.type == NBD_REP_META_CONTEXT) {
>>> +    while (reply.type == NBD_REP_META_CONTEXT) {
>>
>> I'm not sure I understand why this change is safe.
>>
>> As far as I can see reply.type is only updated in the loop by
>> nbd_receive_option_reply, and that reads from the server, and so the
>> server might keep sending NBD_REP_META_CONTEXT packets (instead of the
>> expected NBD_REP_ACK), so it could now loop forever against a
>> malicious server?  (This is not taking into account any later patches)
> 
> Hmm - now that I've already responded to why the conversion to a loop does 
> not change this code, I'm now wondering if I even need this patch. In v1 of 
> the series, both SET and LIST shared a common function, and since LIST needs 
> the loop, converting SET to use a loop that exits early if it executes more 
> than once was needed to make the two actions share a common entry point.  But 
> since v2 uses different entry points (because it separated the common code 
> into separate helper functions, leaving the SET entry point unchanged and 
> adding a new LIST entry point), where only the LIST entry point actually has 
> to loop, I might be able to just drop this patch entirely and still achieve 
> the same effect.
> 

Are you going to resend series without this patch? In this case I'd prefer to 
continue review on already rebased patches. Or it doesn't make much difference?

-- 
Best regards,
Vladimir

Reply via email to