]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
Fix connect() failures in get_interface_address6()
authorSebastian Hahn <sebastian@torproject.org>
Sat, 5 Mar 2011 13:46:32 +0000 (14:46 +0100)
committerSebastian Hahn <sebastian@torproject.org>
Sat, 5 Mar 2011 15:57:05 +0000 (16:57 +0100)
The third argument for connect should be dependent on the address
family. Issue spotted by piebeer who also wrote the patch.

changes/bug2660 [new file with mode: 0644]
src/common/address.c

diff --git a/changes/bug2660 b/changes/bug2660
new file mode 100644 (file)
index 0000000..fe22956
--- /dev/null
@@ -0,0 +1,3 @@
+  o Minor bugfixes:
+    - Fix connect() failures on some platforms (BSD, OS X). Bugfix on
+      0.2.0.3-alpha; fixes bug 2660. Patch by piebeer.
index 0e57528ae87330b1ecf9ecf5067c75d480cdb3ba..90beae0da3890b0fac10a687c0d0149b133b2a74 100644 (file)
@@ -1025,13 +1025,12 @@ get_interface_address6(int severity, sa_family_t family, tor_addr_t *addr)
 {
   int sock=-1, r=-1;
   struct sockaddr_storage my_addr, target_addr;
-  socklen_t my_addr_len;
+  socklen_t addr_len;
 
   tor_assert(addr);
 
   memset(addr, 0, sizeof(tor_addr_t));
   memset(&target_addr, 0, sizeof(target_addr));
-  my_addr_len = (socklen_t)sizeof(my_addr);
   /* Use the "discard" service port */
   ((struct sockaddr_in*)&target_addr)->sin_port = 9;
   /* Don't worry: no packets are sent. We just need to use a real address
@@ -1039,13 +1038,13 @@ get_interface_address6(int severity, sa_family_t family, tor_addr_t *addr)
   if (family == AF_INET6) {
     struct sockaddr_in6 *sin6 = (struct sockaddr_in6*)&target_addr;
     sock = tor_open_socket(PF_INET6,SOCK_DGRAM,IPPROTO_UDP);
-    my_addr_len = (socklen_t)sizeof(struct sockaddr_in6);
+    addr_len = (socklen_t)sizeof(struct sockaddr_in6);
     sin6->sin6_family = AF_INET6;
     S6_ADDR16(sin6->sin6_addr)[0] = htons(0x2002); /* 2002:: */
   } else if (family == AF_INET) {
     struct sockaddr_in *sin = (struct sockaddr_in*)&target_addr;
     sock = tor_open_socket(PF_INET,SOCK_DGRAM,IPPROTO_UDP);
-    my_addr_len = (socklen_t)sizeof(struct sockaddr_in);
+    addr_len = (socklen_t)sizeof(struct sockaddr_in);
     sin->sin_family = AF_INET;
     sin->sin_addr.s_addr = htonl(0x12000001); /* 18.0.0.1 */
   } else {
@@ -1058,14 +1057,13 @@ get_interface_address6(int severity, sa_family_t family, tor_addr_t *addr)
     goto err;
   }
 
-  if (connect(sock,(struct sockaddr *)&target_addr,
-              (socklen_t)sizeof(target_addr))<0) {
+  if (connect(sock,(struct sockaddr *)&target_addr, addr_len) < 0) {
     int e = tor_socket_errno(sock);
     log_fn(severity, LD_NET, "connect() failed: %s", tor_socket_strerror(e));
     goto err;
   }
 
-  if (getsockname(sock,(struct sockaddr*)&my_addr, &my_addr_len)) {
+  if (getsockname(sock,(struct sockaddr*)&my_addr, &addr_len)) {
     int e = tor_socket_errno(sock);
     log_fn(severity, LD_NET, "getsockname() to determine interface failed: %s",
            tor_socket_strerror(e));