From 35bb69bc47fecdf54de887a0c29a0889b79663a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cristian=20Rodr=C3=ADguez?= Date: Wed, 29 Jul 2020 12:10:08 -0400 Subject: [PATCH] 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. --- gio/gsocketclient.c | 9 +++++++++ 1 file changed, 9 insertions(+) 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 +#endif + #include #include @@ -39,6 +43,7 @@ #include #include #include +#include #include #include #include @@ -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,