Fix to bug #698, http://bugs.mariadb.com/show_bug.cgi?id=698
debugcmd.c:convert_arg returned zero if argument is invalid. That zero was cast to pointer. Using it caused NULL-pointer references. Changed the return value indicating about error to 0x1 which is then handled properly.
This commit is contained in:
@ -571,7 +571,7 @@ flushlog(DCB *pdcb, char *logname)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
dcb_printf(pdcb, "Unexpected logfile name, expected "
|
dcb_printf(pdcb, "Unexpected logfile name, expected "
|
||||||
"error, message, trace oe debug.\n");
|
"error, message, trace or debug.\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -666,11 +666,19 @@ SERVICE *service;
|
|||||||
case ARG_TYPE_SERVICE:
|
case ARG_TYPE_SERVICE:
|
||||||
if (mode == CLIM_USER || (rval = (unsigned long)strtol(arg, NULL, 0)) == 0)
|
if (mode == CLIM_USER || (rval = (unsigned long)strtol(arg, NULL, 0)) == 0)
|
||||||
rval = (unsigned long)service_find(arg);
|
rval = (unsigned long)service_find(arg);
|
||||||
return rval;
|
|
||||||
|
if (rval)
|
||||||
|
return rval;
|
||||||
|
else
|
||||||
|
return 0x1; /*< invalid argument */
|
||||||
case ARG_TYPE_SERVER:
|
case ARG_TYPE_SERVER:
|
||||||
if (mode == CLIM_USER || (rval = (unsigned long)strtol(arg, NULL, 0)) == 0)
|
if (mode == CLIM_USER || (rval = (unsigned long)strtol(arg, NULL, 0)) == 0)
|
||||||
rval = (unsigned long)server_find_by_unique_name(arg);
|
rval = (unsigned long)server_find_by_unique_name(arg);
|
||||||
return rval;
|
|
||||||
|
if (rval)
|
||||||
|
return rval;
|
||||||
|
else
|
||||||
|
return 0x1; /*< invalid argument */
|
||||||
case ARG_TYPE_DBUSERS:
|
case ARG_TYPE_DBUSERS:
|
||||||
if (mode == CLIM_USER || (rval = (unsigned long)strtol(arg, NULL, 0)) == 0)
|
if (mode == CLIM_USER || (rval = (unsigned long)strtol(arg, NULL, 0)) == 0)
|
||||||
{
|
{
|
||||||
@ -684,21 +692,33 @@ SERVICE *service;
|
|||||||
case ARG_TYPE_DCB:
|
case ARG_TYPE_DCB:
|
||||||
rval = (unsigned long)strtol(arg, NULL, 0);
|
rval = (unsigned long)strtol(arg, NULL, 0);
|
||||||
if (mode == CLIM_USER && dcb_isvalid((DCB *)rval) == 0)
|
if (mode == CLIM_USER && dcb_isvalid((DCB *)rval) == 0)
|
||||||
rval = 0;
|
rval = 0x1; /*< invalid argument */
|
||||||
return rval;
|
return rval;
|
||||||
case ARG_TYPE_SESSION:
|
case ARG_TYPE_SESSION:
|
||||||
rval = (unsigned long)strtol(arg, NULL, 0);
|
rval = (unsigned long)strtol(arg, NULL, 0);
|
||||||
if (mode == CLIM_USER && session_isvalid((SESSION *)rval) == 0)
|
if (mode == CLIM_USER && session_isvalid((SESSION *)rval) == 0)
|
||||||
rval = 0;
|
rval = 0;
|
||||||
return rval;
|
|
||||||
|
if (rval)
|
||||||
|
return rval;
|
||||||
|
else
|
||||||
|
return 0x1; /*< invalid argument */
|
||||||
case ARG_TYPE_MONITOR:
|
case ARG_TYPE_MONITOR:
|
||||||
if (mode == CLIM_USER || (rval = (unsigned long)strtol(arg, NULL, 0)) == 0)
|
if (mode == CLIM_USER || (rval = (unsigned long)strtol(arg, NULL, 0)) == 0)
|
||||||
rval = (unsigned long)monitor_find(arg);
|
rval = (unsigned long)monitor_find(arg);
|
||||||
return rval;
|
|
||||||
|
if (rval)
|
||||||
|
return rval;
|
||||||
|
else
|
||||||
|
return 0x1; /*< invalid argument */
|
||||||
case ARG_TYPE_FILTER:
|
case ARG_TYPE_FILTER:
|
||||||
if (mode == CLIM_USER || (rval = (unsigned long)strtol(arg, NULL, 0)) == 0)
|
if (mode == CLIM_USER || (rval = (unsigned long)strtol(arg, NULL, 0)) == 0)
|
||||||
rval = (unsigned long)filter_find(arg);
|
rval = (unsigned long)filter_find(arg);
|
||||||
return rval;
|
|
||||||
|
if (rval)
|
||||||
|
return rval;
|
||||||
|
else
|
||||||
|
return 0x1; /*< invalid argument */
|
||||||
case ARG_TYPE_NUMERIC:
|
case ARG_TYPE_NUMERIC:
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
Reference in New Issue
Block a user