diff --git a/server/core/dcb.c b/server/core/dcb.c index 71b6457fa..0e9c8b594 100644 --- a/server/core/dcb.c +++ b/server/core/dcb.c @@ -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); } diff --git a/server/core/hashtable.c b/server/core/hashtable.c index 243158a70..ab979e472 100644 --- a/server/core/hashtable.c +++ b/server/core/hashtable.c @@ -449,28 +449,33 @@ void hashtable_get_stats( int i; int j; - ht = (HASHTABLE *)table; - CHK_HASHTABLE(ht); - *nelems = 0; - *longest = 0; - hashtable_read_lock(ht); - - for (i = 0; i < ht->hashsize; i++) + *nelems = 0; + *longest = 0; + *hashsize = 0; + + if (table != NULL) { - j = 0; - entries = ht->entries[i]; - while (entries) + ht = (HASHTABLE *)table; + CHK_HASHTABLE(ht); + hashtable_read_lock(ht); + + for (i = 0; i < ht->hashsize; i++) { - j++; - entries = entries->next; + j = 0; + entries = ht->entries[i]; + while (entries) + { + j++; + entries = entries->next; + } + *nelems += j; + if (j > *longest) { + *longest = j; + } } - *nelems += j; - if (j > *longest) { - *longest = j; - } + *hashsize = ht->hashsize; + hashtable_read_unlock(ht); } - *hashsize = ht->hashsize; - hashtable_read_unlock(ht); } diff --git a/server/core/service.c b/server/core/service.c index 4ca702467..e6e4063b1 100644 --- a/server/core/service.c +++ b/server/core/service.c @@ -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; diff --git a/server/core/users.c b/server/core/users.c index 127ec7f22..086a6b81c 100644 --- a/server/core/users.c +++ b/server/core/users.c @@ -183,32 +183,41 @@ char *sep; void *user; dcb_printf(dcb, "Users table data\n"); - dcb_hashtable_stats(dcb, users->data); - if ((iter = hashtable_iterator(users->data)) != NULL) + + if (users == NULL || users->data == NULL) { - dcb_printf(dcb, "User names: "); - sep = ""; + 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: "); + sep = ""; - if (users->usersCustomUserFormat != NULL) { - while ((user = hashtable_next(iter)) != NULL) - { - char *custom_user; - custom_user = users->usersCustomUserFormat(user); - if (custom_user) { - dcb_printf(dcb, "%s%s", sep, custom_user); - free(custom_user); + if (users->usersCustomUserFormat != NULL) { + while ((user = hashtable_next(iter)) != NULL) + { + char *custom_user; + custom_user = users->usersCustomUserFormat(user); + if (custom_user) { + dcb_printf(dcb, "%s%s", sep, custom_user); + free(custom_user); + sep = ", "; + } + } + } else { + while ((user = hashtable_next(iter)) != NULL) + { + dcb_printf(dcb, "%s%s", sep, (char *)user); sep = ", "; } } - } else { - while ((user = hashtable_next(iter)) != NULL) - { - dcb_printf(dcb, "%s%s", sep, (char *)user); - sep = ", "; - } - } - dcb_printf(dcb, "\n"); - hashtable_iterator_free(iter); + hashtable_iterator_free(iter); + } } + dcb_printf(dcb, "\n"); } diff --git a/server/modules/routing/debugcmd.c b/server/modules/routing/debugcmd.c index 3796a0565..545aff554 100644 --- a/server/modules/routing/debugcmd.c +++ b/server/modules/routing/debugcmd.c @@ -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]); + 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]);