diff options
author | Cristian RodrÃguez <crrodriguez@opensuse.org> | 2020-07-29 12:10:08 -0400 |
---|---|---|
committer | Philip Withnall <pwithnall@endlessos.org> | 2020-10-09 09:44:05 +0100 |
commit | 35bb69bc47fecdf54de887a0c29a0889b79663a1 (patch) | |
tree | 35a1d293569ba34753fa6b0d099f4a147c7194ba /gio | |
parent | 6cf381ee75548727a9ebb51c0054aad570767c87 (diff) | |
download | glib-35bb69bc47fecdf54de887a0c29a0889b79663a1.tar.gz |
gsocketclient: set IP_BIND_ADDRESS_NO_PORT if binding to local address
The linux kernel does not know that the socket will be used
for connect or listen and if you bind() to a local address it must
reserve a random port (if port == 0) at bind() time, making very easy
to exhaust the ~32k port range, setting IP_BIND_ADDRESS_NO_PORT tells
the kernel to choose random port at connect() time instead, when the
full 4-tuple is known.
Diffstat (limited to 'gio')
-rw-r--r-- | gio/gsocketclient.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/gio/gsocketclient.c b/gio/gsocketclient.c index c9943309c..ca01b68f4 100644 --- a/gio/gsocketclient.c +++ b/gio/gsocketclient.c @@ -24,6 +24,10 @@ #include "config.h" #include "gsocketclient.h" +#ifndef G_OS_WIN32 +#include <netinet/in.h> +#endif + #include <stdlib.h> #include <string.h> @@ -39,6 +43,7 @@ #include <gio/gioerror.h> #include <gio/gsocket.h> #include <gio/gnetworkaddress.h> +#include <gio/gnetworking.h> #include <gio/gnetworkservice.h> #include <gio/gproxy.h> #include <gio/gproxyresolver.h> @@ -142,6 +147,10 @@ create_socket (GSocketClient *client, if (client->priv->local_address) { +#ifdef IP_BIND_ADDRESS_NO_PORT + g_socket_set_option (socket, IPPROTO_IP, IP_BIND_ADDRESS_NO_PORT, 1, NULL); +#endif + if (!g_socket_bind (socket, client->priv->local_address, FALSE, |