mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-06 17:23:56 -06:00
nbd: Drop unexpected data for NBD_OPT_LIST
When requesting the list of exports, no data should be sent. If data is sent, the NBD server should not just inform the client of the invalid request, but also drop the data. Signed-off-by: Max Reitz <mreitz@redhat.com> Message-Id: <1424887718-10800-22-git-send-email-mreitz@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
48c7d80de8
commit
0379f474dd
1 changed files with 23 additions and 0 deletions
23
nbd.c
23
nbd.c
|
@ -193,6 +193,26 @@ static ssize_t read_sync(int fd, void *buffer, size_t size)
|
|||
return nbd_wr_sync(fd, buffer, size, true);
|
||||
}
|
||||
|
||||
static ssize_t drop_sync(int fd, size_t size)
|
||||
{
|
||||
ssize_t ret, dropped = size;
|
||||
uint8_t *buffer = g_malloc(MIN(65536, size));
|
||||
|
||||
while (size > 0) {
|
||||
ret = read_sync(fd, buffer, MIN(65536, size));
|
||||
if (ret < 0) {
|
||||
g_free(buffer);
|
||||
return ret;
|
||||
}
|
||||
|
||||
assert(ret <= size);
|
||||
size -= ret;
|
||||
}
|
||||
|
||||
g_free(buffer);
|
||||
return dropped;
|
||||
}
|
||||
|
||||
static ssize_t write_sync(int fd, void *buffer, size_t size)
|
||||
{
|
||||
int ret;
|
||||
|
@ -303,6 +323,9 @@ static int nbd_handle_list(NBDClient *client, uint32_t length)
|
|||
|
||||
csock = client->sock;
|
||||
if (length) {
|
||||
if (drop_sync(csock, length) != length) {
|
||||
return -EIO;
|
||||
}
|
||||
return nbd_send_rep(csock, NBD_REP_ERR_INVALID, NBD_OPT_LIST);
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue