[glib: 1/2] gsocketclient: set IP_BIND_ADDRESS_NO_PORT if binding to local address




commit 35bb69bc47fecdf54de887a0c29a0889b79663a1
Author: Cristian Rodríguez <crrodriguez opensuse org>
Date:   Wed Jul 29 12:10:08 2020 -0400

    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 <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,


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]