Port fixes from release 1.0.8.

This commit is contained in:
Guus Sliepen 2007-05-17 19:15:48 +00:00
parent 3730156165
commit 6ea1dfc995
6 changed files with 43 additions and 12 deletions

6
NEWS
View file

@ -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 Version 1.0.7 Jan 5 2007
* Fixed a bug that caused slow network speeds on Windows. * Fixed a bug that caused slow network speeds on Windows.

6
README
View file

@ -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. instructions may be found in the INSTALL file.
tinc is Copyright (C) 1998-2006 by: tinc is Copyright (C) 1998-2007 by:
Ivo Timmermans, Ivo Timmermans,
Guus Sliepen <guus@tinc-vpn.org>, Guus Sliepen <guus@tinc-vpn.org>,
@ -55,7 +55,7 @@ should be changed into "Device", and "Device" should be changed into
Compatibility 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. versions of tinc.

View file

@ -1,6 +1,6 @@
/* /*
connection.c -- connection list management connection.c -- connection list management
Copyright (C) 2000-2006 Guus Sliepen <guus@tinc-vpn.org>, Copyright (C) 2000-2007 Guus Sliepen <guus@tinc-vpn.org>,
2000-2005 Ivo Timmermans 2000-2005 Ivo Timmermans
This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify
@ -82,6 +82,9 @@ void free_connection(connection_t *c)
if(!c) if(!c)
return; return;
if(c->name)
free(c->name);
if(c->hostname) if(c->hostname)
free(c->hostname); free(c->hostname);

View file

@ -76,18 +76,20 @@ DWORD WINAPI tapreader(void *bla) {
sock = socket(ai->ai_family, SOCK_STREAM, IPPROTO_TCP); sock = socket(ai->ai_family, SOCK_STREAM, IPPROTO_TCP);
freeaddrinfo(ai);
if(sock < 0) { if(sock < 0) {
logger(LOG_ERR, _("System call `%s' failed: %s"), "socket", strerror(errno)); logger(LOG_ERR, _("System call `%s' failed: %s"), "socket", strerror(errno));
freeaddrinfo(ai);
return -1; return -1;
} }
if(connect(sock, ai->ai_addr, ai->ai_addrlen)) { if(connect(sock, ai->ai_addr, ai->ai_addrlen)) {
logger(LOG_ERR, _("System call `%s' failed: %s"), "connect", strerror(errno)); logger(LOG_ERR, _("System call `%s' failed: %s"), "connect", strerror(errno));
freeaddrinfo(ai);
return -1; return -1;
} }
freeaddrinfo(ai);
logger(LOG_DEBUG, _("Tap reader running")); logger(LOG_DEBUG, _("Tap reader running"));
/* Read from tap device and send to parent */ /* Read from tap device and send to parent */

View file

@ -1,7 +1,7 @@
/* /*
net_socket.c -- Handle various kinds of sockets. net_socket.c -- Handle various kinds of sockets.
Copyright (C) 1998-2005 Ivo Timmermans, Copyright (C) 1998-2005 Ivo Timmermans,
2000-2006 Guus Sliepen <guus@tinc-vpn.org> 2000-2007 Guus Sliepen <guus@tinc-vpn.org>
This program is free software; you can redistribute it and/or modify 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 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) { if(fcntl(c->socket, F_SETFL, flags | O_NONBLOCK) < 0) {
logger(LOG_ERR, _("fcntl for %s: %s"), c->hostname, strerror(errno)); 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 #endif
#if defined(SOL_TCP) && defined(TCP_NODELAY) #if defined(SOL_TCP) && defined(TCP_NODELAY)
@ -160,6 +166,16 @@ int setup_vpn_in_socket(const sockaddr_t *sa)
return -1; 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 #endif
option = 1; option = 1;
@ -318,7 +334,11 @@ begin:
result = connect(c->socket, &c->address.sa, SALEN(c->address.sa)); result = connect(c->socket, &c->address.sa, SALEN(c->address.sa));
if(result == -1) { if(result == -1) {
if(errno == EINPROGRESS) { if(errno == EINPROGRESS
#if defined(WIN32) && !defined(O_NONBLOCK)
|| WSAGetLastError() == WSAEWOULDBLOCK
#endif
) {
c->status.connecting = true; c->status.connecting = true;
return; return;
} }
@ -403,7 +423,7 @@ void handle_new_meta_connection(int sock, short events, void *data)
sockaddrunmap(&sa); sockaddrunmap(&sa);
c = new_connection(); c = new_connection();
c->name = NULL; c->name = xstrdup("<unknown>");
c->outcipher = myself->connection->outcipher; c->outcipher = myself->connection->outcipher;
c->outdigest = myself->connection->outdigest; c->outdigest = myself->connection->outdigest;
c->outmaclength = myself->connection->outmaclength; c->outmaclength = myself->connection->outmaclength;

View file

@ -1,7 +1,7 @@
/* /*
protocol_auth.c -- handle the meta-protocol, authentication protocol_auth.c -- handle the meta-protocol, authentication
Copyright (C) 1999-2005 Ivo Timmermans, Copyright (C) 1999-2005 Ivo Timmermans,
2000-2006 Guus Sliepen <guus@tinc-vpn.org> 2000-2007 Guus Sliepen <guus@tinc-vpn.org>
This program is free software; you can redistribute it and/or modify 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 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; 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)) { if(strcmp(c->name, name)) {
logger(LOG_ERR, _("Peer %s is %s instead of %s"), c->hostname, name, logger(LOG_ERR, _("Peer %s is %s instead of %s"), c->hostname, name,
c->name); c->name);