]>
Commit | Line | Data |
---|---|---|
5830bd73 P |
1 | # HG changeset patch |
2 | # Parent 361add28fb771d38bd2ac10e3d00a3bc313084d8 | |
3 | diff -r 361add28fb77 -r a0c624d688df ircd/s_auth.c | |
4 | --- a/ircd/s_auth.c Mon Jul 08 12:35:53 2013 +0200 | |
5 | +++ b/ircd/s_auth.c Mon Jul 08 16:31:30 2013 +0200 | |
6 | @@ -204,6 +204,8 @@ | |
7 | ||
8 | /** Active instance of IAuth. */ | |
9 | static struct IAuth *iauth; | |
10 | +/** IAuth respawn timer. */ | |
11 | +static struct Timer iauth_spawn_timer; | |
12 | /** Freelist of AuthRequest structures. */ | |
13 | static struct AuthRequest *auth_freelist; | |
14 | ||
15 | @@ -2266,6 +2268,18 @@ | |
16 | memcpy(iauth->i_buffer, sol, iauth->i_count); | |
17 | } | |
18 | ||
19 | +static void iauth_spawn_callback(struct Event *ev) | |
20 | +{ | |
21 | + struct IAuth *iauth; | |
22 | + | |
23 | + assert(0 != ev_timer(ev)); | |
24 | + assert(0 != t_data(ev_timer(ev))); | |
25 | + | |
26 | + iauth = (struct IAuth*) t_data(ev_timer(ev)); | |
27 | + | |
28 | + iauth_do_spawn(iauth, 1); | |
29 | +} | |
30 | + | |
31 | /** Handle socket activity for an %IAuth connection. | |
32 | * @param[in] ev &Socket event; the IAuth connection is the user data | |
33 | * pointer for the socket. | |
34 | @@ -2281,8 +2295,13 @@ | |
35 | switch (ev_type(ev)) { | |
36 | case ET_DESTROY: | |
37 | /* Hm, what happened here? */ | |
38 | - if (!IAuthHas(iauth, IAUTH_CLOSING)) | |
39 | - iauth_do_spawn(iauth, 1); | |
40 | + if (!IAuthHas(iauth, IAUTH_CLOSING)) { | |
41 | + /* We must not respawn the IAuth instance right here because this callback | |
42 | + * function may have been called by iauth_disconnect() - which would garble our | |
43 | + * IAuth sockets once we return from this function. */ | |
44 | + timer_add(timer_init(&iauth_spawn_timer), iauth_spawn_callback, (void *)iauth, | |
45 | + TT_RELATIVE, 1); | |
46 | + } | |
47 | break; | |
48 | case ET_READ: | |
49 | iauth_read(iauth); |