Formerly some mode strings like +svvvv were not accepted.
#define SM_ERR_RPL_Q 0x00000800
#define SM_ERR_RPL_F 0x00001000
#define SM_ERR_RPL_Q 0x00000800
#define SM_ERR_RPL_F 0x00001000
+#define MAXMODES_SIMPLE 46 /* a-zA-Z except bqeIov */
+
static struct ChModeChange mode_changes[BUFSIZE];
static int mode_count;
static int mode_limit;
static struct ChModeChange mode_changes[BUFSIZE];
static int mode_count;
static int mode_limit;
+static int mode_limit_simple;
static int mask_pos;
static int orphaned_cflags = 0;
static int mask_pos;
static int orphaned_cflags = 0;
- /* +ntspmaikl == 9 + MAXMODEPARAMS (4 * +o) */
- if(MyClient(source_p) && (++mode_limit > (9 + MAXMODEPARAMS)))
+ /* flags (possibly upto 32) + 4 with param */
+ if(MyClient(source_p) && (++mode_limit_simple > MAXMODES_SIMPLE))
+ if(MyClient(source_p) && (++mode_limit_simple > MAXMODES_SIMPLE))
+ return;
+
/* setting + */
if((dir == MODE_ADD) && !(chptr->mode.mode & mode_type))
{
/* setting + */
if((dir == MODE_ADD) && !(chptr->mode.mode & mode_type))
{
if(dir == MODE_QUERY)
return;
if(dir == MODE_QUERY)
return;
+ if(MyClient(source_p) && (++mode_limit_simple > MAXMODES_SIMPLE))
+ return;
+
if((dir == MODE_ADD) && parc > *parn)
{
lstr = parv[(*parn)];
if((dir == MODE_ADD) && parc > *parn)
{
lstr = parv[(*parn)];
if(dir == MODE_QUERY)
return;
if(dir == MODE_QUERY)
return;
+ if(MyClient(source_p) && (++mode_limit_simple > MAXMODES_SIMPLE))
+ return;
+
if((dir == MODE_ADD) && parc > *parn)
{
sscanf(parv[(*parn)], "%d:%d", &joins, ×lice);
if((dir == MODE_ADD) && parc > *parn)
{
sscanf(parv[(*parn)], "%d:%d", &joins, ×lice);
+ if(MyClient(source_p) && (++mode_limit_simple > MAXMODES_SIMPLE))
+ return;
+
if(dir == MODE_ADD && parc > *parn)
{
forward = parv[(*parn)];
if(dir == MODE_ADD && parc > *parn)
{
forward = parv[(*parn)];
if(dir == MODE_QUERY)
return;
if(dir == MODE_QUERY)
return;
+ if(MyClient(source_p) && (++mode_limit_simple > MAXMODES_SIMPLE))
+ return;
+
if((dir == MODE_ADD) && parc > *parn)
{
key = LOCAL_COPY(parv[(*parn)]);
if((dir == MODE_ADD) && parc > *parn)
{
key = LOCAL_COPY(parv[(*parn)]);
((dir == MODE_DEL) && !(chptr->mode.mode & MODE_REGONLY)))
return;
((dir == MODE_DEL) && !(chptr->mode.mode & MODE_REGONLY)))
return;
+ if(MyClient(source_p) && (++mode_limit_simple > MAXMODES_SIMPLE))
+ return;
+
if(dir == MODE_ADD)
chptr->mode.mode |= MODE_REGONLY;
else
if(dir == MODE_ADD)
chptr->mode.mode |= MODE_REGONLY;
else
mask_pos = 0;
mode_count = 0;
mode_limit = 0;
mask_pos = 0;
mode_count = 0;
mode_limit = 0;
alevel = get_channel_access(source_p, msptr);
alevel = get_channel_access(source_p, msptr);