nbd: Quit server after any write error

We should never ignore failure from nbd_negotiate_send_rep(); if
we are unable to write to the client, then it is not worth trying
to continue the negotiation.  Fortunately, the problem is not
too severe - chances are that the errors being ignored here (mainly
inability to write the reply to the client) are indications of
a closed connection or something similar, which will also affect
the next attempt to interact with the client and eventually reach
a point where the errors are detected to end the loop.

Signed-off-by: Eric Blake <eblake@redhat.com>
Message-Id: <1463006384-7734-4-git-send-email-eblake@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
Eric Blake 2016-05-11 16:39:36 -06:00 committed by Paolo Bonzini
parent 2cb347493c
commit 63d5ef869e

View File

@ -334,7 +334,10 @@ static QIOChannel *nbd_negotiate_handle_starttls(NBDClient *client,
return NULL; return NULL;
} }
nbd_negotiate_send_rep(client->ioc, NBD_REP_ACK, NBD_OPT_STARTTLS); if (nbd_negotiate_send_rep(client->ioc, NBD_REP_ACK,
NBD_OPT_STARTTLS) < 0) {
return NULL;
}
tioc = qio_channel_tls_new_server(ioc, tioc = qio_channel_tls_new_server(ioc,
client->tlscreds, client->tlscreds,
@ -460,8 +463,11 @@ static int nbd_negotiate_options(NBDClient *client)
if (nbd_negotiate_drop_sync(client->ioc, length) != length) { if (nbd_negotiate_drop_sync(client->ioc, length) != length) {
return -EIO; return -EIO;
} }
nbd_negotiate_send_rep(client->ioc, NBD_REP_ERR_TLS_REQD, ret = nbd_negotiate_send_rep(client->ioc, NBD_REP_ERR_TLS_REQD,
clientflags); clientflags);
if (ret < 0) {
return ret;
}
break; break;
} }
} else if (fixedNewstyle) { } else if (fixedNewstyle) {
@ -485,12 +491,17 @@ static int nbd_negotiate_options(NBDClient *client)
} }
if (client->tlscreds) { if (client->tlscreds) {
TRACE("TLS already enabled"); TRACE("TLS already enabled");
nbd_negotiate_send_rep(client->ioc, NBD_REP_ERR_INVALID, ret = nbd_negotiate_send_rep(client->ioc,
clientflags); NBD_REP_ERR_INVALID,
clientflags);
} else { } else {
TRACE("TLS not configured"); TRACE("TLS not configured");
nbd_negotiate_send_rep(client->ioc, NBD_REP_ERR_POLICY, ret = nbd_negotiate_send_rep(client->ioc,
clientflags); NBD_REP_ERR_POLICY,
clientflags);
}
if (ret < 0) {
return ret;
} }
break; break;
default: default:
@ -498,8 +509,11 @@ static int nbd_negotiate_options(NBDClient *client)
if (nbd_negotiate_drop_sync(client->ioc, length) != length) { if (nbd_negotiate_drop_sync(client->ioc, length) != length) {
return -EIO; return -EIO;
} }
nbd_negotiate_send_rep(client->ioc, NBD_REP_ERR_UNSUP, ret = nbd_negotiate_send_rep(client->ioc, NBD_REP_ERR_UNSUP,
clientflags); clientflags);
if (ret < 0) {
return ret;
}
break; break;
} }
} else { } else {