From fa6bac6ec38a5a2308bcd496a5dd6df388da6380 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Thu, 31 May 2012 14:16:59 +0200 Subject: [PATCH] BUG/MEDIUM: register peer sync handler in the proper order MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. --- src/peers.c | 4 ++-- src/stream_interface.c | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/peers.c b/src/peers.c index 0ab2e5221..a4ea915e5 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 ceed60274..5f7ac3dc6 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) {