summaryrefslogtreecommitdiffstats
path: root/io/channel-socket.c
diff options
context:
space:
mode:
authorPeter Maydell2018-06-28 18:53:31 +0200
committerPeter Maydell2018-06-28 18:53:31 +0200
commit609ef9f451759151d0bfe7c3843410ab94d68f18 (patch)
treec74ce9664aeed913305449fd59c5e1c301948a73 /io/channel-socket.c
parentMerge remote-tracking branch 'remotes/stefanha/tags/block-pull-request' into ... (diff)
parentDelete AF_UNIX socket after close (diff)
downloadqemu-609ef9f451759151d0bfe7c3843410ab94d68f18.tar.gz
qemu-609ef9f451759151d0bfe7c3843410ab94d68f18.tar.xz
qemu-609ef9f451759151d0bfe7c3843410ab94d68f18.zip
Merge remote-tracking branch 'remotes/berrange/tags/qio-next-pull-request' into staging
Merge qio 2018-06-28 v3 Misc bug fixes for sockets channels # gpg: Signature made Thu 28 Jun 2018 13:37:35 BST # gpg: using RSA key BE86EBB415104FDF # gpg: Good signature from "Daniel P. Berrange <dan@berrange.com>" # gpg: aka "Daniel P. Berrange <berrange@redhat.com>" # Primary key fingerprint: DAF3 A6FD B26B 6291 2D0E 8E3F BE86 EBB4 1510 4FDF * remotes/berrange/tags/qio-next-pull-request: Delete AF_UNIX socket after close socket: don't free msgfds if error equals EAGAIN Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Diffstat (limited to 'io/channel-socket.c')
-rw-r--r--io/channel-socket.c18
1 files changed, 17 insertions, 1 deletions
diff --git a/io/channel-socket.c b/io/channel-socket.c
index 57cfb4d3a6..b50e63a053 100644
--- a/io/channel-socket.c
+++ b/io/channel-socket.c
@@ -685,8 +685,10 @@ qio_channel_socket_close(QIOChannel *ioc,
Error **errp)
{
QIOChannelSocket *sioc = QIO_CHANNEL_SOCKET(ioc);
+ int rc = 0;
if (sioc->fd != -1) {
+ SocketAddress *addr = socket_local_address(sioc->fd, errp);
#ifdef WIN32
WSAEventSelect(sioc->fd, NULL, 0);
#endif
@@ -697,8 +699,22 @@ qio_channel_socket_close(QIOChannel *ioc,
return -1;
}
sioc->fd = -1;
+
+ if (addr && addr->type == SOCKET_ADDRESS_TYPE_UNIX
+ && addr->u.q_unix.path) {
+ if (unlink(addr->u.q_unix.path) < 0 && errno != ENOENT) {
+ error_setg_errno(errp, errno,
+ "Failed to unlink socket %s",
+ addr->u.q_unix.path);
+ rc = -1;
+ }
+ }
+
+ if (addr) {
+ qapi_free_SocketAddress(addr);
+ }
}
- return 0;
+ return rc;
}
static int