summaryrefslogtreecommitdiff
path: root/gio
diff options
context:
space:
mode:
authorCristian Rodríguez <crrodriguez@opensuse.org>2020-07-29 12:10:08 -0400
committerPhilip Withnall <pwithnall@endlessos.org>2020-10-09 09:44:05 +0100
commit35bb69bc47fecdf54de887a0c29a0889b79663a1 (patch)
tree35a1d293569ba34753fa6b0d099f4a147c7194ba /gio
parent6cf381ee75548727a9ebb51c0054aad570767c87 (diff)
downloadglib-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.c9
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,