On 10/30/2017 06:22 PM, Vladimir Sementsov-Ogievskiy wrote: > 27.10.2017 13:40, Eric Blake wrote: >> Consolidate the response for a non-zero-length option payload >> into a new function, nbd_reject_length(). This check will >> also be used when introducing support for structured replies. >> >> Note that STARTTLS response differs based on time: if the connection >> is still unencrypted, we set fatal to true (a client that can't >> request TLS correctly may still think that we are ready to start >> the TLS handshake, so we must disconnect); while if the connection >> is already encrypted, the client is sending a bogus request but >> is no longer at risk of being confused by continuing the connection. >>
>> switch (option) {
>> case NBD_OPT_STARTTLS:
>> - tioc = nbd_negotiate_handle_starttls(client, length,
>> errp);
>> + if (length) {
>> + /* Unconditionally drop the connection if the client
>> + * can't start a TLS negotiation correctly */
>> + nbd_reject_length(client, length, option, true,
>> errp);
>> + return -EINVAL;
>
> why not to return nbd_reject_length's result? this EINVAL may not
> correspond to errp (about EIO for example)..
Somewhat true, if nbd_reject_length() fails. But nbd_reject_length() may
also return 0 without setting errp, in which case, maybe this code
should set errp rather than just blindly returning -EINVAL.
>
> with or without this fixed:
>
> Reviewed-by: Vladimir Sementsov-Ogievskiy <[email protected]>
>
Okay, I'll squash this in, and include it in my pull request to be sent
shortly.
diff --git i/nbd/server.c w/nbd/server.c
index a9480e42cd..91f81a0f19 100644
--- i/nbd/server.c
+++ w/nbd/server.c
@@ -684,8 +684,13 @@ static int nbd_negotiate_options(NBDClient *client,
uint16_t myflags,
if (length) {
/* Unconditionally drop the connection if the client
* can't start a TLS negotiation correctly */
- nbd_reject_length(client, length, option, true, errp);
- return -EINVAL;
+ ret = nbd_reject_length(client, length, option,
true, errp);
+ if (!ret) {
+ error_setg(errp, "option '%s' should have zero
length",
+ nbd_opt_lookup(option));
+ ret = -EINVAL;
+ }
+ return ret;
}
tioc = nbd_negotiate_handle_starttls(client, errp);
if (!tioc) {
--
Eric Blake, Principal Software Engineer
Red Hat, Inc. +1-919-301-3266
Virtualization: qemu.org | libvirt.org
signature.asc
Description: OpenPGP digital signature
