From 4895c7016139e2e59c17b1d9c39aa3eca90399da Mon Sep 17 00:00:00 2001 From: Simon Horman Date: Mon, 14 Nov 2011 17:41:28 +0900 Subject: [PATCH] Make unixctl_command_register() idempotent The assert() statement in unixctl_command_register() implies that it is intended to be idempotent but inserting the same name and callback twice would fail because: * The callback is not stored directly in the hash, rather it the cb element of a struct unixctl_command which is stored in the hash. * Insertion would be attempted even if the entry was already present. --- lib/unixctl.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/lib/unixctl.c b/lib/unixctl.c index 7cc7e5e23..d75166fe4 100644 --- a/lib/unixctl.c +++ b/lib/unixctl.c @@ -115,9 +115,14 @@ unixctl_command_register(const char *name, const char *args, unixctl_cb_func *cb, void *aux) { struct unixctl_command *command; + struct unixctl_command *lookup = shash_find_data(&commands, name); + + assert(!lookup || lookup->cb == cb); + + if (lookup) { + return; + } - assert(!shash_find_data(&commands, name) - || shash_find_data(&commands, name) == cb); command = xmalloc(sizeof *command); command->args = args; command->cb = cb; -- 2.43.0