New fix candidate to bug #698, http://bugs.mariadb.com/show_bug.cgi?id=698
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:
parent
9c34125a59
commit
5d1f029260
199
client/test/maxadmin_test.sh
Normal file → Executable file
199
client/test/maxadmin_test.sh
Normal file → Executable 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"
|
||||
|
@ -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;
|
||||
|
@ -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 */
|
||||
|
@ -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));
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user