aboutsummaryrefslogtreecommitdiff
path: root/nbd/server.c
diff options
context:
space:
mode:
authorEric Blake <eblake@redhat.com>2016-05-11 16:39:38 -0600
committerPaolo Bonzini <pbonzini@redhat.com>2016-06-16 18:39:05 +0200
commitab7c548e266a6324db0994cea58c35b3dc87bade (patch)
tree915e139e45abda56a92e0341a17f74900b2a8d28 /nbd/server.c
parent29b6c3b319acb85b2f025bffebb8ed9b3a83602a (diff)
downloadqemu-ab7c548e266a6324db0994cea58c35b3dc87bade.zip
qemu-ab7c548e266a6324db0994cea58c35b3dc87bade.tar.gz
qemu-ab7c548e266a6324db0994cea58c35b3dc87bade.tar.bz2
nbd: Reject unknown request flags
The NBD protocol says that clients should not send a command flag that has not been negotiated (whether by the client requesting an option during a handshake, or because we advertise support for the flag in response to NBD_OPT_EXPORT_NAME), and that servers should reject invalid flags with EINVAL. We were silently ignoring the flags instead. The client can't rely on our behavior, since it is their fault for passing the bad flag in the first place, but it's better to be robust up front than to possibly behave differently than the client was expecting with the attempted flag. Signed-off-by: Eric Blake <eblake@redhat.com> Reviewed-by: Alex Bligh <alex@alex.org.uk> Message-Id: <1463006384-7734-6-git-send-email-eblake@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Diffstat (limited to 'nbd/server.c')
-rw-r--r--nbd/server.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/nbd/server.c b/nbd/server.c
index 41388f5..b0ca9d9 100644
--- a/nbd/server.c
+++ b/nbd/server.c
@@ -1072,6 +1072,11 @@ static ssize_t nbd_co_receive_request(NBDRequest *req,
rc = command == NBD_CMD_WRITE ? -ENOSPC : -EINVAL;
goto out;
}
+ if (request->type & ~NBD_CMD_MASK_COMMAND & ~NBD_CMD_FLAG_FUA) {
+ LOG("unsupported flags (got 0x%x)",
+ request->type & ~NBD_CMD_MASK_COMMAND);
+ return -EINVAL;
+ }
rc = 0;