summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDave Beckett <dave@dajobe.org>2010-01-29 20:19:14 -0800
committerDave Beckett <dave@dajobe.org>2010-01-29 20:19:14 -0800
commit436179a75aa781efd4691ae9a1b6371d8ab39c8f (patch)
tree5f9a50cff947c0e5586be43756ccb0f83389ea1b
parentec281ff40e14e010d525724ef40debe22ea7d246 (diff)
downloadraptor-436179a75aa781efd4691ae9a1b6371d8ab39c8f.tar.gz
Ensure serialized Turtle names are legal
(raptor_turtle_is_legal_turtle_qname): Added to enforce prefix and local name character constraints. (raptor_turtle_emit_resource): Use above to ensure that XML Qnames that are not legal Turtle Qnames are never serialized. Fixes Issue#0000337 http://bugs.librdf.org/mantis/view.php?id=337
-rw-r--r--src/raptor_serialize_turtle.c38
1 files changed, 37 insertions, 1 deletions
diff --git a/src/raptor_serialize_turtle.c b/src/raptor_serialize_turtle.c
index 0e8c4a5e..f0140930 100644
--- a/src/raptor_serialize_turtle.c
+++ b/src/raptor_serialize_turtle.c
@@ -3,7 +3,7 @@
* raptor_serialize_turtle.c - Turtle serializer
*
* Copyright (C) 2006,2008 Dave Robillard
- * Copyright (C) 2004-2009 David Beckett http://www.dajobe.org/
+ * Copyright (C) 2004-2010 David Beckett http://www.dajobe.org/
* Copyright (C) 2004-2005 University of Bristol, UK http://www.bristol.ac.uk/
* Copyright (C) 2005 Steve Shepard steveshep@gmail.com
*
@@ -129,6 +129,36 @@ static int raptor_turtle_serialize_end(raptor_serializer* serializer);
static void raptor_turtle_serialize_finish_factory(raptor_serializer_factory* factory);
+static int
+raptor_turtle_is_legal_turtle_qname(raptor_qname* qname)
+{
+ const char* prefix_name;
+ const char* local_name;
+
+ if(!qname)
+ return 0;
+
+ prefix_name = qname->nspace ? (const char*)qname->nspace->prefix : NULL;
+ if(prefix_name) {
+ /* prefixName: must have leading [A-Z][a-z][0-9] (nameStartChar - '_') */
+ /* prefixName: no . anywhere */
+ if(!(isalpha(*prefix_name) || isdigit(*prefix_name)) ||
+ strchr(prefix_name, '.'))
+ return 0;
+ }
+
+ local_name = (const char*)qname->local_name;
+ if(local_name) {
+ /* nameStartChar: must have leading [A-Z][a-z][0-9]_ */
+ /* nameChar: no . anywhere */
+ if(!(isalpha(*local_name) || isdigit(*local_name) || *local_name == '_') ||
+ strchr(local_name, '.'))
+ return 0;
+ }
+
+ return 1;
+}
+
/*
* raptor_turtle_emit_resource:
* @serializer: #raptor_serializer object
@@ -159,6 +189,12 @@ raptor_turtle_emit_resource(raptor_serializer *serializer,
qname = raptor_namespaces_qname_from_uri(context->nstack,
node->value.resource.uri, 10);
+ /* XML Names allow leading '_' and '.' anywhere but Turtle does not */
+ if(qname && !raptor_turtle_is_legal_turtle_qname(qname)) {
+ raptor_free_qname(qname);
+ qname = NULL;
+ }
+
if(qname) {
raptor_turtle_writer_qname(turtle_writer, qname);
raptor_free_qname(qname);