client/test/maxadmin_test.sh: added new cases for testing maxadmin
service.c:dListListeners:fixed NULL-pointer reference
debugcli.h: replaced magic number 80 with constant integer.
cli.c:execute:fixed command buffer overflow
debugcmd.c:convert_arg:restored return value to 0 in case of error
This commit is contained in:
VilhoRaatikka 2015-01-19 17:55:02 +02:00
parent 9c34125a59
commit 5d1f029260
5 changed files with 217 additions and 43 deletions

199
client/test/maxadmin_test.sh Normal file → Executable file
View File

@ -26,6 +26,76 @@ else
echo "Auth test (long option): Passed"
fi
#
# Test enable|disable heartbeat|root without, with invalid and with long invalid argument
#
for op in enable disable
do
for cmd in heartbeat root
do
maxadmin -pskysql $op $cmd >& /dev/null
if [ $? -eq "1" ]; then
echo "$op $cmd (missing arg): Failed"
failure=`expr $failure + 1`
else
passed=`expr $passed + 1`
echo "$op $cmd (missing arg): Passed"
fi
maxadmin -pskysql $op $cmd qwerty >& /dev/null
if [ $? -eq "1" ]; then
echo "$op $cmd (invalid arg): Failed"
failure=`expr $failure + 1`
else
passed=`expr $passed + 1`
echo "$op $cmd (invalied arg): Passed"
fi
maxadmin -pskysql $op $cmd xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx >& /dev/null
if [ $? -eq "1" ]; then
echo "$op $cmd (long invalid arg): Failed"
failure=`expr $failure + 1`
else
passed=`expr $passed + 1`
echo "$op $cmd (long invalid arg): Passed"
fi
done
done
#
# Test reload dbusers with short, and long garbage and without argument
#
maxadmin -pskysql reload dbusers qwerty >& /dev/null
if [ $? -eq "1" ]; then
echo "Reload dbusers (invalid arg): Failed"
failure=`expr $failure + 1`
else
passed=`expr $passed + 1`
echo "Reload dbusers (invalid arg): Passed"
fi
maxadmin -pskysql reload dbusers xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx >& /dev/null
if [ $? -eq "1" ]; then
echo "Reload dbusers (long invalid arg): Failed"
failure=`expr $failure + 1`
else
passed=`expr $passed + 1`
echo "Reload dbusers (long invalid arg): Passed"
fi
maxadmin -pskysql reload dbusers >& /dev/null
if [ $? -eq "1" ]; then
echo "Reload dbusers (missing arg): Failed"
failure=`expr $failure + 1`
else
passed=`expr $passed + 1`
echo "Reload dbusers (missing arg): Passed"
fi
#
# Test enable|disable log debug|trace|message|error
#
maxadmin -pskysql enable log debug >& /dev/null
if [ $? -eq "1" ]; then
echo "Enable debug log: Failed"
@ -44,6 +114,26 @@ else
echo "Enable trace log: Passed"
fi
maxadmin -pskysql enable log message >& /dev/null
if [ $? -eq "1" ]; then
echo "Enable message log: Failed"
failure=`expr $failure + 1`
else
passed=`expr $passed + 1`
echo "Enable message log: Passed"
fi
maxadmin -pskysql enable log error >& /dev/null
if [ $? -eq "1" ]; then
echo "Enable error log: Failed"
failure=`expr $failure + 1`
else
passed=`expr $passed + 1`
echo "Enable error log: Passed"
fi
maxadmin -pskysql disable log debug >& /dev/null
if [ $? -eq "1" ]; then
echo "Disable debug log: Failed"
@ -62,6 +152,70 @@ else
echo "Disable trace log: Passed"
fi
#
# Test restart monitor|service without, with invalid and with long invalid argument
#
for cmd in monitor service
do
maxadmin -pskysql restart $cmd >& /dev/null
if [ $? -eq "1" ]; then
echo "Restart $cmd (missing arg): Failed"
failure=`expr $failure + 1`
else
passed=`expr $passed + 1`
echo "Restart $cmd (missing arg): Passed"
fi
maxadmin -pskysql restart $cmd xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx >& /dev/null
if [ $? -eq "1" ]; then
echo "Restart $cmd (long invalid arg): Failed"
failure=`expr $failure + 1`
else
passed=`expr $passed + 1`
echo "Restart $cmd (long invalid arg): Passed"
fi
maxadmin -pskysql restart $cmd qwerty >& /dev/null
if [ $? -eq "1" ]; then
echo "Restart $cmd (invalid arg): Failed"
failure=`expr $failure + 1`
else
passed=`expr $passed + 1`
echo "Restart $cmd (invalid arg): Passed"
fi
done
#
# Test set server qwerty master withaout, with invalid and with long invalid arg
#
maxadmin -pskysql set server qwerty >& /dev/null
if [ $? -eq "1" ]; then
echo "Set server qwerty (missing arg): Failed"
failure=`expr $failure + 1`
else
passed=`expr $passed + 1`
echo "Set server (missing arg): Passed"
fi
maxadmin -pskysql set server qwerty mamaster >& /dev/null
if [ $? -eq "1" ]; then
echo "Set server qwerty (invalid arg): Failed"
failure=`expr $failure + 1`
else
passed=`expr $passed + 1`
echo "Set server qwerty (invalid arg): Passed"
fi
maxadmin -pskysql set server qwerty xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx >& /dev/null
if [ $? -eq "1" ]; then
echo "Set server qwerty (long invalid arg): Failed"
failure=`expr $failure + 1`
else
passed=`expr $passed + 1`
echo "Set server qwerty (long invalid arg): Passed"
fi
for cmd in clients dcbs filters listeners modules monitors services servers sessions threads
do
maxadmin -pskysql list $cmd | grep -s '-' >& /dev/null
@ -112,13 +266,14 @@ fi
maxadmin -pskysql set server $master maint >& /dev/null
if [ $? -eq "1" ]; then
echo "set server: Failed"
echo "set server $master maint: Failed"
failure=`expr $failure + 1`
else
passed=`expr $passed + 1`
echo "set server: Passed"
echo "set server $master maint: Passed"
fi
maxadmin -pskysql list servers | grep $master | grep -s Maint >& /dev/null
maxadmin -pskysql list servers | grep $master | grep -s 'Maint' >& /dev/null
if [ $? -eq "1" ]; then
echo "set maintenance mode: Failed"
failure=`expr $failure + 1`
@ -126,6 +281,7 @@ else
passed=`expr $passed + 1`
echo "set maintenance mode: Passed"
fi
maxadmin -pskysql clear server $master maint >& /dev/null
if [ $? -eq "1" ]; then
echo "clear server: Failed"
@ -134,7 +290,7 @@ else
passed=`expr $passed + 1`
echo "clear server: Passed"
fi
maxadmin -pskysql list servers | grep $master | grep -s Maint >& /dev/null
maxadmin -pskysql list servers | grep $master | grep -s 'Maint' >& /dev/null
if [ $? -eq "0" ]; then
echo "clear maintenance mode: Failed"
failure=`expr $failure + 1`
@ -156,14 +312,45 @@ for i in $dcbs
do
maxadmin -pskysql show dcb $i | grep -s 'listening' >& /dev/null
if [ $? -eq "1" ]; then
echo "show dcb listeners: Failed"
echo "show dcb listeners: Failed"
failure=`expr $failure + 1`
else
passed=`expr $passed + 1`
echo "show dcb listeners: Passed"
echo "show dcb listeners: Passed"
fi
done
#
# Test show dcb|eventq|eventstats|filter|monitor|server|service|session with invalid arg
#
for cmd in dcb eventq filter monitor server service sessions
do
maxadmin -pskysql show $cmd qwerty | grep -s '-' >& /dev/null
if [ $? -eq "0" ]; then
echo "show $cmd (invalid arg): Failed"
failure=`expr $failure + 1`
else
passed=`expr $passed + 1`
echo "show $cmd (invalid arg): Passed"
fi
done
#
# Test shutdown monitor|service with invalid extra argument
#
for cmd in monitor service
do
maxadmin -pskysql shutdown $cmd qwerty | grep -s '-' >& /dev/null
if [ $? -eq "0" ]; then
echo "Shutdown $cmd (invalid extra arg):Failed"
failure=`expr $failure + 1`
else
passed=`expr $passed + 1`
echo "Shutdown $cmd (invalid extra arg):Passed"
fi
done
sessions=`maxadmin -pskysql list sessions | awk -F\| '/Listener/ { if ( NF > 1 ) print $1 }'`
if [ $? -eq "1" ]; then
echo "Get listener sessions: Failed"

View File

@ -1020,7 +1020,10 @@ SERV_PROTOCOL *lptr;
ptr->name, lptr->protocol,
(lptr && lptr->address) ? lptr->address : "*",
lptr->port,
(lptr->listener->session->state == SESSION_STATE_LISTENER_STOPPED) ? "Stopped" : "Running"
(!lptr->listener ||
!lptr->listener->session ||
lptr->listener->session->state == SESSION_STATE_LISTENER_STOPPED) ?
"Stopped" : "Running"
);
lptr = lptr->next;

View File

@ -52,12 +52,14 @@ typedef struct cli_instance {
* The CLI_SESSION structure. As CLI_SESSION is created for each user that logs into
* the DEBUG CLI.
*/
enum { cmdbuflen=80 };
typedef struct cli_session {
char cmdbuf[80]; /*< The command buffer used to build up user commands */
int mode; /*< The CLI Mode for this session */
SESSION *session; /*< The gateway session */
char cmdbuf[cmdbuflen]; /*< The command buffer used to build up user commands */
int mode; /*< The CLI Mode for this session */
SESSION *session; /*< The gateway session */
struct cli_session
*next; /*< The next pointer for the list of sessions */
*next; /*< The next pointer for the list of sessions */
} CLI_SESSION;
/* Command line interface modes */

View File

@ -272,7 +272,7 @@ CLI_SESSION *session = (CLI_SESSION *)router_session;
/* Extract the characters */
while (queue)
{
strncat(session->cmdbuf, GWBUF_DATA(queue), GWBUF_LENGTH(queue));
strncat(session->cmdbuf, GWBUF_DATA(queue), MIN(GWBUF_LENGTH(queue),cmdbuflen-1));
queue = gwbuf_consume(queue, GWBUF_LENGTH(queue));
}

View File

@ -666,19 +666,13 @@ SERVICE *service;
case ARG_TYPE_SERVICE:
if (mode == CLIM_USER || (rval = (unsigned long)strtol(arg, NULL, 0)) == 0)
rval = (unsigned long)service_find(arg);
if (rval)
return rval;
else
return 0x1; /*< invalid argument */
return rval;
case ARG_TYPE_SERVER:
if (mode == CLIM_USER || (rval = (unsigned long)strtol(arg, NULL, 0)) == 0)
rval = (unsigned long)server_find_by_unique_name(arg);
if (rval)
return rval;
else
return 0x1; /*< invalid argument */
return rval;
case ARG_TYPE_DBUSERS:
if (mode == CLIM_USER || (rval = (unsigned long)strtol(arg, NULL, 0)) == 0)
{
@ -686,39 +680,30 @@ SERVICE *service;
if (service)
return (unsigned long)(service->users);
else
return 1; /*< invalid argument */
return 0;
}
return rval;
case ARG_TYPE_DCB:
rval = (unsigned long)strtol(arg, NULL, 0);
if (mode == CLIM_USER && dcb_isvalid((DCB *)rval) == 0)
rval = 0x1; /*< invalid argument */
rval = 0;
return rval;
case ARG_TYPE_SESSION:
rval = (unsigned long)strtol(arg, NULL, 0);
if (mode == CLIM_USER && session_isvalid((SESSION *)rval) == 0)
rval = 0;
if (rval)
return rval;
else
return 0x1; /*< invalid argument */
return rval;
case ARG_TYPE_MONITOR:
if (mode == CLIM_USER || (rval = (unsigned long)strtol(arg, NULL, 0)) == 0)
rval = (unsigned long)monitor_find(arg);
if (rval)
return rval;
else
return 0x1; /*< invalid argument */
return rval;
case ARG_TYPE_FILTER:
if (mode == CLIM_USER || (rval = (unsigned long)strtol(arg, NULL, 0)) == 0)
rval = (unsigned long)filter_find(arg);
if (rval)
return rval;
else
return 0x1; /*< invalid argument */
return rval;
case ARG_TYPE_NUMERIC:
{
int i;
@ -906,15 +891,12 @@ bool in_space = false;
break;
case 1:
arg1 = convert_arg(cli->mode, args[2],cmds[i].options[j].arg_types[0]);
if (arg1 == 0x1)
{
if (arg1)
cmds[i].options[j].fn(dcb, arg1);
else
dcb_printf(dcb, "Invalid argument: %s\n",
args[2]);
}
else
{
cmds[i].options[j].fn(dcb, arg1);
}
break;
case 2:
arg1 = convert_arg(cli->mode, args[2],cmds[i].options[j].arg_types[0]);
@ -971,7 +953,7 @@ bool in_space = false;
if (!found)
dcb_printf(dcb,
"Command '%s' not known, type help for a list of available commands\n", args[0]);
memset(cli->cmdbuf, 0, 80);
memset(cli->cmdbuf, 0, cmdbuflen);
return 1;
}