dcb.c:dcb_hashtable_stats:division by zero
hashtable.c:hashtable_get_stats: NULL-pointer reference
service.c:serviceStartPort:set service->users NULL to avoid referring to freed memory
users.c:dcb_usersPrintf: NULL-pointer reference
debugcmd.c:convert_arg: changed return value to 1 in case of error, 0 (==NULL) is valid but it indicates that there are no users loaded.
	execute_cmd: fixed command handling
This commit is contained in:
VilhoRaatikka
2014-12-31 21:06:28 +02:00
parent 9b52f5e6ba
commit f4f537a3e2
5 changed files with 66 additions and 45 deletions

View File

@ -1610,7 +1610,9 @@ void dcb_hashtable_stats(
hashsize);
dcb_printf(dcb, "\tNo. of entries: %d\n", total);
dcb_printf(dcb, "\tAverage chain length: %.1f\n", (float)total / hashsize);
dcb_printf(dcb,
"\tAverage chain length: %.1f\n",
(hashsize == 0 ? (float)hashsize : (float)total / hashsize));
dcb_printf(dcb, "\tLongest chain length: %d\n", longest);
}

View File

@ -449,10 +449,14 @@ void hashtable_get_stats(
int i;
int j;
ht = (HASHTABLE *)table;
CHK_HASHTABLE(ht);
*nelems = 0;
*longest = 0;
*hashsize = 0;
if (table != NULL)
{
ht = (HASHTABLE *)table;
CHK_HASHTABLE(ht);
hashtable_read_lock(ht);
for (i = 0; i < ht->hashsize; i++)
@ -472,6 +476,7 @@ void hashtable_get_stats(
*hashsize = ht->hashsize;
hashtable_read_unlock(ht);
}
}
/**

View File

@ -217,6 +217,7 @@ GWPROTOCOL *funcs;
service->name)));
hashtable_free(service->users->data);
free(service->users);
service->users = NULL;
dcb_free(port->listener);
port->listener = NULL;
goto retblock;

View File

@ -183,7 +183,15 @@ char *sep;
void *user;
dcb_printf(dcb, "Users table data\n");
if (users == NULL || users->data == NULL)
{
dcb_printf(dcb, "Users table is empty\n");
}
else
{
dcb_hashtable_stats(dcb, users->data);
if ((iter = hashtable_iterator(users->data)) != NULL)
{
dcb_printf(dcb, "User names: ");
@ -208,7 +216,8 @@ void *user;
}
}
dcb_printf(dcb, "\n");
hashtable_iterator_free(iter);
}
}
dcb_printf(dcb, "\n");
}

View File

@ -678,7 +678,7 @@ SERVICE *service;
if (service)
return (unsigned long)(service->users);
else
return 0;
return 1; /*< invalid argument */
}
return rval;
case ARG_TYPE_DCB:
@ -886,11 +886,15 @@ bool in_space = false;
break;
case 1:
arg1 = convert_arg(cli->mode, args[2],cmds[i].options[j].arg_types[0]);
if (arg1)
cmds[i].options[j].fn(dcb, arg1);
else
if (arg1 == 0x1)
{
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]);