File 0003-Separate-URL-query-parsing-from-parsing-list-of-URLs.patch of Package openwsman.16287
From 3836dde52959a6b2949cc72fce29bfff04e216aa Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Klaus=20K=C3=A4mpf?= <kkaempf@suse.de>
Date: Mon, 15 Dec 2014 15:56:44 +0100
Subject: [PATCH 3/6] Separate URL query parsing from parsing list of URLs,
fixes #48
The fix to #38 introduced a regression and broken parsing of
vendor_namespaces in src/plugins/cim/cim_data.c
The real cause is the mis-use of u_parse_query to parse a
comma-separated list of URLs.
The real fix is to separate URL query parsing from parsing a list of
URLs
---
include/u/uri.h | 1 +
src/lib/u/uri.c | 17 +++++++++++++++--
src/plugins/cim/cim_data.c | 4 +++-
3 files changed, 19 insertions(+), 3 deletions(-)
diff --git a/include/u/uri.h b/include/u/uri.h
index d9d32332955e..bf4967086f7f 100644
--- a/include/u/uri.h
+++ b/include/u/uri.h
@@ -26,6 +26,7 @@ typedef struct u_uri_s u_uri_t;
int u_uri_parse (const char *s, u_uri_t **pu);
void u_uri_free (u_uri_t *uri);
hash_t *u_parse_query(const char *query);
+hash_t *u_parse_list(const char *list);
#ifdef __cplusplus
}
diff --git a/src/lib/u/uri.c b/src/lib/u/uri.c
index f686e5cb55f4..abc6ecdeb633 100644
--- a/src/lib/u/uri.c
+++ b/src/lib/u/uri.c
@@ -201,18 +201,20 @@ static int u_string_unify(char *s)
}
-hash_t *u_parse_query(const char *query)
+static hash_t *
+_u_parse(const char *query, const char *separator)
{
char *pp, *tok, *src, *q = NULL;
char *key=NULL, *val=NULL;
hash_t *h = NULL;
dbg_err_if(query == NULL);
+ dbg_err_if(separator == NULL);
q = u_strdup(query);
h = hash_create3(HASHCOUNT_T_MAX, 0, 0);
/* foreach name=value pair... */
- for (src = q; (tok = strtok_r(src, "&", &pp)) != NULL; src = NULL) {
+ for (src = q; (tok = strtok_r(src, separator, &pp)) != NULL; src = NULL) {
/* dup the string so we can modify it */
key = u_strdup(tok);
dbg_err_if(key == NULL);
@@ -257,6 +259,17 @@ err:
return NULL;
}
+hash_t *
+u_parse_query(const char *query)
+{
+ return _u_parse(query, "&");
+}
+
+hash_t *
+u_parse_list(const char *list)
+{
+ return _u_parse(list, ",");
+}
diff --git a/src/plugins/cim/cim_data.c b/src/plugins/cim/cim_data.c
index 3dce8036324a..0f1885cc4a94 100644
--- a/src/plugins/cim/cim_data.c
+++ b/src/plugins/cim/cim_data.c
@@ -102,6 +102,7 @@ set_vendor_namespaces(void)
(WsSupportedNamespaces *)u_malloc(sizeof(WsSupportedNamespaces));
ns->class_prefix = CimResource_Namespaces[i].class_prefix;
ns->ns = (char*) CimResource_Namespaces[i].ns;
+ debug("Namespace %s => %s", ns->class_prefix, ns->ns);
lnode_t *node = lnode_create(ns);
list_append(l, node);
}
@@ -113,6 +114,7 @@ set_vendor_namespaces(void)
(WsSupportedNamespaces *)u_malloc(sizeof(WsSupportedNamespaces));
ns->class_prefix = (char*)hnode_getkey(hn);
ns->ns = (char*) hnode_get(hn);
+ debug("Namespace %s => %s", ns->class_prefix, ns->ns);
lnode_t *node = lnode_create(ns);
list_append(l, node);
}
@@ -169,7 +171,7 @@ void set_config( void *self, dictionary *config )
indication_profile_implementation_ns = iniparser_getstring(config, "cim:indication_profile_implementation_ns", "root/interop");
debug("vendor namespaces: %s", namespaces);
if (namespaces) {
- hash_t * t = u_parse_query(namespaces);
+ hash_t * t = u_parse_list(namespaces);
if (t) {
vendor_namespaces = t;
}
--
2.1.4