X-Git-Url: https://git.octo.it/?p=collectd.git;a=blobdiff_plain;f=src%2Fcurl_xml.c;h=c99e3f1df058946446469861b54b2317a742e8f2;hp=8931407b027af47c85c200ca9275c084d89aa32f;hb=da11ce02eb202b3e01d3e2d1b40f248a84430973;hpb=cb03ebb8e8c0966a350f0188a427e3fbf28799b5 diff --git a/src/curl_xml.c b/src/curl_xml.c index 8931407b..c99e3f1d 100644 --- a/src/curl_xml.c +++ b/src/curl_xml.c @@ -157,13 +157,14 @@ static void cx_xpath_list_free(llist_t *list) /* {{{ */ while (le != NULL) { llentry_t *le_next = le->next; + /* this also frees xpath->path used for le->key */ cx_xpath_free(le->value); le = le_next; } llist_destroy(list); -} /* }}} void cx_list_free */ +} /* }}} void cx_xpath_list_free */ static void cx_free(void *arg) /* {{{ */ { @@ -275,6 +276,9 @@ static int cx_if_not_text_node(xmlNodePtr node) /* {{{ */ return -1; } /* }}} cx_if_not_text_node */ +/* + * Returned value should be freed with xmlFree(). + */ static char *cx_get_text_node_value(xmlXPathContextPtr xpath_ctx, /* {{{ */ char *expr, const char *from_option) { xmlXPathObjectPtr values_node_obj = cx_evaluate_xpath(xpath_ctx, expr); @@ -286,18 +290,18 @@ static char *cx_get_text_node_value(xmlXPathContextPtr xpath_ctx, /* {{{ */ if (tmp_size == 0) { WARNING("curl_xml plugin: " - "relative xpath expression \"%s\" %sdoesn't match " + "relative xpath expression \"%s\" from '%s' doesn't match " "any of the nodes.", - expr, (from_option == NULL) ? "" : from_option); + expr, from_option); xmlXPathFreeObject(values_node_obj); return NULL; } if (tmp_size > 1) { WARNING("curl_xml plugin: " - "relative xpath expression \"%s\" %sis expected to return " + "relative xpath expression \"%s\" from '%s' is expected to return " "only one text node. Skipping the node.", - expr, (from_option == NULL) ? "" : from_option); + expr, from_option); xmlXPathFreeObject(values_node_obj); return NULL; } @@ -305,10 +309,10 @@ static char *cx_get_text_node_value(xmlXPathContextPtr xpath_ctx, /* {{{ */ /* ignoring the element if other than textnode/attribute*/ if (cx_if_not_text_node(values_node->nodeTab[0])) { WARNING("curl_xml plugin: " - "relative xpath expression \"%s\" %sis expected to return " + "relative xpath expression \"%s\" from '%s' is expected to return " "only text/attribute node which is not the case. " "Skipping the node.", - expr, (from_option == NULL) ? "" : from_option); + expr, from_option); xmlXPathFreeObject(values_node_obj); return NULL; } @@ -326,7 +330,7 @@ static int cx_handle_single_value_xpath(xmlXPathContextPtr xpath_ctx, /* {{{ */ value_list_t *vl, int index) { char *node_value = cx_get_text_node_value( - xpath_ctx, xpath->values[index].path, "from 'ValuesFrom' "); + xpath_ctx, xpath->values[index].path, "ValuesFrom"); if (node_value == NULL) return -1; @@ -352,7 +356,7 @@ static int cx_handle_single_value_xpath(xmlXPathContextPtr xpath_ctx, /* {{{ */ /* endptr = */ NULL); } - sfree(node_value); + xmlFree(node_value); /* We have reached here which means that * we have got something to work */ @@ -385,8 +389,8 @@ static int cx_handle_instance_xpath(xmlXPathContextPtr xpath_ctx, /* {{{ */ /* Handle type instance */ if (xpath->instance != NULL) { - char *node_value = cx_get_text_node_value(xpath_ctx, xpath->instance, - "from 'InstanceFrom' "); + char *node_value = + cx_get_text_node_value(xpath_ctx, xpath->instance, "InstanceFrom"); if (node_value == NULL) return -1; @@ -396,7 +400,7 @@ static int cx_handle_instance_xpath(xmlXPathContextPtr xpath_ctx, /* {{{ */ else sstrncpy(vl->type_instance, node_value, sizeof(vl->type_instance)); - sfree(node_value); + xmlFree(node_value); } else if (xpath->instance_prefix != NULL) sstrncpy(vl->type_instance, xpath->instance_prefix, sizeof(vl->type_instance)); @@ -404,13 +408,13 @@ static int cx_handle_instance_xpath(xmlXPathContextPtr xpath_ctx, /* {{{ */ /* Handle plugin instance */ if (xpath->plugin_instance_from != NULL) { char *node_value = cx_get_text_node_value( - xpath_ctx, xpath->plugin_instance_from, "from 'PluginInstanceFrom' "); + xpath_ctx, xpath->plugin_instance_from, "PluginInstanceFrom"); if (node_value == NULL) return -1; sstrncpy(vl->plugin_instance, node_value, sizeof(vl->plugin_instance)); - sfree(node_value); + xmlFree(node_value); } return 0; @@ -448,6 +452,7 @@ static int cx_handle_xpath(const cx_t *db, /* {{{ */ "since the base xpath expression \"%s\" " "returned multiple results. Skipping the xpath block...", xpath->path); + xmlXPathFreeObject(base_node_obj); return -1; }