Exit on bad maxadmin arguments

The errors were detected but the code proceeded to call various functions
with bad pointers. This led to a crash if a bad server name was given to
'show server'.
This commit is contained in:
Markus Makela
2016-12-02 19:08:54 +02:00
parent a4bc575353
commit be7a315614

View File

@ -1755,6 +1755,7 @@ execute_cmd(CLI_SESSION *cli)
else else
{ {
unsigned long arg_list[MAXARGS] = {}; unsigned long arg_list[MAXARGS] = {};
bool ok = true;
for (int k = 0; k < cmds[i].options[j].argc_max && k < argc; k++) for (int k = 0; k < cmds[i].options[j].argc_max && k < argc; k++)
{ {
@ -1762,72 +1763,75 @@ execute_cmd(CLI_SESSION *cli)
if (arg_list[k] == 0) if (arg_list[k] == 0)
{ {
dcb_printf(dcb, "Invalid argument: %s\n", args[k + 2]); dcb_printf(dcb, "Invalid argument: %s\n", args[k + 2]);
break; ok = false;
} }
} }
switch (cmds[i].options[j].argc_max) if (ok)
{ {
case 0: switch (cmds[i].options[j].argc_max)
cmds[i].options[j].fn(dcb); {
break; case 0:
case 1: cmds[i].options[j].fn(dcb);
cmds[i].options[j].fn(dcb, arg_list[0]); break;
break; case 1:
case 2: cmds[i].options[j].fn(dcb, arg_list[0]);
cmds[i].options[j].fn(dcb, arg_list[0], arg_list[1]); break;
break; case 2:
case 3: cmds[i].options[j].fn(dcb, arg_list[0], arg_list[1]);
cmds[i].options[j].fn(dcb, arg_list[0], arg_list[1], arg_list[2]); break;
break; case 3:
case 4: cmds[i].options[j].fn(dcb, arg_list[0], arg_list[1], arg_list[2]);
cmds[i].options[j].fn(dcb, arg_list[0], arg_list[1], arg_list[2], break;
arg_list[3]); case 4:
break; cmds[i].options[j].fn(dcb, arg_list[0], arg_list[1], arg_list[2],
case 5: arg_list[3]);
cmds[i].options[j].fn(dcb, arg_list[0], arg_list[1], arg_list[2], break;
arg_list[3], arg_list[4]); case 5:
break; cmds[i].options[j].fn(dcb, arg_list[0], arg_list[1], arg_list[2],
case 6: arg_list[3], arg_list[4]);
cmds[i].options[j].fn(dcb, arg_list[0], arg_list[1], arg_list[2], break;
arg_list[3], arg_list[4], arg_list[5]); case 6:
break; cmds[i].options[j].fn(dcb, arg_list[0], arg_list[1], arg_list[2],
case 7: arg_list[3], arg_list[4], arg_list[5]);
cmds[i].options[j].fn(dcb, arg_list[0], arg_list[1], arg_list[2], break;
arg_list[3], arg_list[4], arg_list[5], case 7:
arg_list[6]); cmds[i].options[j].fn(dcb, arg_list[0], arg_list[1], arg_list[2],
break; arg_list[3], arg_list[4], arg_list[5],
case 8: arg_list[6]);
cmds[i].options[j].fn(dcb, arg_list[0], arg_list[1], arg_list[2], break;
arg_list[3], arg_list[4], arg_list[5], case 8:
arg_list[6], arg_list[7]); cmds[i].options[j].fn(dcb, arg_list[0], arg_list[1], arg_list[2],
break; arg_list[3], arg_list[4], arg_list[5],
case 9: arg_list[6], arg_list[7]);
cmds[i].options[j].fn(dcb, arg_list[0], arg_list[1], arg_list[2], break;
arg_list[3], arg_list[4], arg_list[5], case 9:
arg_list[6], arg_list[7], arg_list[8]); cmds[i].options[j].fn(dcb, arg_list[0], arg_list[1], arg_list[2],
break; arg_list[3], arg_list[4], arg_list[5],
case 10: arg_list[6], arg_list[7], arg_list[8]);
cmds[i].options[j].fn(dcb, arg_list[0], arg_list[1], arg_list[2], break;
arg_list[3], arg_list[4], arg_list[5], case 10:
arg_list[6], arg_list[7], arg_list[8], cmds[i].options[j].fn(dcb, arg_list[0], arg_list[1], arg_list[2],
arg_list[9]); arg_list[3], arg_list[4], arg_list[5],
break; arg_list[6], arg_list[7], arg_list[8],
case 11: arg_list[9]);
cmds[i].options[j].fn(dcb, arg_list[0], arg_list[1], arg_list[2], break;
arg_list[3], arg_list[4], arg_list[5], case 11:
arg_list[6], arg_list[7], arg_list[8], cmds[i].options[j].fn(dcb, arg_list[0], arg_list[1], arg_list[2],
arg_list[9], arg_list[10]); arg_list[3], arg_list[4], arg_list[5],
break; arg_list[6], arg_list[7], arg_list[8],
case 12: arg_list[9], arg_list[10]);
cmds[i].options[j].fn(dcb, arg_list[0], arg_list[1], arg_list[2], break;
arg_list[3], arg_list[4], arg_list[5], case 12:
arg_list[6], arg_list[7], arg_list[8], cmds[i].options[j].fn(dcb, arg_list[0], arg_list[1], arg_list[2],
arg_list[9], arg_list[10], arg_list[11]); arg_list[3], arg_list[4], arg_list[5],
break; arg_list[6], arg_list[7], arg_list[8],
default: arg_list[9], arg_list[10], arg_list[11]);
dcb_printf(dcb, "Error: Maximum argument count is %d.\n", MAXARGS); break;
break; default:
dcb_printf(dcb, "Error: Maximum argument count is %d.\n", MAXARGS);
break;
}
} }
} }
} }