All of lore.kernel.org
 help / color / mirror / Atom feed
From: Paolo Bonzini <pbonzini@redhat.com>
To: Alex Bligh <alex@alex.org.uk>,
	"Daniel P. Berrange" <berrange@redhat.com>,
	Kevin Wolf <kwolf@redhat.com>, Eric Blake <eblake@redhat.com>,
	"qemu-devel@nongnu.org" <qemu-devel@nongnu.org>
Cc: Wouter Verhelst <w@uter.be>
Subject: Re: [Qemu-devel] [PATCH] Fix NBD unsupported options
Date: Wed, 6 Apr 2016 10:06:55 +0200	[thread overview]
Message-ID: <5704C39F.5070002@redhat.com> (raw)
In-Reply-To: <1459882500-24316-1-git-send-email-alex@alex.org.uk>



On 05/04/2016 20:55, Alex Bligh wrote:
> nbd-client.c currently fails to handle unsupported options properly.
> If during option haggling the server finds an option that is
> unsupported, it returns an NBD_REP_ERR_UNSUP reply.
> 
> According to nbd's proto.md, the format for such a reply
> should be:
> 
>   S: 64 bits, 0x3e889045565a9 (magic number for replies)
>   S: 32 bits, the option as sent by the client to which this is a reply
>   S: 32 bits, reply type (e.g., NBD_REP_ACK for successful completion,
>      or NBD_REP_ERR_UNSUP to mark use of an option not known by this server
>   S: 32 bits, length of the reply. This may be zero for some replies,
>      in which case the next field is not sent
>   S: any data as required by the reply (e.g., an export name in the case
>      of NBD_REP_SERVER)
> 
> However, in nbd-client.c, the reply type was being read, and if it
> contained an error, it was bailing out and issuing the next option
> request without first reading the length. This meant that the
> next option / handshake read had an extra 4 bytes of data in it.
> In practice, this makes Qemu incompatible with servers that do not
> support NBD_OPT_LIST.
> 
> To verify this isn't an error in the specification or my reading of
> it, replies are sent by the reference implementation here:
>  https://github.com/yoe/nbd/blob/master/nbd-server.c#L1232
> and as is evident it always sends a 'datasize' (aka length) 32 bit
> word. Unsupported elements are replied to here:
>  https://github.com/yoe/nbd/blob/master/nbd-server.c#L1371
> 
> Signed-off-by: Alex Bligh <alex@alex.org.uk>
> ---
>  nbd/client.c | 13 +++++++------
>  1 file changed, 7 insertions(+), 6 deletions(-)
> 
> diff --git a/nbd/client.c b/nbd/client.c
> index d9b7a9b..6f0541d 100644
> --- a/nbd/client.c
> +++ b/nbd/client.c
> @@ -138,12 +138,6 @@ static int nbd_receive_list(QIOChannel *ioc, char **name, Error **errp)
>          return -1;
>      }
>      type = be32_to_cpu(type);
> -    if (type == NBD_REP_ERR_UNSUP) {
> -        return 0;
> -    }
> -    if (nbd_handle_reply_err(opt, type, errp) < 0) {
> -        return -1;
> -    }
>  
>      if (read_sync(ioc, &len, sizeof(len)) != sizeof(len)) {
>          error_setg(errp, "failed to read option length");
> @@ -151,6 +145,13 @@ static int nbd_receive_list(QIOChannel *ioc, char **name, Error **errp)
>      }
>      len = be32_to_cpu(len);
>  
> +    if (type == NBD_REP_ERR_UNSUP) {
> +        return 0;
> +    }
> +    if (nbd_handle_reply_err(opt, type, errp) < 0) {
> +        return -1;
> +    }
> +
>      if (type == NBD_REP_ACK) {
>          if (len != 0) {
>              error_setg(errp, "length too long for option end");
> 

Thanks, queued.

Paolo

  parent reply	other threads:[~2016-04-06  8:07 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-04-05 18:55 [Qemu-devel] [PATCH] Fix NBD unsupported options Alex Bligh
2016-04-05 20:09 ` [Qemu-devel] [PATCH for-2.6] " Eric Blake
2016-04-06  8:06 ` Paolo Bonzini [this message]
2016-04-06 16:14 ` [Qemu-devel] [PATCH] " Eric Blake
2016-04-06 16:29   ` Alex Bligh

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=5704C39F.5070002@redhat.com \
    --to=pbonzini@redhat.com \
    --cc=alex@alex.org.uk \
    --cc=berrange@redhat.com \
    --cc=eblake@redhat.com \
    --cc=kwolf@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=w@uter.be \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.