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:
VilhoRaatikka
2015-01-17 01:24:56 +02:00
parent 113ea8381b
commit 1a76d2d06f

View File

@ -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;