From 6ba4935ee2b097251d3c94b0b2037b80ca8f7660 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Pokorn=C3=BD?= Date: Thu, 8 Aug 2019 23:33:48 +0200 Subject: [PATCH 1/2] Fix unability to validate ambiguously constructed interleave for RelaxNG MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Previously, test/relaxng/ambig_name-class.xml would fail to validate for a simple reason -- interleave within "open-name-class" context is supposed to be fine with whatever else is pending the consumption, since effectively, it's unrelated from a higher parsing perspective. Signed-off-by: Jan Pokorný --- relaxng.c | 12 +++++++++++- result/relaxng/ambig_name-class_err | 1 + result/relaxng/ambig_name-class_valid | 0 test/relaxng/ambig_name-class.rng | 1 + test/relaxng/ambig_name-class.xml | 16 ++++++++++++++++ 5 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 result/relaxng/ambig_name-class_err create mode 100644 result/relaxng/ambig_name-class_valid create mode 120000 test/relaxng/ambig_name-class.rng create mode 100644 test/relaxng/ambig_name-class.xml diff --git a/relaxng.c b/relaxng.c index 2f13cbdd1..1c337e3d1 100644 --- a/relaxng.c +++ b/relaxng.c @@ -9476,7 +9476,17 @@ xmlRelaxNGValidateInterleave(xmlRelaxNGValidCtxtPtr ctxt, xmlRelaxNGFreeValidState(ctxt, oldstate); oldstate = ctxt->state; ctxt->state = NULL; - if (cur != NULL) { + if (cur != NULL + /* there's a nasty violation of context-free unambiguities, + since in open-name-class context, interleave in the + production shall finish without caring about anything + else that is OK to follow in that case -- it would + otherwise get marked as "extra content" and would + hence fail the validation, hence this perhaps + dirty attempt to rectify such a situation */ + && (define->parent->type != XML_RELAXNG_DEF + || !xmlStrEqual(define->parent->name, + (const xmlChar *) "open-name-class"))) { VALID_ERR2(XML_RELAXNG_ERR_INTEREXTRA, cur->name); ret = -1; ctxt->state = oldstate; diff --git a/result/relaxng/ambig_name-class_err b/result/relaxng/ambig_name-class_err new file mode 100644 index 000000000..0afe5cd66 --- /dev/null +++ b/result/relaxng/ambig_name-class_err @@ -0,0 +1 @@ +./test/relaxng/ambig_name-class.rng validates diff --git a/result/relaxng/ambig_name-class_valid b/result/relaxng/ambig_name-class_valid new file mode 100644 index 000000000..e69de29bb diff --git a/test/relaxng/ambig_name-class.rng b/test/relaxng/ambig_name-class.rng new file mode 120000 index 000000000..08533d396 --- /dev/null +++ b/test/relaxng/ambig_name-class.rng @@ -0,0 +1 @@ +tutorA.rng \ No newline at end of file diff --git a/test/relaxng/ambig_name-class.xml b/test/relaxng/ambig_name-class.xml new file mode 100644 index 000000000..de673f2e4 --- /dev/null +++ b/test/relaxng/ambig_name-class.xml @@ -0,0 +1,16 @@ + + + + + + alpha + bravo + + + none + all + + + + + -- GitLab From 5ec527fa25746df790e9e21075e27901c545c238 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Pokorn=C3=BD?= Date: Fri, 9 Aug 2019 15:09:22 +0200 Subject: [PATCH 2/2] Fix unability to RelaxNG-validate grammar with choice-based name class MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Previously, test/relaxng/ambig_name-class2.xml would fail to validate against test/relaxng/ambig_name-class2.rng: > test/relaxng/ambig_name-class2.rng:4: > element attribute: Relax-NG parser error : > Found anyName attribute without oneOrMore ancestor > Relax-NG schema test/relaxng/ambig_name-class2.rng failed to compile Signed-off-by: Jan Pokorný --- relaxng.c | 5 ++++- result/relaxng/ambig_name-class2_err | 1 + result/relaxng/ambig_name-class2_valid | 0 test/relaxng/ambig_name-class2.rng | 1 + test/relaxng/ambig_name-class2.xml | 1 + 5 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 result/relaxng/ambig_name-class2_err create mode 100644 result/relaxng/ambig_name-class2_valid create mode 120000 test/relaxng/ambig_name-class2.rng create mode 100644 test/relaxng/ambig_name-class2.xml diff --git a/relaxng.c b/relaxng.c index 1c337e3d1..268c4e760 100644 --- a/relaxng.c +++ b/relaxng.c @@ -6395,7 +6395,10 @@ xmlRelaxNGCheckRules(xmlRelaxNGParserCtxtPtr ctxt, NULL, NULL); } if ((!(flags & XML_RELAXNG_IN_ONEORMORE)) - && (cur->name == NULL)) { + && cur->name == NULL + /* following is checking alternative name class readiness + in case it went the "choice" route */ + && cur->nameClass == NULL) { if (cur->ns == NULL) { xmlRngPErr(ctxt, cur->node, XML_RNGP_ANYNAME_ATTR_ANCESTOR, "Found anyName attribute without oneOrMore ancestor\n", diff --git a/result/relaxng/ambig_name-class2_err b/result/relaxng/ambig_name-class2_err new file mode 100644 index 000000000..2c1ba8d31 --- /dev/null +++ b/result/relaxng/ambig_name-class2_err @@ -0,0 +1 @@ +./test/relaxng/ambig_name-class2.rng validates diff --git a/result/relaxng/ambig_name-class2_valid b/result/relaxng/ambig_name-class2_valid new file mode 100644 index 000000000..e69de29bb diff --git a/test/relaxng/ambig_name-class2.rng b/test/relaxng/ambig_name-class2.rng new file mode 120000 index 000000000..6cc955c1a --- /dev/null +++ b/test/relaxng/ambig_name-class2.rng @@ -0,0 +1 @@ +ambig_name-class.xml \ No newline at end of file diff --git a/test/relaxng/ambig_name-class2.xml b/test/relaxng/ambig_name-class2.xml new file mode 100644 index 000000000..3c1e4e258 --- /dev/null +++ b/test/relaxng/ambig_name-class2.xml @@ -0,0 +1 @@ + -- GitLab