From 854f30a91fc6a2accc6bf49cb7fcc52b498fda2a Mon Sep 17 00:00:00 2001 From: Chris Dunlap Date: Sun, 19 Oct 2014 12:05:07 -0700 Subject: Protect against adding duplicate strings in ZED The zed_strings container stores strings in an AVL, but does not check for duplicate strings being added. Within the AVL, strings are indexed by the string value itself. avl_add() requires the node being added must not already exist in the tree, and will assert() if this is not the case. This should not cause problems in practice. ZED uses this container in two places. In zed_conf.c, it is used to store the names of enabled zedlets as zed scans the zedlet directory listing; duplicate entries cannot occur here since duplicate names cannot occur within a directory. In zed_event.c, it is used to store the environment variables (as "NAME=VALUE" strings) that will be passed to zedlets; duplicate strings here should never happen unless there is a bug resulting in a duplicate nvpair or environment variable. This commit protects against adding a duplicate to a zed_strings container by first checking for the string being added, and removing the previous entry should one exist. This implements a "last one wins" policy. This commit also changes the prototype for zed_strings_add() to allow the string key (by which it is indexed in the AVL) to differ from the string value. By adding zedlet environment variables using the variable name as the key, multiple adds for the same variable name will result in only the last value being stored. Finally, this commit routes all additions of zedlet environment variables through the updated _zed_event_add_var(). This ensures all zedlet environment variable names are properly converted. Signed-off-by: Chris Dunlap Signed-off-by: Brian Behlendorf Closes #3042 --- cmd/zed/zed_strings.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'cmd/zed/zed_strings.h') diff --git a/cmd/zed/zed_strings.h b/cmd/zed/zed_strings.h index c1ea804bb..07e85e23f 100644 --- a/cmd/zed/zed_strings.h +++ b/cmd/zed/zed_strings.h @@ -33,7 +33,7 @@ zed_strings_t * zed_strings_create(void); void zed_strings_destroy(zed_strings_t *zsp); -int zed_strings_add(zed_strings_t *zsp, const char *s); +int zed_strings_add(zed_strings_t *zsp, const char *key, const char *s); const char * zed_strings_first(zed_strings_t *zsp); -- cgit v1.2.3