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.
This commit is contained in:
Willy Tarreau 2012-05-31 14:16:59 +02:00
parent ab152a7eda
commit fa6bac6ec3
2 changed files with 4 additions and 3 deletions

View File

@ -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;

View File

@ -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)
{