mirror of
https://gitlab.com/qemu-project/qemu
synced 2024-10-14 23:13:30 +00:00
io: Fix qio_channel_socket_close() error handling
The Error ** argument must be NULL, &error_abort, &error_fatal, or a
pointer to a variable containing NULL. Passing an argument of the
latter kind twice without clearing it in between is wrong: if the
first call sets an error, it no longer points to NULL for the second
call.
qio_channel_socket_close() passes @errp first to
socket_listen_cleanup(), and then, if closesocket() fails, to
error_setg_errno(). If socket_listen_cleanup() failed, this will trip
the assertion in error_setv().
Fix by ignoring a second error.
Fixes: 73564c407c
Cc: Daniel P. Berrangé <berrange@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Message-Id: <20200422130719.28225-11-armbru@redhat.com>
This commit is contained in:
parent
c61d1d9e49
commit
fdceb4ab4d
|
@ -704,6 +704,7 @@ qio_channel_socket_close(QIOChannel *ioc,
|
||||||
{
|
{
|
||||||
QIOChannelSocket *sioc = QIO_CHANNEL_SOCKET(ioc);
|
QIOChannelSocket *sioc = QIO_CHANNEL_SOCKET(ioc);
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
|
Error *err = NULL;
|
||||||
|
|
||||||
if (sioc->fd != -1) {
|
if (sioc->fd != -1) {
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
|
@ -715,8 +716,8 @@ qio_channel_socket_close(QIOChannel *ioc,
|
||||||
|
|
||||||
if (closesocket(sioc->fd) < 0) {
|
if (closesocket(sioc->fd) < 0) {
|
||||||
sioc->fd = -1;
|
sioc->fd = -1;
|
||||||
error_setg_errno(errp, errno,
|
error_setg_errno(&err, errno, "Unable to close socket");
|
||||||
"Unable to close socket");
|
error_propagate(errp, err);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
sioc->fd = -1;
|
sioc->fd = -1;
|
||||||
|
|
Loading…
Reference in a new issue