]> jfr.im git - irc/quakenet/snircd-patchqueue.git/blob - iauthcrashfix.patch
Remove topic_reveal.patch. This has been fixed in IRCU and ircu patch is correct...
[irc/quakenet/snircd-patchqueue.git] / iauthcrashfix.patch
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);