From 1332a0ef97f5b6b224873ab77ec2cebb524db494 Mon Sep 17 00:00:00 2001 From: JD Horelick Date: Tue, 2 Mar 2010 20:49:51 -0500 Subject: [PATCH] Make +p expiry more robust --- include/client.h | 2 ++ src/client.c | 6 ++++++ src/s_user.c | 15 ++++++++++++--- 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/include/client.h b/include/client.h index c74af9d..38a0ca9 100644 --- a/include/client.h +++ b/include/client.h @@ -281,6 +281,8 @@ struct LocalUser struct ev_entry *event; /* used for associated events */ struct PrivilegeSet *privset; /* privset... */ + + struct rb_event_t *override_timeout_event; }; struct PreClient diff --git a/src/client.c b/src/client.c index b3f33c3..cad1b7f 100644 --- a/src/client.c +++ b/src/client.c @@ -232,6 +232,12 @@ free_local_client(struct Client *client_p) } rb_free(client_p->localClient->auth_user); + + if(client_p->localClient->override_timeout_event) + { + rb_event_delete(client_p->localClient->override_timeout_event); + } + rb_free(client_p->localClient->challenge); rb_free(client_p->localClient->fullcaps); rb_free(client_p->localClient->opername); diff --git a/src/s_user.c b/src/s_user.c index 345c7c5..2d5f62e 100644 --- a/src/s_user.c +++ b/src/s_user.c @@ -910,6 +910,7 @@ expire_umode_p(void *data) { struct Client *source_p = data; char *parv[4] = {source_p->name, source_p->name, "-p", NULL}; + source_p->localClient->override_timeout_event = NULL; user_mode(source_p, source_p, 3, parv); } @@ -987,9 +988,17 @@ user_mode(struct Client *client_p, struct Client *source_p, int parc, const char sendto_one_numeric(source_p, RPL_SNOMASK, form_str(RPL_SNOMASK), construct_snobuf(source_p->snomask)); - /* If we're setting +p, expire it */ - if(ConfigFileEntry.expire_override_time && (source_p->umodes & ~setflags) & UMODE_OVERRIDE) - rb_event_addonce("expire_override", expire_umode_p, source_p, ConfigFileEntry.expire_override_time); + /* If we're setting +p, expire it, but only from local clients */ + if(ConfigFileEntry.expire_override_time && MyClient(source_p) && (source_p->umodes & ~setflags) & UMODE_OVERRIDE) + { + source_p->localClient->override_timeout_event = + rb_event_addonce("expire_override", expire_umode_p, source_p, ConfigFileEntry.expire_override_time); + } + else if(MyClient(source_p) && source_p->localClient->override_timeout_event && (setflags & ~source_p->umodes) & UMODE_OVERRIDE) + { + rb_event_delete(source_p->localClient->override_timeout_event); + source_p->localClient->override_timeout_event = NULL; + } return 0; }