make sure socket is only stored on success (even with subsuqent changes of the code)
authorDaniel Kouřil <kouril@ics.muni.cz>
Thu, 19 Jan 2012 08:25:02 +0000 (08:25 +0000)
committerDaniel Kouřil <kouril@ics.muni.cz>
Thu, 19 Jan 2012 08:25:02 +0000 (08:25 +0000)
emi.canl.canl-c/src/canl.c

index 0e23b16..97e9c5a 100644 (file)
@@ -195,7 +195,7 @@ static int try_connect(glb_ctx *glb_cc, io_handler *io_cc, char *addr,
     struct sockaddr_storage a;
     struct sockaddr_storage *p_a=&a;
     socklen_t a_len;
-    //int  opt;
+    int sock;
     int err = 0;
 
     struct sockaddr_in *p4 = (struct sockaddr_in *)p_a;
@@ -215,23 +215,24 @@ static int try_connect(glb_ctx *glb_cc, io_handler *io_cc, char *addr,
             a_len = sizeof (struct sockaddr_in6);
             break;
         default:
-            return EINVAL;
+            return set_error(glb_cc, EINVAL, posix_error,
+                           "Unsupported address type (%d)", addrtype);
             break;
     }
     
-    io_cc->sock = socket(a.ss_family, SOCK_STREAM, 0);
-    if (io_cc->sock == -1)
-        return errno;
+    sock = socket(a.ss_family, SOCK_STREAM, 0);
+    if (sock == -1)
+        return set_error(glb_cc, errno, posix_error,
+                        "Failed to create network socket");
 
-    err = connect(io_cc->sock,(struct sockaddr *) &a, a_len);
+    err = connect(sock,(struct sockaddr *) &a, a_len);
     /* XXX timeouts missing */
     if (err) {
-        close(io_cc->sock);
-        io_cc->sock = -1;
         return set_error(glb_cc, errno, posix_error,
                         "Failed to open network connection");
     }
 
+    io_cc->sock = sock;
     return 0;
 }