X-Git-Url: https://jfr.im/git/irc/quakenet/snircd.git/blobdiff_plain/052b069e1613393c208fa736c856d62601dc6f99..9f8856e99d8fe297de1ddf0cff73dc2ff4900c60:/ircd/m_silence.c diff --git a/ircd/m_silence.c b/ircd/m_silence.c index 925005b..46d6dc5 100644 --- a/ircd/m_silence.c +++ b/ircd/m_silence.c @@ -22,7 +22,7 @@ */ /** @file * @brief Handlers for SILENCE command. - * @version $Id: m_silence.c,v 1.11 2005/04/22 23:36:31 entrope Exp $ + * @version $Id: m_silence.c,v 1.11.2.1 2006/02/22 21:35:39 entrope Exp $ */ #include "config.h" @@ -64,6 +64,7 @@ apply_silence(struct Client *sptr, char *mask) { struct Ban *sile; int flags; + char orig_mask[NICKLEN+USERLEN+HOSTLEN+3]; assert(mask && mask[0]); @@ -83,9 +84,22 @@ apply_silence(struct Client *sptr, char *mask) mask++; } - /* Make the silence, set flags, and apply it. */ + /* Make the silence and set additional flags. */ + ircd_strncpy(orig_mask, mask, sizeof(orig_mask) - 1); sile = make_ban(pretty_mask(mask)); sile->flags |= flags; + + /* If they're a local user trying to ban too broad a mask, forbid it. */ + if (MyUser(sptr) + && (sile->flags & BAN_IPMASK) + && sile->addrbits > 0 + && sile->addrbits < (irc_in_addr_is_ipv4(&sile->address) ? 112 : 32)) { + send_reply(sptr, ERR_MASKTOOWIDE, orig_mask); + free_ban(sile); + return NULL; + } + + /* Apply it to the silence list. */ return apply_ban(&cli_user(sptr)->silence, sile, 1) ? NULL : sile; }