From: Jim Radford Date: Fri, 16 Aug 2013 23:19:46 +0000 (-0700) Subject: curl_json plugin: avoid cache aliasing by using all fields instead of the final two X-Git-Tag: collectd-5.5.0~264^2 X-Git-Url: https://git.verplant.org/?a=commitdiff_plain;h=31451e507c73a58255f7bd5feb703d013e1a622d;p=collectd.git curl_json plugin: avoid cache aliasing by using all fields instead of the final two The following two keys Key workers/*/requests Key workers/*/apps/*/requests can both lead to type_instance's of say 0-requests which would alias in the cache. If, instead of just the final two key name components, we use all of them it would lead to these Key workers-0-requests Key workers-0-apps-0-requests which would not overlap. --- diff --git a/src/curl_json.c b/src/curl_json.c index deee460b..fefc28b1 100644 --- a/src/curl_json.c +++ b/src/curl_json.c @@ -749,11 +749,10 @@ static void cj_submit (cj_t *db, cj_key_t *key, value_t *value) /* {{{ */ if (key->instance == NULL) { - if ((db->depth == 0) || (strcmp ("", db->state[db->depth-1].name) == 0)) - sstrncpy (vl.type_instance, db->state[db->depth].name, sizeof (vl.type_instance)); - else - ssnprintf (vl.type_instance, sizeof (vl.type_instance), "%s-%s", - db->state[db->depth-1].name, db->state[db->depth].name); + int i, len = 0; + for (i = 0; i < db->depth; i++) + len += ssnprintf(vl.type_instance+len, sizeof(vl.type_instance)-len, + i ? "-%s" : "%s", db->state[i+1].name); } else sstrncpy (vl.type_instance, key->instance, sizeof (vl.type_instance));