mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-03 15:53:54 -06:00
sockets: check that the named file descriptor is a socket
The SocketAddress struct has an "fd" type, which references the name of a file descriptor passed over the monitor using the "getfd" command. We currently blindly assume the FD is a socket, which can lead to hard to diagnose errors later. This adds an explicit check that the FD is actually a socket to improve the error diagnosis. Reviewed-by: Eric Blake <eblake@redhat.com> Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com> Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
This commit is contained in:
parent
58dc31f1a7
commit
30bdb3c56d
2 changed files with 105 additions and 2 deletions
|
@ -1042,6 +1042,20 @@ fail:
|
|||
return NULL;
|
||||
}
|
||||
|
||||
static int socket_get_fd(const char *fdstr, Error **errp)
|
||||
{
|
||||
int fd = monitor_get_fd(cur_mon, fdstr, errp);
|
||||
if (fd < 0) {
|
||||
return -1;
|
||||
}
|
||||
if (!fd_is_socket(fd)) {
|
||||
error_setg(errp, "File descriptor '%s' is not a socket", fdstr);
|
||||
close(fd);
|
||||
return -1;
|
||||
}
|
||||
return fd;
|
||||
}
|
||||
|
||||
int socket_connect(SocketAddress *addr, Error **errp)
|
||||
{
|
||||
int fd;
|
||||
|
@ -1056,7 +1070,7 @@ int socket_connect(SocketAddress *addr, Error **errp)
|
|||
break;
|
||||
|
||||
case SOCKET_ADDRESS_TYPE_FD:
|
||||
fd = monitor_get_fd(cur_mon, addr->u.fd.str, errp);
|
||||
fd = socket_get_fd(addr->u.fd.str, errp);
|
||||
break;
|
||||
|
||||
case SOCKET_ADDRESS_TYPE_VSOCK:
|
||||
|
@ -1083,7 +1097,7 @@ int socket_listen(SocketAddress *addr, Error **errp)
|
|||
break;
|
||||
|
||||
case SOCKET_ADDRESS_TYPE_FD:
|
||||
fd = monitor_get_fd(cur_mon, addr->u.fd.str, errp);
|
||||
fd = socket_get_fd(addr->u.fd.str, errp);
|
||||
break;
|
||||
|
||||
case SOCKET_ADDRESS_TYPE_VSOCK:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue