--- pen.c	Fri Mar 16 12:22:07 2007
+++ pen.c.dev	Fri Mar 16 12:28:20 2007
@@ -1270,7 +1270,6 @@
 {
 	struct sockaddr_in serv_addr;
 	int upfd;
-	int n;
 	int now = (int)time(NULL);
 	if (debuglevel) debug("Trying server %d at time %d", index, now);
 	if (servers[index].port == 0) {
@@ -1302,15 +1301,17 @@
 	serv_addr.sin_port = htons(servers[index].port);
 	sigaction(SIGALRM, &alrmaction, NULL);
 	alarm(timeout);
-	n = connect(upfd, (struct sockaddr *)&serv_addr, sizeof serv_addr);
-	alarm(0);	/* cancel scheduled timeout, if there is one */
-	if (n == -1) {
+	while (connect(upfd, (struct sockaddr *)&serv_addr, sizeof serv_addr)== -1 && errno != EISCONN) {
+		if (errno != EINTR) {
 		if (servers[index].status == 0)
 			debug("Server %d failed, retry in %d sec: %s", index, blacklist_time, strerror(errno));
 		servers[index].status = (int)time(NULL);
 		close(upfd);
 		return -1;
 	}
+	}
+	alarm(0);	/* cancel scheduled timeout, if there is one */
+
 	if (servers[index].status) {
 		servers[index].status=0;
 		debug("Server %d ok", index);
@@ -2720,6 +2721,11 @@
 	if (!use_kqueue && !use_poll) mainloop_select();
 
 	if (debuglevel) debug("Exiting, cleaning up...");
+
+	free(conns);
+	free(clients);
+	free(servers);
+
 	if (logfp) fclose(logfp);
 	for (i = 0; i < connections_max; i++) {
 		close_conn(i);
