diff --git a/ChangeLog b/ChangeLog index efd2a2ee..d1ad95c0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +jilles 2007/03/05 01:14:46 UTC (20070305-3227) + Log: + Fix some cases where the size argument to strlcpy() + for usernames and hostnames is 1 too small. + + + Changes: Modified: + +1 -1 trunk/modules/m_chghost.c (File Modified) + +2 -2 trunk/src/res.c (File Modified) + +2 -2 trunk/src/s_user.c (File Modified) + + jilles 2007/03/04 23:42:55 UTC (20070304-3225) Log: Cut down quit/part/kick reasons to avoid quit reasons diff --git a/include/serno.h b/include/serno.h index 3b441078..536ffa39 100644 --- a/include/serno.h +++ b/include/serno.h @@ -1 +1 @@ -#define SERNO "20070304-3225" +#define SERNO "20070305-3227" diff --git a/libcharybdis/commio.c b/libcharybdis/commio.c index 1813d20b..c30322d5 100644 --- a/libcharybdis/commio.c +++ b/libcharybdis/commio.c @@ -21,7 +21,7 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA * - * $Id: commio.c 1779 2006-07-30 16:36:39Z jilles $ + * $Id: commio.c 3229 2007-03-05 17:23:07Z nenolod $ */ #include "libcharybdis.h" @@ -43,7 +43,8 @@ static const char *comm_err_str[] = { "Comm OK", "Error during bind()", "Comm Error" }; -fde_t *fd_table = NULL; +#define FD_HASH_SIZE 128 +static dlink_list fd_table[FD_HASH_SIZE]; static void fdlist_update_biggest(int fd, int opening); @@ -56,9 +57,60 @@ static PF comm_connect_timeout; static void comm_connect_dns_callback(void *vptr, struct DNSReply *reply); static PF comm_connect_tryconnect; +inline fde_t * +comm_locate_fd(int fd) +{ + int bucket = fd % FD_HASH_SIZE; + dlink_list *list = &fd_table[bucket]; + dlink_node *n; + + DLINK_FOREACH(n, list->head) + { + fde_t *F = (fde_t *) n->data; + + if (F->fd == fd) + return F; + } + + return NULL; +} + +inline fde_t * +comm_add_fd(int fd) +{ + fde_t *F = comm_locate_fd(fd); + dlink_list *list; + + if (F != NULL) + return F; + + F = calloc(sizeof(fde_t), 1); + F->fd = fd; + list = &fd_table[fd % FD_HASH_SIZE]; + dlinkAdd(F, &F->node, list); + + return F; +} + +inline void +comm_remove_fd(int fd) +{ + int bucket = fd % FD_HASH_SIZE; + fde_t *F; + dlink_list *list = &fd_table[bucket]; + + F = comm_locate_fd(fd); + if (F == NULL) + return; + + dlinkDelete(&F->node, list); + MyFree(F); +} + /* 32bit solaris is kinda slow and stdio only supports fds < 256 * so we got to do this crap below. * (BTW Fuck you Sun, I hate your guts and I hope you go bankrupt soon) + * XXX: this is no longer needed in Solaris 10. --nenolod */ #if defined (__SVR4) && defined (__sun) static void comm_fd_hack(int *fd) @@ -93,7 +145,9 @@ comm_close_all(void) for (i = 4; i < MAXCONNECTIONS; ++i) { - if(fd_table[i].flags.open) + fde_t *F = comm_locate_fd(i); + + if(F != NULL && F->flags.open) comm_close(i); else close(i); @@ -168,13 +222,16 @@ comm_set_nb(int fd) { int nonb = 0; int res; + fde_t *F = comm_locate_fd(fd); nonb |= O_NONBLOCK; res = fcntl(fd, F_GETFL, 0); if(-1 == res || fcntl(fd, F_SETFL, res | nonb) == -1) return 0; - fd_table[fd].flags.nonblocking = 1; + if (F != NULL) + F->flags.nonblocking = 1; + return 1; } @@ -217,7 +274,7 @@ comm_settimeout(int fd, time_t timeout, PF * callback, void *cbdata) { fde_t *F; s_assert(fd >= 0); - F = &fd_table[fd]; + F = comm_locate_fd(fd); s_assert(F->flags.open); F->timeout = CurrentTime + (timeout / 1000); @@ -241,7 +298,7 @@ comm_setflush(int fd, time_t timeout, PF * callback, void *cbdata) { fde_t *F; s_assert(fd >= 0); - F = &fd_table[fd]; + F = comm_locate_fd(fd); s_assert(F->flags.open); F->flush_timeout = CurrentTime + (timeout / 1000); @@ -266,7 +323,9 @@ comm_checktimeouts(void *notused) fde_t *F; for (fd = 0; fd <= highest_fd; fd++) { - F = &fd_table[fd]; + F = comm_locate_fd(fd); + if(F == NULL) + continue; if(!F->flags.open) continue; if(F->flags.closing) @@ -316,7 +375,7 @@ comm_connect_tcp(int fd, const char *host, u_short port, void *ipptr = NULL; fde_t *F; s_assert(fd >= 0); - F = &fd_table[fd]; + F = comm_locate_fd(fd); F->flags.called_connect = 1; s_assert(callback); F->connect.callback = callback; @@ -388,10 +447,12 @@ static void comm_connect_callback(int fd, int status) { CNCB *hdl; - fde_t *F = &fd_table[fd]; + fde_t *F = comm_locate_fd(fd); + /* This check is gross..but probably necessary */ - if(F->connect.callback == NULL) + if(F == NULL || F->connect.callback == NULL) return; + /* Clear the connect flag + handler */ hdl = F->connect.callback; F->connect.callback = NULL; @@ -473,13 +534,13 @@ static void comm_connect_tryconnect(int fd, void *notused) { int retval; - fde_t *F = &fd_table[fd]; + fde_t *F = comm_locate_fd(fd); if(F->connect.callback == NULL) return; /* Try the connect() */ - retval = connect(fd, (struct sockaddr *) &fd_table[fd].connect.hostaddr, - GET_SS_LEN(fd_table[fd].connect.hostaddr)); + retval = connect(fd, (struct sockaddr *) &F->connect.hostaddr, + GET_SS_LEN(F->connect.hostaddr)); /* Error? */ if(retval < 0) { @@ -667,7 +728,7 @@ fdlist_update_biggest(int fd, int opening) * re-opening it */ s_assert(!opening); - while (highest_fd >= 0 && !fd_table[highest_fd].flags.open) + while (highest_fd >= 0 && comm_locate_fd(fd)->flags.open) /* XXX */ highest_fd--; } @@ -679,8 +740,7 @@ fdlist_init(void) if(!initialized) { - /* Since we're doing this once .. */ - fd_table = MyMalloc((MAXCONNECTIONS + 1) * sizeof(fde_t)); + memset(&fd_table, '\0', sizeof(dlink_list) * FD_HASH_SIZE); initialized = 1; } } @@ -689,7 +749,7 @@ fdlist_init(void) void comm_open(int fd, unsigned int type, const char *desc) { - fde_t *F = &fd_table[fd]; + fde_t *F = comm_add_fd(fd); s_assert(fd >= 0); if(F->flags.open) @@ -718,7 +778,7 @@ comm_open(int fd, unsigned int type, const char *desc) void comm_close(int fd) { - fde_t *F = &fd_table[fd]; + fde_t *F = comm_locate_fd(fd); s_assert(F->flags.open); /* All disk fd's MUST go through file_close() ! */ s_assert(F->type != FD_FILE); @@ -740,13 +800,13 @@ comm_close(int fd) F->flags.open = 0; fdlist_update_biggest(fd, 0); number_fd--; - memset(F, '\0', sizeof(fde_t)); + comm_remove_fd(fd); + F->timeout = 0; /* Unlike squid, we're actually closing the FD here! -- adrian */ close(fd); } - /* * comm_dump() - dump the list of active filedescriptors */ @@ -755,14 +815,24 @@ comm_dump(struct Client *source_p) { int i; - for (i = 0; i <= highest_fd; i++) + for (i = 0; i <= FD_HASH_SIZE; i++) { - if(!fd_table[i].flags.open) + dlink_node *n; + + if (dlink_list_length(&fd_table[i]) <= 0) continue; - sendto_one_numeric(source_p, RPL_STATSDEBUG, - "F :fd %-3d desc '%s'", - i, fd_table[i].desc); + DLINK_FOREACH(n, fd_table[i].head) + { + fde_t *F = (fde_t *) n->data; + + if(F == NULL || !F->flags.open) + continue; + + sendto_one_numeric(source_p, RPL_STATSDEBUG, + "F :fd %-3d bucket %-3d desc '%s'", + F->fd, i, F->desc); + } } } @@ -776,15 +846,16 @@ void comm_note(int fd, const char *format, ...) { va_list args; + fde_t *F = comm_add_fd(fd); /* XXX: epoll, kqueue. */ if(format) { va_start(args, format); - ircvsnprintf(fd_table[fd].desc, FD_DESC_SZ, format, args); + ircvsnprintf(F->desc, FD_DESC_SZ, format, args); va_end(args); } else - fd_table[fd].desc[0] = '\0'; + F->desc[0] = '\0'; } diff --git a/libcharybdis/commio.h b/libcharybdis/commio.h index 49aec911..c8d44d4c 100644 --- a/libcharybdis/commio.h +++ b/libcharybdis/commio.h @@ -21,7 +21,7 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA * - * $Id: commio.h 1757 2006-07-25 23:34:45Z jilles $ + * $Id: commio.h 3229 2007-03-05 17:23:07Z nenolod $ */ #ifndef INCLUDED_commio_h @@ -30,6 +30,7 @@ #include "setup.h" #include "config.h" #include "ircd_defs.h" +#include "tools.h" /* Callback for completed IO events */ typedef void PF(int fd, void *); @@ -128,11 +129,10 @@ struct _fde } connect; int pflags; + dlink_node node; }; -extern fde_t *fd_table; - void fdlist_init(void); extern void comm_open(int, unsigned int, const char *); @@ -188,5 +188,6 @@ extern void mangle_mapped_sockaddr(struct sockaddr *in); #define mangle_mapped_sockaddr(x) #endif +extern fde_t *comm_locate_fd(int fd); #endif /* INCLUDED_commio_h */ diff --git a/libcharybdis/devpoll.c b/libcharybdis/devpoll.c index 64d9f08c..e8934bad 100644 --- a/libcharybdis/devpoll.c +++ b/libcharybdis/devpoll.c @@ -22,7 +22,7 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA * - * $Id: devpoll.c 390 2005-12-07 18:46:56Z nenolod $ + * $Id: devpoll.c 3229 2007-03-05 17:23:07Z nenolod $ */ #include "config.h" @@ -77,24 +77,26 @@ devpoll_update_events(int fd, short filter, PF * handler) int cur_mask = fdmask[fd]; PF *cur_handler; fdmask[fd] = 0; + fde_t *F = comm_locate_fd(fd); + switch (filter) { case COMM_SELECT_READ: - cur_handler = fd_table[fd].read_handler; + cur_handler = F->read_handler; if(handler) fdmask[fd] |= POLLRDNORM; else fdmask[fd] &= ~POLLRDNORM; - if(fd_table[fd].write_handler) + if(F->write_handler) fdmask[fd] |= POLLWRNORM; break; case COMM_SELECT_WRITE: - cur_handler = fd_table[fd].write_handler; + cur_handler = F->write_handler; if(handler) fdmask[fd] |= POLLWRNORM; else fdmask[fd] &= ~POLLWRNORM; - if(fd_table[fd].read_handler) + if(F->read_handler) fdmask[fd] |= POLLRDNORM; break; default: @@ -166,7 +168,7 @@ void comm_setselect(int fd, fdlist_t list, unsigned int type, PF * handler, void *client_data, time_t timeout) { - fde_t *F = &fd_table[fd]; + fde_t *F = comm_locate_fd(fd); s_assert(fd >= 0); s_assert(F->flags.open); @@ -235,7 +237,7 @@ comm_select(unsigned long delay) { int fd = dopoll.dp_fds[i].fd; PF *hdl = NULL; - fde_t *F = &fd_table[fd]; + fde_t *F = comm_locate_fd(fd); if((dopoll.dp_fds[i]. revents & (POLLRDNORM | POLLIN | POLLHUP | POLLERR)) diff --git a/libcharybdis/epoll.c b/libcharybdis/epoll.c index 4435c51f..45335f8d 100644 --- a/libcharybdis/epoll.c +++ b/libcharybdis/epoll.c @@ -23,7 +23,7 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA * - * $Id: epoll.c 390 2005-12-07 18:46:56Z nenolod $ + * $Id: epoll.c 3229 2007-03-05 17:23:07Z nenolod $ */ #include "config.h" @@ -80,7 +80,7 @@ comm_setselect(int fd, fdlist_t list, unsigned int type, PF * handler, void *client_data, time_t timeout) { struct epoll_event ep_event; - fde_t *F = &fd_table[fd]; + fde_t *F = comm_locate_fd(fd); int old_flags = F->pflags; int op = -1; diff --git a/libcharybdis/kqueue.c b/libcharybdis/kqueue.c index 327ca9fe..9f76b7cd 100644 --- a/libcharybdis/kqueue.c +++ b/libcharybdis/kqueue.c @@ -22,7 +22,7 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA * - * $Id: kqueue.c 3205 2007-02-09 22:18:23Z nenolod $ + * $Id: kqueue.c 3229 2007-03-05 17:23:07Z nenolod $ */ #include "stdinc.h" @@ -156,7 +156,7 @@ void comm_setselect(int fd, fdlist_t list, unsigned int type, PF * handler, void *client_data, time_t timeout) { - fde_t *F = &fd_table[fd]; + fde_t *F = comm_locate_fd(fd); s_assert(fd >= 0); s_assert(F->flags.open); @@ -239,7 +239,7 @@ comm_select(unsigned long delay) { int fd = (int) ke[i].ident; PF *hdl = NULL; - fde_t *F = &fd_table[fd]; + fde_t *F = comm_locate_fd(fd); if(ke[i].flags & EV_ERROR) { diff --git a/libcharybdis/poll.c b/libcharybdis/poll.c index 5929b713..bf82476a 100644 --- a/libcharybdis/poll.c +++ b/libcharybdis/poll.c @@ -22,7 +22,7 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA * - * $Id: poll.c 390 2005-12-07 18:46:56Z nenolod $ + * $Id: poll.c 3229 2007-03-05 17:23:07Z nenolod $ */ #include "config.h" @@ -81,7 +81,7 @@ poll_findslot(void) static void poll_update_pollfds(int fd, short event, PF * handler) { - fde_t *F = &fd_table[fd]; + fde_t *F = comm_locate_table(fd); int comm_index; if(F->comm_index < 0) @@ -155,7 +155,7 @@ void comm_setselect(int fd, fdlist_t list, unsigned int type, PF * handler, void *client_data, time_t timeout) { - fde_t *F = &fd_table[fd]; + fde_t *F = comm_locate_fd(fd); s_assert(fd >= 0); s_assert(F->flags.open); @@ -255,7 +255,7 @@ comm_select(unsigned long delay) (pollfd_list.pollfds[ci].fd) == -1) continue; fd = pollfd_list.pollfds[ci].fd; - F = &fd_table[fd]; + F = comm_locate_fd(fd); if(revents & (POLLRDNORM | POLLIN | POLLHUP | POLLERR)) { hdl = F->read_handler; diff --git a/libcharybdis/ports.c b/libcharybdis/ports.c index ffb8955d..d774b4ed 100644 --- a/libcharybdis/ports.c +++ b/libcharybdis/ports.c @@ -98,7 +98,7 @@ void ircd_setselect(int fd, fdlist_t list, unsigned int type, PF * handler, void *client_data) { - fde_t *F = &fd_table[fd]; + fde_t *F = comm_locate_fd(fd); s_assert(fd >= 0); s_assert(F->flags.open); @@ -148,7 +148,7 @@ ircd_select(unsigned long delay) case PORT_SOURCE_FD: fd = pelst[i].portev_object; PF *hdl = NULL; - fde_t *F = &fd_table[fd]; + fde_t *F = comm_locate_fd(fd); if ((pelst[i].portev_events & POLLRDNORM) && (hdl = F->read_handler)) { F->read_handler = NULL; diff --git a/libcharybdis/select.c b/libcharybdis/select.c index 0f8ff270..5108915e 100644 --- a/libcharybdis/select.c +++ b/libcharybdis/select.c @@ -22,7 +22,7 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA * - * $Id: select.c 390 2005-12-07 18:46:56Z nenolod $ + * $Id: select.c 3229 2007-03-05 17:23:07Z nenolod $ */ #include "config.h" @@ -105,7 +105,7 @@ void comm_setselect(int fd, fdlist_t list, unsigned int type, PF * handler, void *client_data, time_t timeout) { - fde_t *F = &fd_table[fd]; + fde_t *F = comm_locate_fd(fd); s_assert(fd >= 0); s_assert(F->flags.open); @@ -172,7 +172,7 @@ comm_select(unsigned long delay) /* XXX we *could* optimise by falling out after doing num fds ... */ for (fd = 0; fd < highest_fd + 1; fd++) { - F = &fd_table[fd]; + F = comm_locate_fd(fd); if(FD_ISSET(fd, &tmpreadfds)) {