From: Florian Forster Date: Wed, 23 Nov 2011 13:28:27 +0000 (+0100) Subject: src/plugin.[ch]: Add plugin_dispatch_values_secure(). X-Git-Tag: collectd-4.10.5~6 X-Git-Url: https://git.octo.it/?p=collectd.git;a=commitdiff_plain;h=f4523a21e913449db2dbf79de3568b396b179ca1 src/plugin.[ch]: Add plugin_dispatch_values_secure(). Change-Id: I1f7403b2e82edd099f0168d0a0735cd18f8ce05a --- diff --git a/src/plugin.c b/src/plugin.c index 6d7c96e4..3c92df21 100644 --- a/src/plugin.c +++ b/src/plugin.c @@ -1523,6 +1523,52 @@ int plugin_dispatch_values (value_list_t *vl) return (0); } /* int plugin_dispatch_values */ +int plugin_dispatch_values_secure (const value_list_t *vl) +{ + value_list_t vl_copy; + int status; + + if (vl == NULL) + return EINVAL; + + memcpy (&vl_copy, vl, sizeof (vl_copy)); + + /* Write callbacks must not change the values and meta pointers, so we can + * savely skip copying those and make this more efficient. */ + if ((pre_cache_chain == NULL) && (post_cache_chain == NULL)) + return (plugin_dispatch_values (&vl_copy)); + + /* Set pointers to NULL, just to be on the save side. */ + vl_copy.values = NULL; + vl_copy.meta = NULL; + + vl_copy.values = malloc (sizeof (*vl_copy.values) * vl->values_len); + if (vl_copy.values == NULL) + { + ERROR ("plugin_dispatch_values_secure: malloc failed."); + return (ENOMEM); + } + memcpy (vl_copy.values, vl->values, sizeof (*vl_copy.values) * vl->values_len); + + if (vl->meta != NULL) + { + vl_copy.meta = meta_data_clone (vl->meta); + if (vl_copy.meta == NULL) + { + ERROR ("plugin_dispatch_values_secure: meta_data_clone failed."); + free (vl_copy.values); + return (ENOMEM); + } + } /* if (vl->meta) */ + + status = plugin_dispatch_values (&vl_copy); + + meta_data_destroy (vl_copy.meta); + free (vl_copy.values); + + return (status); +} /* int plugin_dispatch_values_secure */ + int plugin_dispatch_notification (const notification_t *notif) { llentry_t *le; diff --git a/src/plugin.h b/src/plugin.h index 3f94dbc8..0b34ab1d 100644 --- a/src/plugin.h +++ b/src/plugin.h @@ -2,7 +2,7 @@ #define PLUGIN_H /** * collectd - src/plugin.h - * Copyright (C) 2005-2008 Florian octo Forster + * Copyright (C) 2005-2011 Florian octo Forster * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the @@ -308,6 +308,7 @@ int plugin_unregister_notification (const char *name); * function. */ int plugin_dispatch_values (value_list_t *vl); +int plugin_dispatch_values_secure (const value_list_t *vl); int plugin_dispatch_notification (const notification_t *notif);