From: Willy Tarreau Date: Thu, 31 May 2012 12:16:59 +0000 (+0200) Subject: BUG/MEDIUM: register peer sync handler in the proper order X-Git-Tag: v1.5-dev12~162 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=fa6bac6ec38a5a2308bcd496a5dd6df388da6380;p=thirdparty%2Fhaproxy.git BUG/MEDIUM: register peer sync handler in the proper order Hervé Commowick reported a failure to resync upon restart caused by a segfault on the old process. This is due to the data_ctx of the connection being initialized after the stream interface. --- diff --git a/src/peers.c b/src/peers.c index 0ab2e5221a..a4ea915e52 100644 --- a/src/peers.c +++ b/src/peers.c @@ -1162,10 +1162,10 @@ static struct session *peer_session_create(struct peer *peer, struct peer_sessio s->si[0].flags = SI_FL_NONE; if (s->fe->options2 & PR_O2_INDEPSTR) s->si[0].flags |= SI_FL_INDEP_STR; - s->si[0].conn.data_ctx = (void *)ps; - s->si[0].applet.st0 = PEER_SESSION_CONNECT; stream_int_register_handler(&s->si[0], &peer_applet); + s->si[0].applet.st0 = PEER_SESSION_CONNECT; + s->si[0].conn.data_ctx = (void *)ps; s->si[1].conn.t.sock.fd = -1; /* just to help with debugging */ s->si[1].owner = t; diff --git a/src/stream_interface.c b/src/stream_interface.c index ceed602743..5f7ac3dc6e 100644 --- a/src/stream_interface.c +++ b/src/stream_interface.c @@ -336,7 +336,8 @@ static void stream_int_chk_snd(struct stream_interface *si) * it is solicited. The task's processing function must call the applet's * function before returning. It must be deleted by the task handler using * stream_int_unregister_handler(), possibly from within the function itself. - * It also pre-initializes applet.state to zero. + * It also pre-initializes applet.state to zero and the connection context + * to NULL. */ struct task *stream_int_register_handler(struct stream_interface *si, struct si_applet *app) {