From 6ea1dfc995f386b3a9406c7935642524dc755c51 Mon Sep 17 00:00:00 2001 From: Guus Sliepen Date: Thu, 17 May 2007 19:15:48 +0000 Subject: [PATCH] Port fixes from release 1.0.8. --- NEWS | 6 ++++++ README | 6 +++--- src/connection.c | 5 ++++- src/mingw/device.c | 6 ++++-- src/net_socket.c | 26 +++++++++++++++++++++++--- src/protocol_auth.c | 6 +++--- 6 files changed, 43 insertions(+), 12 deletions(-) diff --git a/NEWS b/NEWS index fc13420f..1183ab76 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,9 @@ +Version 1.0.8 May 16 2007 + + * Fixed some memory and resource leaks. + + * Made network sockets non-blocking under Windows. + Version 1.0.7 Jan 5 2007 * Fixed a bug that caused slow network speeds on Windows. diff --git a/README b/README index d4eb084d..1f523d78 100644 --- a/README +++ b/README @@ -1,7 +1,7 @@ -This is the README file for tinc version 1.0.7. Installation +This is the README file for tinc version 1.0.8. Installation instructions may be found in the INSTALL file. -tinc is Copyright (C) 1998-2006 by: +tinc is Copyright (C) 1998-2007 by: Ivo Timmermans, Guus Sliepen , @@ -55,7 +55,7 @@ should be changed into "Device", and "Device" should be changed into Compatibility ------------- -Version 1.0.7 is compatible with 1.0pre8, 1.0 and later, but not with older +Version 1.0.8 is compatible with 1.0pre8, 1.0 and later, but not with older versions of tinc. diff --git a/src/connection.c b/src/connection.c index b6ce517e..5cd7a747 100644 --- a/src/connection.c +++ b/src/connection.c @@ -1,6 +1,6 @@ /* connection.c -- connection list management - Copyright (C) 2000-2006 Guus Sliepen , + Copyright (C) 2000-2007 Guus Sliepen , 2000-2005 Ivo Timmermans This program is free software; you can redistribute it and/or modify @@ -82,6 +82,9 @@ void free_connection(connection_t *c) if(!c) return; + if(c->name) + free(c->name); + if(c->hostname) free(c->hostname); diff --git a/src/mingw/device.c b/src/mingw/device.c index 6d916ba5..2813a883 100644 --- a/src/mingw/device.c +++ b/src/mingw/device.c @@ -76,18 +76,20 @@ DWORD WINAPI tapreader(void *bla) { sock = socket(ai->ai_family, SOCK_STREAM, IPPROTO_TCP); - freeaddrinfo(ai); - if(sock < 0) { logger(LOG_ERR, _("System call `%s' failed: %s"), "socket", strerror(errno)); + freeaddrinfo(ai); return -1; } if(connect(sock, ai->ai_addr, ai->ai_addrlen)) { logger(LOG_ERR, _("System call `%s' failed: %s"), "connect", strerror(errno)); + freeaddrinfo(ai); return -1; } + freeaddrinfo(ai); + logger(LOG_DEBUG, _("Tap reader running")); /* Read from tap device and send to parent */ diff --git a/src/net_socket.c b/src/net_socket.c index c727d7b2..1b55c942 100644 --- a/src/net_socket.c +++ b/src/net_socket.c @@ -1,7 +1,7 @@ /* net_socket.c -- Handle various kinds of sockets. Copyright (C) 1998-2005 Ivo Timmermans, - 2000-2006 Guus Sliepen + 2000-2007 Guus Sliepen This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -62,6 +62,12 @@ static void configure_tcp(connection_t *c) if(fcntl(c->socket, F_SETFL, flags | O_NONBLOCK) < 0) { logger(LOG_ERR, _("fcntl for %s: %s"), c->hostname, strerror(errno)); } +#elif defined(WIN32) + unsigned long arg = 1; + + if(ioctlsocket(c->socket, FIONBIO, &arg) != 0) { + logger(LOG_ERR, _("ioctlsocket for %s: WSA error %d"), c->hostname, WSAGetLastError()); + } #endif #if defined(SOL_TCP) && defined(TCP_NODELAY) @@ -160,6 +166,16 @@ int setup_vpn_in_socket(const sockaddr_t *sa) return -1; } } +#elif defined(WIN32) + { + unsigned long arg = 1; + if(ioctlsocket(nfd, FIONBIO, &arg) != 0) { + closesocket(nfd); + logger(LOG_ERR, _("Call to `%s' failed: WSA error %d"), "ioctlsocket", + WSAGetLastError()); + return -1; + } + } #endif option = 1; @@ -318,7 +334,11 @@ begin: result = connect(c->socket, &c->address.sa, SALEN(c->address.sa)); if(result == -1) { - if(errno == EINPROGRESS) { + if(errno == EINPROGRESS +#if defined(WIN32) && !defined(O_NONBLOCK) + || WSAGetLastError() == WSAEWOULDBLOCK +#endif + ) { c->status.connecting = true; return; } @@ -403,7 +423,7 @@ void handle_new_meta_connection(int sock, short events, void *data) sockaddrunmap(&sa); c = new_connection(); - c->name = NULL; + c->name = xstrdup(""); c->outcipher = myself->connection->outcipher; c->outdigest = myself->connection->outdigest; c->outmaclength = myself->connection->outmaclength; diff --git a/src/protocol_auth.c b/src/protocol_auth.c index f8a15be8..0efeceb2 100644 --- a/src/protocol_auth.c +++ b/src/protocol_auth.c @@ -1,7 +1,7 @@ /* protocol_auth.c -- handle the meta-protocol, authentication Copyright (C) 1999-2005 Ivo Timmermans, - 2000-2006 Guus Sliepen + 2000-2007 Guus Sliepen This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -68,9 +68,9 @@ bool id_h(connection_t *c) return false; } - /* If we set c->name in advance, make sure we are connected to the right host */ + /* If this is an outgoing connection, make sure we are connected to the right host */ - if(c->name) { + if(c->outgoing) { if(strcmp(c->name, name)) { logger(LOG_ERR, _("Peer %s is %s instead of %s"), c->hostname, name, c->name); -- 2.20.1