[ekg2-commit] r4235 - trunk/ekg: trunk/ekg/net.c

SVN commit svn w toxygen.net
Pią, 8 Sie 2008, 15:42:49 CEST


Author: peres
Date: 2008-08-08 15:42:48 +0200 (Fri, 08 Aug 2008)
New Revision: 4235

Modified:
   trunk/ekg/net.c
Log:

Fix segv when aborted connection handler is called.



Modified: trunk/ekg/net.c
===================================================================
--- trunk/ekg/net.c	2008-08-08 13:00:21 UTC (rev 4234)
+++ trunk/ekg/net.c	2008-08-08 13:42:48 UTC (rev 4235)
@@ -364,19 +364,25 @@
 
 static WATCHER_LINE(ekg_connect_resolver_handler) {
 	struct ekg_connect_data *c = (struct ekg_connect_data*) data;
+	session_t *s;
+	int abort;
 
-	if (!data)
+	if (!c)
 		return -1;
+	abort = (!((s = session_find(c->session))) || !(s->connecting));
 
 	if (type) {
-		debug_function("ekg_connect_resolver_handler(), resolving done.\n");
-		if (c->prefer_comparison)
-			qsort(c->connect_queue, array_count(c->connect_queue), sizeof(char*),
-					(void*) c->prefer_comparison);
+		if (!abort) {
+			debug_function("ekg_connect_resolver_handler(), resolving done.\n");
+			if (c->prefer_comparison)
+				qsort(c->connect_queue, array_count(c->connect_queue), sizeof(char*),
+						(void*) c->prefer_comparison);
+		}
 		ekg_connect_loop(c);
 		close(fd);
 		return -1;
-	}
+	} else if (abort)
+		return -1;
 
 	debug_function("ekg_connect_resolver_handler() = %s\n", watch);
 
@@ -461,24 +467,33 @@
 	int res = 0; 
 	socklen_t res_size = sizeof(res);
 	session_t *s;
+	int abort;
 	
 	if (!c)
 		return -1;
-	
+
 	debug_function("ekg_connect_handler(), type = %d.\n", type);
 
+	s = session_find(c->session);
+	abort = (!((s = session_find(c->session))) || !(s->connecting));
+
 	if (type == 1)
 		return 0;
+	else if (abort) {
+		ekg_connect_loop(c);
+		close(fd);
+		return -1;
+	}
 
 	if (type || getsockopt(fd, SOL_SOCKET, SO_ERROR, &res, &res_size) || res) {
 		if (res)
 			debug_error("ekg_connect_handler(), error: %s\n", strerror(res));
 		ekg_connect_loop(c);
 		close(fd);
+
+		return -1;
 	} 
-	
-	s = session_find(c->session);
-	
+
 	if (s && c->async(type, fd, WATCH_WRITE, s) > 0) {
 		debug_error("ekg_connect_handler(), looks like caller didn't like our job.\n");
 		ekg_connect_loop(c);
@@ -493,8 +508,9 @@
 	char *host;
 	session_t *s = session_find(c->session);
 
-	if (!s) { /* session vanished! */
-		debug_error("ekg_connect_loop(), looks like session '%s' vanished!\n", c->session);
+	if (!s || !(s->connecting)) { /* session vanished! */
+		debug_error("ekg_connect_loop(), looks like%s session '%s' vanished!\n",
+				s ? " connecting on" : "", c->session);
 		ekg_connect_data_free(c);
 		return 0;
 	}



Więcej informacji o liście dyskusyjnej ekg2-commit