[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