cURL / Mailing Lists / curl-library / Single Mail

curl-library

[PATCH 03/11] lib/connect: restrict IP/TCP options to said sockets

From: Peter Wu <peter_at_lekensteyn.nl>
Date: Thu, 27 Nov 2014 23:59:18 +0100

This patch prepares for adding UNIX domain sockets support.

TCP_NODELAY and TCP_KEEPALIVE are specific to TCP/IP sockets, so do not
apply these to other socket types. bindlocal only works for IP sockets
(independent of TCP/UDP), so filter that out too for other types.

Signed-off-by: Peter Wu <peter_at_lekensteyn.nl>

---
 lib/connect.c | 26 +++++++++++++++-----------
 1 file changed, 15 insertions(+), 11 deletions(-)
diff --git a/lib/connect.c b/lib/connect.c
index 3be4918..25d2103 100644
--- a/lib/connect.c
+++ b/lib/connect.c
@@ -991,6 +991,7 @@ static CURLcode singleipconnect(struct connectdata *conn,
   CURLcode result;
   char ipaddress[MAX_IPADR_LEN];
   long port;
+  bool is_tcp;
 
   *sockp = CURL_SOCKET_BAD;
 
@@ -1013,14 +1014,16 @@ static CURLcode singleipconnect(struct connectdata *conn,
   }
   infof(data, "  Trying %s...\n", ipaddress);
 
-  if(data->set.tcp_nodelay)
+  is_tcp = (addr.family == AF_INET || addr.family == AF_INET6) &&
+           addr.socktype == SOCK_STREAM;
+  if(is_tcp && data->set.tcp_nodelay)
     tcpnodelay(conn, sockfd);
 
   nosigpipe(conn, sockfd);
 
   Curl_sndbufset(sockfd);
 
-  if(data->set.tcp_keepalive)
+  if(is_tcp && data->set.tcp_keepalive)
     tcpkeepalive(data, sockfd);
 
   if(data->set.fsockopt) {
@@ -1038,16 +1041,17 @@ static CURLcode singleipconnect(struct connectdata *conn,
   }
 
   /* possibly bind the local end to an IP, interface or port */
-  result = bindlocal(conn, sockfd, addr.family);
-  if(result) {
-    Curl_closesocket(conn, sockfd); /* close socket and bail out */
-    if(result == CURLE_UNSUPPORTED_PROTOCOL) {
-      /* The address family is not supported on this interface.
-         We can continue trying addresses */
-      return CURLE_OK;
+  if(addr.family == AF_INET || addr.family == AF_INET6) {
+    result = bindlocal(conn, sockfd, addr.family);
+    if(result) {
+      Curl_closesocket(conn, sockfd); /* close socket and bail out */
+      if(result == CURLE_UNSUPPORTED_PROTOCOL) {
+        /* The address family is not supported on this interface.
+           We can continue trying addresses */
+        return CURLE_OK;
+      }
+      return result;
     }
-
-    return result;
   }
 
   /* set socket non-blocking */
-- 
2.1.3
-------------------------------------------------------------------
List admin: http://cool.haxx.se/list/listinfo/curl-library
Etiquette:  http://curl.haxx.se/mail/etiquette.html
Received on 2014-11-28