diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/cs_access.c | 36 | ||||
| -rw-r--r-- | src/core/cs_xop.c | 36 |
2 files changed, 50 insertions, 22 deletions
diff --git a/src/core/cs_access.c b/src/core/cs_access.c index 1669791f7..9c52a4b9e 100644 --- a/src/core/cs_access.c +++ b/src/core/cs_access.c @@ -233,21 +233,23 @@ int do_access(User * u) } } + /* All entries should be in use so we no longer need + * to go over the entire list.. for (i = 0; i < ci->accesscount; i++) { if (!ci->access[i].in_use) break; } - if (i == ci->accesscount) { - if (i < CSAccessMax) { - ci->accesscount++; - ci->access = - srealloc(ci->access, - sizeof(ChanAccess) * ci->accesscount); - } else { - notice_lang(s_ChanServ, u, CHAN_ACCESS_REACHED_LIMIT, - CSAccessMax); - return MOD_CONT; - } + */ + + if (i < CSAccessMax) { + ci->accesscount++; + ci->access = + srealloc(ci->access, + sizeof(ChanAccess) * ci->accesscount); + } else { + notice_lang(s_ChanServ, u, CHAN_ACCESS_REACHED_LIMIT, + CSAccessMax); + return MOD_CONT; } access = &ci->access[i]; @@ -346,6 +348,18 @@ int do_access(User * u) } } } + + /* After reordering only the entries at the end could still be empty. + * We ll free the places no longer in use... */ + for (i = ci->accesscount - 1; i >= 0; i--) { + if (ci->access[i].in_use == 1) + break; + + ci->accesscount--; + } + ci->access = + srealloc(ci->access,sizeof(ChanAccess) * ci->accesscount); + /* We don't know the nick if someone used numbers, so we trigger the event without * nick param. We just do this once, even if someone enters a range. -Certus */ if (na) diff --git a/src/core/cs_xop.c b/src/core/cs_xop.c index 09eca4ce4..83cae81fe 100644 --- a/src/core/cs_xop.c +++ b/src/core/cs_xop.c @@ -301,21 +301,22 @@ int do_xop(User * u, char *xname, int xlev, int *xmsgs) } if (!change) { + /* All entries should be in use so we no longer need + * to go over the entire list.. for (i = 0; i < ci->accesscount; i++) if (!ci->access[i].in_use) break; + */ - if (i == ci->accesscount) { - if (i < CSAccessMax) { - ci->accesscount++; - ci->access = - srealloc(ci->access, - sizeof(ChanAccess) * ci->accesscount); - } else { - notice_lang(s_ChanServ, u, CHAN_XOP_REACHED_LIMIT, - CSAccessMax); - return MOD_CONT; - } + if (i < CSAccessMax) { + ci->accesscount++; + ci->access = + srealloc(ci->access, + sizeof(ChanAccess) * ci->accesscount); + } else { + notice_lang(s_ChanServ, u, CHAN_XOP_REACHED_LIMIT, + CSAccessMax); + return MOD_CONT; } access = &ci->access[i]; @@ -431,6 +432,19 @@ int do_xop(User * u, char *xname, int xlev, int *xmsgs) } } } + + /* If the patch provided in bug #706 is applied, this should be placed + * before sending the events! */ + /* After reordering only the entries at the end could still be empty. + * We ll free the places no longer in use... */ + for (i = ci->accesscount - 1; i >= 0; i--) { + if (ci->access[i].in_use == 1) + break; + + ci->accesscount--; + } + ci->access = + srealloc(ci->access,sizeof(ChanAccess) * ci->accesscount); } } else if (stricmp(cmd, "LIST") == 0) { int sent_header = 0; |
