Mark Pizzolato <m...@infocomm.com> writes:

> Public bug reported:
>
> On any host platform where SOCK_CLOEXEC is defined (Linux at least), a
> socket is leaked on each call to qemu_socket() AND the socket returned
> hasn't been created with the desired SOCK_CLOEXEC attribute.  The
> qemu_socket routine is:
>
> Line 272 of util/osdep.c:
> /*
>  * Opens a socket with FD_CLOEXEC set
>  */
> int qemu_socket(int domain, int type, int protocol)
> {
>     int ret;
>
> #ifdef SOCK_CLOEXEC
>     ret = socket(domain, type | SOCK_CLOEXEC, protocol);
>     if (ret != -1 || errno != EINVAL) {
>         return ret;

If socket() succeeded (ret != -1), we return the socket.

If socket() failed with anything but EINVAL (ret == -1 && errno !=
EINVAL), we return -1 with errno set.

>     }

Here, ret == -1 && errno == EINVAL.

> #endif
>     ret = socket(domain, type, protocol);
>     if (ret >= 0) {
>         qemu_set_cloexec(ret);
>     }
>
>     return ret;
> }

How can this leak a socket?

How can this return a socket with FD_CLOEXEC not set?

Reply via email to