author | Petr Sumbera <petr.sumbera@oracle.com> |
Wed, 26 Apr 2017 04:31:59 -0700 | |
changeset 7949 | e94c44902e51 |
permissions | -rw-r--r-- |
7949
e94c44902e51
25946856 xmllint --stream broken in libxml2 2.9.4
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
1 |
From 3169602058bd2d04913909e869c61d1540bc7fb4 Mon Sep 17 00:00:00 2001 |
e94c44902e51
25946856 xmllint --stream broken in libxml2 2.9.4
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
2 |
From: Alex Henrie <[email protected]> |
e94c44902e51
25946856 xmllint --stream broken in libxml2 2.9.4
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
3 |
Date: Thu, 26 May 2016 17:38:35 -0600 |
e94c44902e51
25946856 xmllint --stream broken in libxml2 2.9.4
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
4 |
Subject: Fix attribute decoding during XML schema validation |
e94c44902e51
25946856 xmllint --stream broken in libxml2 2.9.4
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
5 |
|
e94c44902e51
25946856 xmllint --stream broken in libxml2 2.9.4
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
6 |
For https://bugzilla.gnome.org/show_bug.cgi?id=766834 |
e94c44902e51
25946856 xmllint --stream broken in libxml2 2.9.4
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
7 |
|
e94c44902e51
25946856 xmllint --stream broken in libxml2 2.9.4
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
8 |
vctxt->parserCtxt is always NULL in xmlSchemaSAXHandleStartElementNs, |
e94c44902e51
25946856 xmllint --stream broken in libxml2 2.9.4
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
9 |
so this function can't call xmlStringLenDecodeEntities to decode the |
e94c44902e51
25946856 xmllint --stream broken in libxml2 2.9.4
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
10 |
entities. |
e94c44902e51
25946856 xmllint --stream broken in libxml2 2.9.4
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
11 |
--- |
e94c44902e51
25946856 xmllint --stream broken in libxml2 2.9.4
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
12 |
xmlschemas.c | 30 +++++++++++++++++++++++++----- |
e94c44902e51
25946856 xmllint --stream broken in libxml2 2.9.4
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
13 |
1 file changed, 25 insertions(+), 5 deletions(-) |
e94c44902e51
25946856 xmllint --stream broken in libxml2 2.9.4
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
14 |
|
e94c44902e51
25946856 xmllint --stream broken in libxml2 2.9.4
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
15 |
diff --git a/xmlschemas.c b/xmlschemas.c |
e94c44902e51
25946856 xmllint --stream broken in libxml2 2.9.4
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
16 |
index 7afe2eb..d42afb7 100644 |
e94c44902e51
25946856 xmllint --stream broken in libxml2 2.9.4
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
17 |
--- a/xmlschemas.c |
e94c44902e51
25946856 xmllint --stream broken in libxml2 2.9.4
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
18 |
+++ b/xmlschemas.c |
e94c44902e51
25946856 xmllint --stream broken in libxml2 2.9.4
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
19 |
@@ -27391,6 +27391,7 @@ xmlSchemaSAXHandleStartElementNs(void *ctx, |
e94c44902e51
25946856 xmllint --stream broken in libxml2 2.9.4
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
20 |
* attributes yet. |
e94c44902e51
25946856 xmllint --stream broken in libxml2 2.9.4
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
21 |
*/ |
e94c44902e51
25946856 xmllint --stream broken in libxml2 2.9.4
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
22 |
if (nb_attributes != 0) { |
e94c44902e51
25946856 xmllint --stream broken in libxml2 2.9.4
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
23 |
+ int valueLen, k, l; |
e94c44902e51
25946856 xmllint --stream broken in libxml2 2.9.4
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
24 |
xmlChar *value; |
e94c44902e51
25946856 xmllint --stream broken in libxml2 2.9.4
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
25 |
|
e94c44902e51
25946856 xmllint --stream broken in libxml2 2.9.4
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
26 |
for (j = 0, i = 0; i < nb_attributes; i++, j += 5) { |
e94c44902e51
25946856 xmllint --stream broken in libxml2 2.9.4
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
27 |
@@ -27400,12 +27401,31 @@ xmlSchemaSAXHandleStartElementNs(void *ctx, |
e94c44902e51
25946856 xmllint --stream broken in libxml2 2.9.4
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
28 |
* libxml2 differs from normal SAX here in that it escapes all ampersands |
e94c44902e51
25946856 xmllint --stream broken in libxml2 2.9.4
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
29 |
* as & instead of delivering the raw converted string. Changing the |
e94c44902e51
25946856 xmllint --stream broken in libxml2 2.9.4
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
30 |
* behavior at this point would break applications that use this API, so |
e94c44902e51
25946856 xmllint --stream broken in libxml2 2.9.4
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
31 |
- * we are forced to work around it. There is no danger of accidentally |
e94c44902e51
25946856 xmllint --stream broken in libxml2 2.9.4
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
32 |
- * decoding some entity other than & in this step because without |
e94c44902e51
25946856 xmllint --stream broken in libxml2 2.9.4
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
33 |
- * unescaped ampersands there can be no other entities in the string. |
e94c44902e51
25946856 xmllint --stream broken in libxml2 2.9.4
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
34 |
+ * we are forced to work around it. |
e94c44902e51
25946856 xmllint --stream broken in libxml2 2.9.4
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
35 |
*/ |
e94c44902e51
25946856 xmllint --stream broken in libxml2 2.9.4
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
36 |
- value = xmlStringLenDecodeEntities(vctxt->parserCtxt, attributes[j+3], |
e94c44902e51
25946856 xmllint --stream broken in libxml2 2.9.4
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
37 |
- attributes[j+4] - attributes[j+3], XML_SUBSTITUTE_REF, 0, 0, 0); |
e94c44902e51
25946856 xmllint --stream broken in libxml2 2.9.4
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
38 |
+ valueLen = attributes[j+4] - attributes[j+3]; |
e94c44902e51
25946856 xmllint --stream broken in libxml2 2.9.4
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
39 |
+ value = xmlMallocAtomic(valueLen + 1); |
e94c44902e51
25946856 xmllint --stream broken in libxml2 2.9.4
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
40 |
+ if (value == NULL) { |
e94c44902e51
25946856 xmllint --stream broken in libxml2 2.9.4
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
41 |
+ xmlSchemaVErrMemory(vctxt, |
e94c44902e51
25946856 xmllint --stream broken in libxml2 2.9.4
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
42 |
+ "allocating string for decoded attribute", |
e94c44902e51
25946856 xmllint --stream broken in libxml2 2.9.4
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
43 |
+ NULL); |
e94c44902e51
25946856 xmllint --stream broken in libxml2 2.9.4
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
44 |
+ goto internal_error; |
e94c44902e51
25946856 xmllint --stream broken in libxml2 2.9.4
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
45 |
+ } |
e94c44902e51
25946856 xmllint --stream broken in libxml2 2.9.4
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
46 |
+ for (k = 0, l = 0; k < valueLen; l++) { |
e94c44902e51
25946856 xmllint --stream broken in libxml2 2.9.4
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
47 |
+ if (k < valueLen - 4 && |
e94c44902e51
25946856 xmllint --stream broken in libxml2 2.9.4
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
48 |
+ attributes[j+3][k+0] == '&' && |
e94c44902e51
25946856 xmllint --stream broken in libxml2 2.9.4
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
49 |
+ attributes[j+3][k+1] == '#' && |
e94c44902e51
25946856 xmllint --stream broken in libxml2 2.9.4
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
50 |
+ attributes[j+3][k+2] == '3' && |
e94c44902e51
25946856 xmllint --stream broken in libxml2 2.9.4
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
51 |
+ attributes[j+3][k+3] == '8' && |
e94c44902e51
25946856 xmllint --stream broken in libxml2 2.9.4
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
52 |
+ attributes[j+3][k+4] == ';') { |
e94c44902e51
25946856 xmllint --stream broken in libxml2 2.9.4
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
53 |
+ value[l] = '&'; |
e94c44902e51
25946856 xmllint --stream broken in libxml2 2.9.4
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
54 |
+ k += 5; |
e94c44902e51
25946856 xmllint --stream broken in libxml2 2.9.4
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
55 |
+ } else { |
e94c44902e51
25946856 xmllint --stream broken in libxml2 2.9.4
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
56 |
+ value[l] = attributes[j+3][k]; |
e94c44902e51
25946856 xmllint --stream broken in libxml2 2.9.4
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
57 |
+ k++; |
e94c44902e51
25946856 xmllint --stream broken in libxml2 2.9.4
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
58 |
+ } |
e94c44902e51
25946856 xmllint --stream broken in libxml2 2.9.4
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
59 |
+ } |
e94c44902e51
25946856 xmllint --stream broken in libxml2 2.9.4
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
60 |
+ value[l] = '\0'; |
e94c44902e51
25946856 xmllint --stream broken in libxml2 2.9.4
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
61 |
/* |
e94c44902e51
25946856 xmllint --stream broken in libxml2 2.9.4
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
62 |
* TODO: Set the node line. |
e94c44902e51
25946856 xmllint --stream broken in libxml2 2.9.4
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
63 |
*/ |
e94c44902e51
25946856 xmllint --stream broken in libxml2 2.9.4
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
64 |
-- |
e94c44902e51
25946856 xmllint --stream broken in libxml2 2.9.4
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
65 |
cgit v0.12 |
e94c44902e51
25946856 xmllint --stream broken in libxml2 2.9.4
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
66 |