aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2018-12-26 20:08:31 -0500
committerDavid Robillard <d@drobilla.net>2019-12-19 20:55:40 -0500
commitaec6a5355d36123b4cb100a5b77c9a7e2c3d1d84 (patch)
tree3dbb86985b32c3eb5cbb7c94562d4558d5f9aa76
parent23f09378718cd5c334a5a090744cda4dfbcdb091 (diff)
downloadserd-aec6a5355d36123b4cb100a5b77c9a7e2c3d1d84.tar.gz
serd-aec6a5355d36123b4cb100a5b77c9a7e2c3d1d84.tar.bz2
serd-aec6a5355d36123b4cb100a5b77c9a7e2c3d1d84.zip
Ensure serd_new_resolved_uri returns an absolute URI or NULL
-rw-r--r--src/env.c5
-rw-r--r--src/node.c16
-rw-r--r--tests/serd_test.c4
3 files changed, 17 insertions, 8 deletions
diff --git a/src/env.c b/src/env.c
index bba06825..921413f7 100644
--- a/src/env.c
+++ b/src/env.c
@@ -120,11 +120,10 @@ serd_env_set_base_uri(SerdEnv* env,
SerdNode* base_uri_node = serd_new_resolved_uri_i(
serd_node_get_string(uri), &env->base_uri);
- SerdURI base_uri;
- serd_uri_parse(serd_node_get_string(base_uri_node), &base_uri);
-
if (base_uri_node) {
// Replace the current base URI
+ SerdURI base_uri;
+ serd_uri_parse(serd_node_get_string(base_uri_node), &base_uri);
serd_node_free(env->base_uri_node);
env->base_uri_node = base_uri_node;
env->base_uri = base_uri;
diff --git a/src/node.c b/src/node.c
index f496fdbd..5135e69c 100644
--- a/src/node.c
+++ b/src/node.c
@@ -423,14 +423,22 @@ serd_node_resolve(const SerdNode* node, const SerdNode* base)
SerdNode*
serd_new_resolved_uri_i(const char* str, const SerdURI* base)
{
+ SerdNode* result = NULL;
if (!str || str[0] == '\0') {
// Empty URI => Base URI, or nothing if no base is given
- return base ? serd_new_from_uri(base, NULL) : NULL;
+ result = base ? serd_new_from_uri(base, NULL) : NULL;
+ } else {
+ SerdURI uri;
+ serd_uri_parse(str, &uri);
+ result = serd_new_from_uri(&uri, base);
}
- SerdURI uri;
- serd_uri_parse(str, &uri);
- return serd_new_from_uri(&uri, base);
+ if (!serd_uri_string_has_scheme(serd_node_get_string(result))) {
+ serd_node_free(result);
+ return NULL;
+ }
+
+ return result;
}
static inline bool
diff --git a/tests/serd_test.c b/tests/serd_test.c
index 517386ea..a96c3537 100644
--- a/tests/serd_test.c
+++ b/tests/serd_test.c
@@ -547,6 +547,7 @@ test_env(void)
SerdNode* hello = serd_new_string("hello\"");
SerdNode* eg = serd_new_uri("http://example.org/");
SerdNode* foo_u = serd_new_uri("http://example.org/foo");
+ SerdNode* empty = serd_new_uri("");
SerdNode* foo_c = serd_new_curie("eg.2:foo");
SerdNode* b = serd_new_curie("invalid");
SerdNode* pre = serd_new_curie("eg.2");
@@ -555,7 +556,7 @@ test_env(void)
assert(!serd_env_get_base_uri(env));
assert(serd_env_set_base_uri(env, NULL));
- assert(!serd_env_get_base_uri(env));
+ assert(serd_env_set_base_uri(env, empty));
assert(serd_env_set_base_uri(env, hello));
assert(!serd_env_get_base_uri(env));
@@ -616,6 +617,7 @@ test_env(void)
serd_node_free(qualified);
serd_node_free(foo_c);
+ serd_node_free(empty);
serd_node_free(foo_u);
serd_node_free(lit);
serd_node_free(b);