X-Git-Url: https://jfr.im/git/irc/rqf/shadowircd.git/blobdiff_plain/f06c147c70cf72b40e4ec0ec3b5aca86662beb80..0a2e2a35c89156ee5fc1ad2a65d0e6251bacc70f:/modules/m_links.c?ds=sidebyside diff --git a/modules/m_links.c b/modules/m_links.c index e4a0f88..4998af2 100644 --- a/modules/m_links.c +++ b/modules/m_links.c @@ -21,7 +21,6 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA * - * $Id: m_links.c 254 2005-09-21 23:35:12Z nenolod $ */ #include "stdinc.h" @@ -59,10 +58,8 @@ DECLARE_MODULE_AV1(links, NULL, NULL, links_clist, links_hlist, NULL, "$Revision /* * m_links - LINKS message handler - * parv[0] = sender prefix * parv[1] = servername mask * or - * parv[0] = sender prefix * parv[1] = server to query * parv[2] = servername mask */ @@ -89,6 +86,8 @@ mo_links(struct Client *client_p, struct Client *source_p, int parc, const char if(parc > 2) { + if(strlen(parv[2]) > HOSTLEN) + return 0; if(hunt_server(client_p, source_p, ":%s LINKS %s :%s", 1, parc, parv) != HUNTED_ISME) return 0; @@ -140,19 +139,21 @@ clean_string(char *dest, const unsigned char *src, size_t len) if(dest == NULL || src == NULL) return NULL; - len -= 3; /* allow for worst case, '^A\0' */ - - while (*src && (len > 0)) + while (*src && (len > 1)) { if(*src & 0x80) /* if high bit is set */ { *d++ = '.'; --len; + if(len <= 1) + break; } else if(!IsPrint(*src)) /* if NOT printable */ { *d++ = '^'; --len; + if(len <= 1) + break; *d++ = 0x40 + *src; /* turn it into a printable */ } else