diff options
author | David Robillard <d@drobilla.net> | 2011-08-20 15:48:52 +0000 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2011-08-20 15:48:52 +0000 |
commit | 95697f076150957f01a84315775ab081011714bb (patch) | |
tree | a14005d936870d209bff6cc3bddb943b0fc7e51f | |
parent | 070cbeb20775154aad7538145b547c0a98fc8c7b (diff) | |
download | serd-95697f076150957f01a84315775ab081011714bb.tar.gz serd-95697f076150957f01a84315775ab081011714bb.tar.bz2 serd-95697f076150957f01a84315775ab081011714bb.zip |
Avoid writing illegal Turtle names as a result of URI qualifying (fix #734).
git-svn-id: http://svn.drobilla.net/serd/trunk@210 490d8e77-9747-427b-9fa3-0b8f29cee8a0
-rw-r--r-- | ChangeLog | 1 | ||||
-rw-r--r-- | src/env.c | 38 | ||||
-rw-r--r-- | src/reader.c | 5 |
3 files changed, 41 insertions, 3 deletions
@@ -1,6 +1,7 @@ serd (UNRELEASED) unstable; urgency=low * Fix pretty printing of successive blank descriptions, i.e. "] , [" + * Avoid writing illegal Turtle names as a result of URI qualifying -- David Robillard <d@drobilla.net> UNRELEASED @@ -152,6 +152,41 @@ serd_env_set_prefix(SerdEnv* env, return SERD_SUCCESS; } +static inline bool +is_nameStartChar(const uint8_t c) +{ + // TODO: not strictly correct (see reader.c read_nameStartChar) + return (c >= 'A' && c <= 'Z') || c == '_' || (c >= 'a' && c <= 'z'); +} + +static inline bool +is_nameChar(const uint8_t c) +{ + // TODO: 0x300-0x036F | 0x203F-0x2040 (see reader.c read_nameChar) + return is_nameStartChar(c) || c == '-' + || (c >= '0' && c <= '9') || c == 0xB7; +} + +/** + Return true iff @c buf is a valid Turtle name. +*/ +static inline bool +is_name(const uint8_t* buf, + size_t len) +{ + if (!is_nameStartChar(buf[0])) { + return false; + } + + for (size_t i = 1; i < len; ++i) { + if (!is_nameChar(buf[i])) { + return false; + } + } + + return true; +} + SERD_API bool serd_env_qualify(const SerdEnv* env, @@ -168,6 +203,9 @@ serd_env_qualify(const SerdEnv* env, *prefix_name = env->prefixes[i].name; suffix->buf = uri->buf + prefix_uri->n_bytes; suffix->len = uri->n_bytes - prefix_uri->n_bytes; + if (!is_name(suffix->buf, suffix->len)) { + continue; + } return true; } } diff --git a/src/reader.c b/src/reader.c index e08956ef..24802164 100644 --- a/src/reader.c +++ b/src/reader.c @@ -711,7 +711,7 @@ static inline uchar read_nameStartChar(SerdReader* reader, bool required) { const uint8_t c = peek_byte(reader); - if (c == '_' || is_alpha(c)) { + if (c == '_' || is_alpha(c)) { // TODO: not strictly correct return eat_byte(reader, c); } else { if (required) { @@ -734,8 +734,7 @@ read_nameChar(SerdReader* reader) case '-': case 0xB7: case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': return eat_byte(reader, c); - default: - // TODO: 0x300-0x036F | 0x203F-0x2040 + default: // TODO: 0x300-0x036F | 0x203F-0x2040 return 0; } return 0; |