do_outgoing_connection() may delete a failed connection, and the structure

must not be accessed afterwards.
This commit is contained in:
Sven-Haegar Koch 2011-05-29 21:53:21 +02:00 committed by Guus Sliepen
parent 82109868b5
commit 04de15984f
2 changed files with 10 additions and 10 deletions

View file

@ -127,7 +127,7 @@ extern int contradicting_del_edge;
extern void retry_outgoing(outgoing_t *); extern void retry_outgoing(outgoing_t *);
extern void handle_incoming_vpn_data(int, short, void *); extern void handle_incoming_vpn_data(int, short, void *);
extern void finish_connecting(struct connection_t *); extern void finish_connecting(struct connection_t *);
extern void do_outgoing_connection(struct connection_t *); extern bool do_outgoing_connection(struct connection_t *);
extern void handle_new_meta_connection(int, short, void *); extern void handle_new_meta_connection(int, short, void *);
extern int setup_listen_socket(const sockaddr_t *); extern int setup_listen_socket(const sockaddr_t *);
extern int setup_vpn_in_socket(const sockaddr_t *); extern int setup_vpn_in_socket(const sockaddr_t *);

View file

@ -350,7 +350,7 @@ void finish_connecting(connection_t *c) {
send_id(c); send_id(c);
} }
void do_outgoing_connection(connection_t *c) { bool do_outgoing_connection(connection_t *c) {
char *address, *port, *space; char *address, *port, *space;
int result; int result;
@ -367,7 +367,7 @@ begin:
retry_outgoing(c->outgoing); retry_outgoing(c->outgoing);
c->outgoing = NULL; c->outgoing = NULL;
connection_del(c); connection_del(c);
return; return false;
} }
get_config_string(c->outgoing->cfg, &address); get_config_string(c->outgoing->cfg, &address);
@ -434,7 +434,7 @@ begin:
if(result == -1) { if(result == -1) {
if(sockinprogress(sockerrno)) { if(sockinprogress(sockerrno)) {
c->status.connecting = true; c->status.connecting = true;
return; return true;
} }
closesocket(c->socket); closesocket(c->socket);
@ -446,7 +446,7 @@ begin:
finish_connecting(c); finish_connecting(c);
return; return true;
} }
static void handle_meta_write(int sock, short events, void *data) { static void handle_meta_write(int sock, short events, void *data) {
@ -512,11 +512,11 @@ void setup_outgoing_connection(outgoing_t *outgoing) {
connection_add(c); connection_add(c);
do_outgoing_connection(c); if (do_outgoing_connection(c)) {
event_set(&c->inevent, c->socket, EV_READ | EV_PERSIST, handle_meta_connection_data, c);
event_set(&c->inevent, c->socket, EV_READ | EV_PERSIST, handle_meta_connection_data, c); event_set(&c->outevent, c->socket, EV_WRITE | EV_PERSIST, handle_meta_write, c);
event_set(&c->outevent, c->socket, EV_WRITE | EV_PERSIST, handle_meta_write, c); event_add(&c->inevent, NULL);
event_add(&c->inevent, NULL); }
} }
/* /*