diff options
13 files changed, 15 insertions, 1723 deletions
diff --git a/meta/recipes-core/libxml/libxml2/libxml-m4-use-pkgconfig.patch b/meta/recipes-core/libxml/libxml2/libxml-m4-use-pkgconfig.patch index 3277165618..d9ed1516fe 100644 --- a/meta/recipes-core/libxml/libxml2/libxml-m4-use-pkgconfig.patch +++ b/meta/recipes-core/libxml/libxml2/libxml-m4-use-pkgconfig.patch | |||
| @@ -183,7 +183,7 @@ index 68cd824..5fa0a9b 100644 | |||
| 183 | - echo "*** If you have an old version installed, it is best to remove it, although" | 183 | - echo "*** If you have an old version installed, it is best to remove it, although" |
| 184 | - echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH" ], | 184 | - echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH" ], |
| 185 | - [ echo "*** The test program failed to compile or link. See the file config.log for the" | 185 | - [ echo "*** The test program failed to compile or link. See the file config.log for the" |
| 186 | - echo "*** exact error that occured. This usually means LIBXML was incorrectly installed" | 186 | - echo "*** exact error that occurred. This usually means LIBXML was incorrectly installed" |
| 187 | - echo "*** or that you have moved LIBXML since it was installed. In the latter case, you" | 187 | - echo "*** or that you have moved LIBXML since it was installed. In the latter case, you" |
| 188 | - echo "*** may want to edit the xml2-config script: $XML2_CONFIG" ]) | 188 | - echo "*** may want to edit the xml2-config script: $XML2_CONFIG" ]) |
| 189 | - CPPFLAGS="$ac_save_CPPFLAGS" | 189 | - CPPFLAGS="$ac_save_CPPFLAGS" |
diff --git a/meta/recipes-core/libxml/libxml2/libxml2-CVE-2016-4658.patch b/meta/recipes-core/libxml/libxml2/libxml2-CVE-2016-4658.patch deleted file mode 100644 index bb55eed171..0000000000 --- a/meta/recipes-core/libxml/libxml2/libxml2-CVE-2016-4658.patch +++ /dev/null | |||
| @@ -1,269 +0,0 @@ | |||
| 1 | libxml2-2.9.4: Fix CVE-2016-4658 | ||
| 2 | |||
| 3 | [No upstream tracking] -- https://bugzilla.redhat.com/show_bug.cgi?id=CVE-2016-4658 | ||
| 4 | |||
| 5 | xpointer: Disallow namespace nodes in XPointer points and ranges | ||
| 6 | |||
| 7 | Namespace nodes must be copied to avoid use-after-free errors. | ||
| 8 | But they don't necessarily have a physical representation in a | ||
| 9 | document, so simply disallow them in XPointer ranges. | ||
| 10 | |||
| 11 | Upstream-Status: Backport | ||
| 12 | - [https://git.gnome.org/browse/libxml2/commit/?id=c1d1f7121194036608bf555f08d3062a36fd344b] | ||
| 13 | - [https://git.gnome.org/browse/libxml2/commit/?id=3f8a91036d338e51c059d54397a42d645f019c65] | ||
| 14 | CVE: CVE-2016-4658 | ||
| 15 | Signed-off-by: Andrej Valek <andrej.valek@siemens.com> | ||
| 16 | Signed-off-by: Pascal Bach <pascal.bach@siemens.com> | ||
| 17 | |||
| 18 | diff --git a/xpointer.c b/xpointer.c | ||
| 19 | index 676c510..911680d 100644 | ||
| 20 | --- a/xpointer.c | ||
| 21 | +++ b/xpointer.c | ||
| 22 | @@ -320,6 +320,45 @@ xmlXPtrRangesEqual(xmlXPathObjectPtr range1, xmlXPathObjectPtr range2) { | ||
| 23 | } | ||
| 24 | |||
| 25 | /** | ||
| 26 | + * xmlXPtrNewRangeInternal: | ||
| 27 | + * @start: the starting node | ||
| 28 | + * @startindex: the start index | ||
| 29 | + * @end: the ending point | ||
| 30 | + * @endindex: the ending index | ||
| 31 | + * | ||
| 32 | + * Internal function to create a new xmlXPathObjectPtr of type range | ||
| 33 | + * | ||
| 34 | + * Returns the newly created object. | ||
| 35 | + */ | ||
| 36 | +static xmlXPathObjectPtr | ||
| 37 | +xmlXPtrNewRangeInternal(xmlNodePtr start, int startindex, | ||
| 38 | + xmlNodePtr end, int endindex) { | ||
| 39 | + xmlXPathObjectPtr ret; | ||
| 40 | + | ||
| 41 | + /* | ||
| 42 | + * Namespace nodes must be copied (see xmlXPathNodeSetDupNs). | ||
| 43 | + * Disallow them for now. | ||
| 44 | + */ | ||
| 45 | + if ((start != NULL) && (start->type == XML_NAMESPACE_DECL)) | ||
| 46 | + return(NULL); | ||
| 47 | + if ((end != NULL) && (end->type == XML_NAMESPACE_DECL)) | ||
| 48 | + return(NULL); | ||
| 49 | + | ||
| 50 | + ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); | ||
| 51 | + if (ret == NULL) { | ||
| 52 | + xmlXPtrErrMemory("allocating range"); | ||
| 53 | + return(NULL); | ||
| 54 | + } | ||
| 55 | + memset(ret, 0, sizeof(xmlXPathObject)); | ||
| 56 | + ret->type = XPATH_RANGE; | ||
| 57 | + ret->user = start; | ||
| 58 | + ret->index = startindex; | ||
| 59 | + ret->user2 = end; | ||
| 60 | + ret->index2 = endindex; | ||
| 61 | + return(ret); | ||
| 62 | +} | ||
| 63 | + | ||
| 64 | +/** | ||
| 65 | * xmlXPtrNewRange: | ||
| 66 | * @start: the starting node | ||
| 67 | * @startindex: the start index | ||
| 68 | @@ -344,17 +383,7 @@ xmlXPtrNewRange(xmlNodePtr start, int startindex, | ||
| 69 | if (endindex < 0) | ||
| 70 | return(NULL); | ||
| 71 | |||
| 72 | - ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); | ||
| 73 | - if (ret == NULL) { | ||
| 74 | - xmlXPtrErrMemory("allocating range"); | ||
| 75 | - return(NULL); | ||
| 76 | - } | ||
| 77 | - memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); | ||
| 78 | - ret->type = XPATH_RANGE; | ||
| 79 | - ret->user = start; | ||
| 80 | - ret->index = startindex; | ||
| 81 | - ret->user2 = end; | ||
| 82 | - ret->index2 = endindex; | ||
| 83 | + ret = xmlXPtrNewRangeInternal(start, startindex, end, endindex); | ||
| 84 | xmlXPtrRangeCheckOrder(ret); | ||
| 85 | return(ret); | ||
| 86 | } | ||
| 87 | @@ -381,17 +410,8 @@ xmlXPtrNewRangePoints(xmlXPathObjectPtr start, xmlXPathObjectPtr end) { | ||
| 88 | if (end->type != XPATH_POINT) | ||
| 89 | return(NULL); | ||
| 90 | |||
| 91 | - ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); | ||
| 92 | - if (ret == NULL) { | ||
| 93 | - xmlXPtrErrMemory("allocating range"); | ||
| 94 | - return(NULL); | ||
| 95 | - } | ||
| 96 | - memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); | ||
| 97 | - ret->type = XPATH_RANGE; | ||
| 98 | - ret->user = start->user; | ||
| 99 | - ret->index = start->index; | ||
| 100 | - ret->user2 = end->user; | ||
| 101 | - ret->index2 = end->index; | ||
| 102 | + ret = xmlXPtrNewRangeInternal(start->user, start->index, end->user, | ||
| 103 | + end->index); | ||
| 104 | xmlXPtrRangeCheckOrder(ret); | ||
| 105 | return(ret); | ||
| 106 | } | ||
| 107 | @@ -416,17 +436,7 @@ xmlXPtrNewRangePointNode(xmlXPathObjectPtr start, xmlNodePtr end) { | ||
| 108 | if (start->type != XPATH_POINT) | ||
| 109 | return(NULL); | ||
| 110 | |||
| 111 | - ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); | ||
| 112 | - if (ret == NULL) { | ||
| 113 | - xmlXPtrErrMemory("allocating range"); | ||
| 114 | - return(NULL); | ||
| 115 | - } | ||
| 116 | - memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); | ||
| 117 | - ret->type = XPATH_RANGE; | ||
| 118 | - ret->user = start->user; | ||
| 119 | - ret->index = start->index; | ||
| 120 | - ret->user2 = end; | ||
| 121 | - ret->index2 = -1; | ||
| 122 | + ret = xmlXPtrNewRangeInternal(start->user, start->index, end, -1); | ||
| 123 | xmlXPtrRangeCheckOrder(ret); | ||
| 124 | return(ret); | ||
| 125 | } | ||
| 126 | @@ -453,17 +463,7 @@ xmlXPtrNewRangeNodePoint(xmlNodePtr start, xmlXPathObjectPtr end) { | ||
| 127 | if (end->type != XPATH_POINT) | ||
| 128 | return(NULL); | ||
| 129 | |||
| 130 | - ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); | ||
| 131 | - if (ret == NULL) { | ||
| 132 | - xmlXPtrErrMemory("allocating range"); | ||
| 133 | - return(NULL); | ||
| 134 | - } | ||
| 135 | - memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); | ||
| 136 | - ret->type = XPATH_RANGE; | ||
| 137 | - ret->user = start; | ||
| 138 | - ret->index = -1; | ||
| 139 | - ret->user2 = end->user; | ||
| 140 | - ret->index2 = end->index; | ||
| 141 | + ret = xmlXPtrNewRangeInternal(start, -1, end->user, end->index); | ||
| 142 | xmlXPtrRangeCheckOrder(ret); | ||
| 143 | return(ret); | ||
| 144 | } | ||
| 145 | @@ -486,17 +486,7 @@ xmlXPtrNewRangeNodes(xmlNodePtr start, xmlNodePtr end) { | ||
| 146 | if (end == NULL) | ||
| 147 | return(NULL); | ||
| 148 | |||
| 149 | - ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); | ||
| 150 | - if (ret == NULL) { | ||
| 151 | - xmlXPtrErrMemory("allocating range"); | ||
| 152 | - return(NULL); | ||
| 153 | - } | ||
| 154 | - memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); | ||
| 155 | - ret->type = XPATH_RANGE; | ||
| 156 | - ret->user = start; | ||
| 157 | - ret->index = -1; | ||
| 158 | - ret->user2 = end; | ||
| 159 | - ret->index2 = -1; | ||
| 160 | + ret = xmlXPtrNewRangeInternal(start, -1, end, -1); | ||
| 161 | xmlXPtrRangeCheckOrder(ret); | ||
| 162 | return(ret); | ||
| 163 | } | ||
| 164 | @@ -516,17 +506,7 @@ xmlXPtrNewCollapsedRange(xmlNodePtr start) { | ||
| 165 | if (start == NULL) | ||
| 166 | return(NULL); | ||
| 167 | |||
| 168 | - ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); | ||
| 169 | - if (ret == NULL) { | ||
| 170 | - xmlXPtrErrMemory("allocating range"); | ||
| 171 | - return(NULL); | ||
| 172 | - } | ||
| 173 | - memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); | ||
| 174 | - ret->type = XPATH_RANGE; | ||
| 175 | - ret->user = start; | ||
| 176 | - ret->index = -1; | ||
| 177 | - ret->user2 = NULL; | ||
| 178 | - ret->index2 = -1; | ||
| 179 | + ret = xmlXPtrNewRangeInternal(start, -1, NULL, -1); | ||
| 180 | return(ret); | ||
| 181 | } | ||
| 182 | |||
| 183 | @@ -541,6 +521,8 @@ xmlXPtrNewCollapsedRange(xmlNodePtr start) { | ||
| 184 | */ | ||
| 185 | xmlXPathObjectPtr | ||
| 186 | xmlXPtrNewRangeNodeObject(xmlNodePtr start, xmlXPathObjectPtr end) { | ||
| 187 | + xmlNodePtr endNode; | ||
| 188 | + int endIndex; | ||
| 189 | xmlXPathObjectPtr ret; | ||
| 190 | |||
| 191 | if (start == NULL) | ||
| 192 | @@ -549,7 +531,12 @@ xmlXPtrNewRangeNodeObject(xmlNodePtr start, xmlXPathObjectPtr end) { | ||
| 193 | return(NULL); | ||
| 194 | switch (end->type) { | ||
| 195 | case XPATH_POINT: | ||
| 196 | + endNode = end->user; | ||
| 197 | + endIndex = end->index; | ||
| 198 | + break; | ||
| 199 | case XPATH_RANGE: | ||
| 200 | + endNode = end->user2; | ||
| 201 | + endIndex = end->index2; | ||
| 202 | break; | ||
| 203 | case XPATH_NODESET: | ||
| 204 | /* | ||
| 205 | @@ -557,39 +544,15 @@ xmlXPtrNewRangeNodeObject(xmlNodePtr start, xmlXPathObjectPtr end) { | ||
| 206 | */ | ||
| 207 | if (end->nodesetval->nodeNr <= 0) | ||
| 208 | return(NULL); | ||
| 209 | + endNode = end->nodesetval->nodeTab[end->nodesetval->nodeNr - 1]; | ||
| 210 | + endIndex = -1; | ||
| 211 | break; | ||
| 212 | default: | ||
| 213 | /* TODO */ | ||
| 214 | return(NULL); | ||
| 215 | } | ||
| 216 | |||
| 217 | - ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); | ||
| 218 | - if (ret == NULL) { | ||
| 219 | - xmlXPtrErrMemory("allocating range"); | ||
| 220 | - return(NULL); | ||
| 221 | - } | ||
| 222 | - memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); | ||
| 223 | - ret->type = XPATH_RANGE; | ||
| 224 | - ret->user = start; | ||
| 225 | - ret->index = -1; | ||
| 226 | - switch (end->type) { | ||
| 227 | - case XPATH_POINT: | ||
| 228 | - ret->user2 = end->user; | ||
| 229 | - ret->index2 = end->index; | ||
| 230 | - break; | ||
| 231 | - case XPATH_RANGE: | ||
| 232 | - ret->user2 = end->user2; | ||
| 233 | - ret->index2 = end->index2; | ||
| 234 | - break; | ||
| 235 | - case XPATH_NODESET: { | ||
| 236 | - ret->user2 = end->nodesetval->nodeTab[end->nodesetval->nodeNr - 1]; | ||
| 237 | - ret->index2 = -1; | ||
| 238 | - break; | ||
| 239 | - } | ||
| 240 | - default: | ||
| 241 | - STRANGE | ||
| 242 | - return(NULL); | ||
| 243 | - } | ||
| 244 | + ret = xmlXPtrNewRangeInternal(start, -1, endNode, endIndex); | ||
| 245 | xmlXPtrRangeCheckOrder(ret); | ||
| 246 | return(ret); | ||
| 247 | } | ||
| 248 | @@ -1835,8 +1798,8 @@ xmlXPtrStartPointFunction(xmlXPathParserContextPtr ctxt, int nargs) { | ||
| 249 | case XPATH_RANGE: { | ||
| 250 | xmlNodePtr node = tmp->user; | ||
| 251 | if (node != NULL) { | ||
| 252 | - if (node->type == XML_ATTRIBUTE_NODE) { | ||
| 253 | - /* TODO: Namespace Nodes ??? */ | ||
| 254 | + if ((node->type == XML_ATTRIBUTE_NODE) || | ||
| 255 | + (node->type == XML_NAMESPACE_DECL)) { | ||
| 256 | xmlXPathFreeObject(obj); | ||
| 257 | xmlXPtrFreeLocationSet(newset); | ||
| 258 | XP_ERROR(XPTR_SYNTAX_ERROR); | ||
| 259 | @@ -1931,8 +1894,8 @@ xmlXPtrEndPointFunction(xmlXPathParserContextPtr ctxt, int nargs) { | ||
| 260 | case XPATH_RANGE: { | ||
| 261 | xmlNodePtr node = tmp->user2; | ||
| 262 | if (node != NULL) { | ||
| 263 | - if (node->type == XML_ATTRIBUTE_NODE) { | ||
| 264 | - /* TODO: Namespace Nodes ??? */ | ||
| 265 | + if ((node->type == XML_ATTRIBUTE_NODE) || | ||
| 266 | + (node->type == XML_NAMESPACE_DECL)) { | ||
| 267 | xmlXPathFreeObject(obj); | ||
| 268 | xmlXPtrFreeLocationSet(newset); | ||
| 269 | XP_ERROR(XPTR_SYNTAX_ERROR); | ||
diff --git a/meta/recipes-core/libxml/libxml2/libxml2-CVE-2016-5131.patch b/meta/recipes-core/libxml/libxml2/libxml2-CVE-2016-5131.patch deleted file mode 100644 index 9d47d023a9..0000000000 --- a/meta/recipes-core/libxml/libxml2/libxml2-CVE-2016-5131.patch +++ /dev/null | |||
| @@ -1,180 +0,0 @@ | |||
| 1 | From 9ab01a277d71f54d3143c2cf333c5c2e9aaedd9e Mon Sep 17 00:00:00 2001 | ||
| 2 | From: Nick Wellnhofer <wellnhofer@aevum.de> | ||
| 3 | Date: Tue, 28 Jun 2016 14:22:23 +0200 | ||
| 4 | Subject: [PATCH] Fix XPointer paths beginning with range-to | ||
| 5 | |||
| 6 | The old code would invoke the broken xmlXPtrRangeToFunction. range-to | ||
| 7 | isn't really a function but a special kind of location step. Remove | ||
| 8 | this function and always handle range-to in the XPath code. | ||
| 9 | |||
| 10 | The old xmlXPtrRangeToFunction could also be abused to trigger a | ||
| 11 | use-after-free error with the potential for remote code execution. | ||
| 12 | |||
| 13 | Found with afl-fuzz. | ||
| 14 | |||
| 15 | Fixes CVE-2016-5131. | ||
| 16 | |||
| 17 | CVE: CVE-2016-5131 | ||
| 18 | Upstream-Status: Backport | ||
| 19 | https://git.gnome.org/browse/libxml2/commit/?id=9ab01a277d71f54d3143c2cf333c5c2e9aaedd9e | ||
| 20 | |||
| 21 | Signed-off-by: Yi Zhao <yi.zhao@windirver.com> | ||
| 22 | --- | ||
| 23 | result/XPath/xptr/vidbase | 13 ++++++++ | ||
| 24 | test/XPath/xptr/vidbase | 1 + | ||
| 25 | xpath.c | 7 ++++- | ||
| 26 | xpointer.c | 76 ++++------------------------------------------- | ||
| 27 | 4 files changed, 26 insertions(+), 71 deletions(-) | ||
| 28 | |||
| 29 | diff --git a/result/XPath/xptr/vidbase b/result/XPath/xptr/vidbase | ||
| 30 | index 8b9e92d..f19193e 100644 | ||
| 31 | --- a/result/XPath/xptr/vidbase | ||
| 32 | +++ b/result/XPath/xptr/vidbase | ||
| 33 | @@ -17,3 +17,16 @@ Object is a Location Set: | ||
| 34 | To node | ||
| 35 | ELEMENT p | ||
| 36 | |||
| 37 | + | ||
| 38 | +======================== | ||
| 39 | +Expression: xpointer(range-to(id('chapter2'))) | ||
| 40 | +Object is a Location Set: | ||
| 41 | +1 : Object is a range : | ||
| 42 | + From node | ||
| 43 | + / | ||
| 44 | + To node | ||
| 45 | + ELEMENT chapter | ||
| 46 | + ATTRIBUTE id | ||
| 47 | + TEXT | ||
| 48 | + content=chapter2 | ||
| 49 | + | ||
| 50 | diff --git a/test/XPath/xptr/vidbase b/test/XPath/xptr/vidbase | ||
| 51 | index b146383..884b106 100644 | ||
| 52 | --- a/test/XPath/xptr/vidbase | ||
| 53 | +++ b/test/XPath/xptr/vidbase | ||
| 54 | @@ -1,2 +1,3 @@ | ||
| 55 | xpointer(id('chapter1')/p) | ||
| 56 | xpointer(id('chapter1')/p[1]/range-to(following-sibling::p[2])) | ||
| 57 | +xpointer(range-to(id('chapter2'))) | ||
| 58 | diff --git a/xpath.c b/xpath.c | ||
| 59 | index d992841..5a01b1b 100644 | ||
| 60 | --- a/xpath.c | ||
| 61 | +++ b/xpath.c | ||
| 62 | @@ -10691,13 +10691,18 @@ xmlXPathCompPathExpr(xmlXPathParserContextPtr ctxt) { | ||
| 63 | lc = 1; | ||
| 64 | break; | ||
| 65 | } else if ((NXT(len) == '(')) { | ||
| 66 | - /* Note Type or Function */ | ||
| 67 | + /* Node Type or Function */ | ||
| 68 | if (xmlXPathIsNodeType(name)) { | ||
| 69 | #ifdef DEBUG_STEP | ||
| 70 | xmlGenericError(xmlGenericErrorContext, | ||
| 71 | "PathExpr: Type search\n"); | ||
| 72 | #endif | ||
| 73 | lc = 1; | ||
| 74 | +#ifdef LIBXML_XPTR_ENABLED | ||
| 75 | + } else if (ctxt->xptr && | ||
| 76 | + xmlStrEqual(name, BAD_CAST "range-to")) { | ||
| 77 | + lc = 1; | ||
| 78 | +#endif | ||
| 79 | } else { | ||
| 80 | #ifdef DEBUG_STEP | ||
| 81 | xmlGenericError(xmlGenericErrorContext, | ||
| 82 | diff --git a/xpointer.c b/xpointer.c | ||
| 83 | index 676c510..d74174a 100644 | ||
| 84 | --- a/xpointer.c | ||
| 85 | +++ b/xpointer.c | ||
| 86 | @@ -1332,8 +1332,6 @@ xmlXPtrNewContext(xmlDocPtr doc, xmlNodePtr here, xmlNodePtr origin) { | ||
| 87 | ret->here = here; | ||
| 88 | ret->origin = origin; | ||
| 89 | |||
| 90 | - xmlXPathRegisterFunc(ret, (xmlChar *)"range-to", | ||
| 91 | - xmlXPtrRangeToFunction); | ||
| 92 | xmlXPathRegisterFunc(ret, (xmlChar *)"range", | ||
| 93 | xmlXPtrRangeFunction); | ||
| 94 | xmlXPathRegisterFunc(ret, (xmlChar *)"range-inside", | ||
| 95 | @@ -2243,76 +2241,14 @@ xmlXPtrRangeInsideFunction(xmlXPathParserContextPtr ctxt, int nargs) { | ||
| 96 | * @nargs: the number of args | ||
| 97 | * | ||
| 98 | * Implement the range-to() XPointer function | ||
| 99 | + * | ||
| 100 | + * Obsolete. range-to is not a real function but a special type of location | ||
| 101 | + * step which is handled in xpath.c. | ||
| 102 | */ | ||
| 103 | void | ||
| 104 | -xmlXPtrRangeToFunction(xmlXPathParserContextPtr ctxt, int nargs) { | ||
| 105 | - xmlXPathObjectPtr range; | ||
| 106 | - const xmlChar *cur; | ||
| 107 | - xmlXPathObjectPtr res, obj; | ||
| 108 | - xmlXPathObjectPtr tmp; | ||
| 109 | - xmlLocationSetPtr newset = NULL; | ||
| 110 | - xmlNodeSetPtr oldset; | ||
| 111 | - int i; | ||
| 112 | - | ||
| 113 | - if (ctxt == NULL) return; | ||
| 114 | - CHECK_ARITY(1); | ||
| 115 | - /* | ||
| 116 | - * Save the expression pointer since we will have to evaluate | ||
| 117 | - * it multiple times. Initialize the new set. | ||
| 118 | - */ | ||
| 119 | - CHECK_TYPE(XPATH_NODESET); | ||
| 120 | - obj = valuePop(ctxt); | ||
| 121 | - oldset = obj->nodesetval; | ||
| 122 | - ctxt->context->node = NULL; | ||
| 123 | - | ||
| 124 | - cur = ctxt->cur; | ||
| 125 | - newset = xmlXPtrLocationSetCreate(NULL); | ||
| 126 | - | ||
| 127 | - for (i = 0; i < oldset->nodeNr; i++) { | ||
| 128 | - ctxt->cur = cur; | ||
| 129 | - | ||
| 130 | - /* | ||
| 131 | - * Run the evaluation with a node list made of a single item | ||
| 132 | - * in the nodeset. | ||
| 133 | - */ | ||
| 134 | - ctxt->context->node = oldset->nodeTab[i]; | ||
| 135 | - tmp = xmlXPathNewNodeSet(ctxt->context->node); | ||
| 136 | - valuePush(ctxt, tmp); | ||
| 137 | - | ||
| 138 | - xmlXPathEvalExpr(ctxt); | ||
| 139 | - CHECK_ERROR; | ||
| 140 | - | ||
| 141 | - /* | ||
| 142 | - * The result of the evaluation need to be tested to | ||
| 143 | - * decided whether the filter succeeded or not | ||
| 144 | - */ | ||
| 145 | - res = valuePop(ctxt); | ||
| 146 | - range = xmlXPtrNewRangeNodeObject(oldset->nodeTab[i], res); | ||
| 147 | - if (range != NULL) { | ||
| 148 | - xmlXPtrLocationSetAdd(newset, range); | ||
| 149 | - } | ||
| 150 | - | ||
| 151 | - /* | ||
| 152 | - * Cleanup | ||
| 153 | - */ | ||
| 154 | - if (res != NULL) | ||
| 155 | - xmlXPathFreeObject(res); | ||
| 156 | - if (ctxt->value == tmp) { | ||
| 157 | - res = valuePop(ctxt); | ||
| 158 | - xmlXPathFreeObject(res); | ||
| 159 | - } | ||
| 160 | - | ||
| 161 | - ctxt->context->node = NULL; | ||
| 162 | - } | ||
| 163 | - | ||
| 164 | - /* | ||
| 165 | - * The result is used as the new evaluation set. | ||
| 166 | - */ | ||
| 167 | - xmlXPathFreeObject(obj); | ||
| 168 | - ctxt->context->node = NULL; | ||
| 169 | - ctxt->context->contextSize = -1; | ||
| 170 | - ctxt->context->proximityPosition = -1; | ||
| 171 | - valuePush(ctxt, xmlXPtrWrapLocationSet(newset)); | ||
| 172 | +xmlXPtrRangeToFunction(xmlXPathParserContextPtr ctxt, | ||
| 173 | + int nargs ATTRIBUTE_UNUSED) { | ||
| 174 | + XP_ERROR(XPATH_EXPR_ERROR); | ||
| 175 | } | ||
| 176 | |||
| 177 | /** | ||
| 178 | -- | ||
| 179 | 2.7.4 | ||
| 180 | |||
diff --git a/meta/recipes-core/libxml/libxml2/libxml2-CVE-2017-0663.patch b/meta/recipes-core/libxml/libxml2/libxml2-CVE-2017-0663.patch deleted file mode 100644 index 0108265855..0000000000 --- a/meta/recipes-core/libxml/libxml2/libxml2-CVE-2017-0663.patch +++ /dev/null | |||
| @@ -1,40 +0,0 @@ | |||
| 1 | libxml2: Fix CVE-2017-0663 | ||
| 2 | |||
| 3 | [No upstream tracking] -- https://bugzilla.gnome.org/show_bug.cgi?id=780228 | ||
| 4 | |||
| 5 | valid: Fix type confusion in xmlValidateOneNamespace | ||
| 6 | |||
| 7 | Comment out code that casts xmlNsPtr to xmlAttrPtr. ID types | ||
| 8 | on namespace declarations make no practical sense anyway. | ||
| 9 | |||
| 10 | Fixes bug 780228 | ||
| 11 | |||
| 12 | Upstream-Status: Backport [https://git.gnome.org/browse/libxml2/commit/?id=92b9e8c8b3787068565a1820ba575d042f9eec66] | ||
| 13 | CVE: CVE-2017-0663 | ||
| 14 | Signed-off-by: Andrej Valek <andrej.valek@siemens.com> | ||
| 15 | |||
| 16 | diff --git a/valid.c b/valid.c | ||
| 17 | index 19f84b8..e03d35e 100644 | ||
| 18 | --- a/valid.c | ||
| 19 | +++ b/valid.c | ||
| 20 | @@ -4621,6 +4621,12 @@ xmlNodePtr elem, const xmlChar *prefix, xmlNsPtr ns, const xmlChar *value) { | ||
| 21 | } | ||
| 22 | } | ||
| 23 | |||
| 24 | + /* | ||
| 25 | + * Casting ns to xmlAttrPtr is wrong. We'd need separate functions | ||
| 26 | + * xmlAddID and xmlAddRef for namespace declarations, but it makes | ||
| 27 | + * no practical sense to use ID types anyway. | ||
| 28 | + */ | ||
| 29 | +#if 0 | ||
| 30 | /* Validity Constraint: ID uniqueness */ | ||
| 31 | if (attrDecl->atype == XML_ATTRIBUTE_ID) { | ||
| 32 | if (xmlAddID(ctxt, doc, value, (xmlAttrPtr) ns) == NULL) | ||
| 33 | @@ -4632,6 +4638,7 @@ xmlNodePtr elem, const xmlChar *prefix, xmlNsPtr ns, const xmlChar *value) { | ||
| 34 | if (xmlAddRef(ctxt, doc, value, (xmlAttrPtr) ns) == NULL) | ||
| 35 | ret = 0; | ||
| 36 | } | ||
| 37 | +#endif | ||
| 38 | |||
| 39 | /* Validity Constraint: Notation Attributes */ | ||
| 40 | if (attrDecl->atype == XML_ATTRIBUTE_NOTATION) { | ||
diff --git a/meta/recipes-core/libxml/libxml2/libxml2-CVE-2017-5969.patch b/meta/recipes-core/libxml/libxml2/libxml2-CVE-2017-5969.patch deleted file mode 100644 index 571b05c087..0000000000 --- a/meta/recipes-core/libxml/libxml2/libxml2-CVE-2017-5969.patch +++ /dev/null | |||
| @@ -1,62 +0,0 @@ | |||
| 1 | libxml2-2.9.4: Fix CVE-2017-5969 | ||
| 2 | |||
| 3 | [No upstream tracking] -- https://bugzilla.gnome.org/show_bug.cgi?id=758422 | ||
| 4 | |||
| 5 | valid: Fix NULL pointer deref in xmlDumpElementContent | ||
| 6 | |||
| 7 | Can only be triggered in recovery mode. | ||
| 8 | |||
| 9 | Fixes bug 758422 | ||
| 10 | |||
| 11 | Upstream-Status: Backport - [https://git.gnome.org/browse/libxml2/commit/?id=94691dc884d1a8ada39f073408b4bb92fe7fe882] | ||
| 12 | CVE: CVE-2017-5969 | ||
| 13 | Signed-off-by: Andrej Valek <andrej.valek@siemens.com> | ||
| 14 | |||
| 15 | diff --git a/valid.c b/valid.c | ||
| 16 | index 19f84b8..0a8e58a 100644 | ||
| 17 | --- a/valid.c | ||
| 18 | +++ b/valid.c | ||
| 19 | @@ -1172,29 +1172,33 @@ xmlDumpElementContent(xmlBufferPtr buf, xmlElementContentPtr content, int glob) | ||
| 20 | xmlBufferWriteCHAR(buf, content->name); | ||
| 21 | break; | ||
| 22 | case XML_ELEMENT_CONTENT_SEQ: | ||
| 23 | - if ((content->c1->type == XML_ELEMENT_CONTENT_OR) || | ||
| 24 | - (content->c1->type == XML_ELEMENT_CONTENT_SEQ)) | ||
| 25 | + if ((content->c1 != NULL) && | ||
| 26 | + ((content->c1->type == XML_ELEMENT_CONTENT_OR) || | ||
| 27 | + (content->c1->type == XML_ELEMENT_CONTENT_SEQ))) | ||
| 28 | xmlDumpElementContent(buf, content->c1, 1); | ||
| 29 | else | ||
| 30 | xmlDumpElementContent(buf, content->c1, 0); | ||
| 31 | xmlBufferWriteChar(buf, " , "); | ||
| 32 | - if ((content->c2->type == XML_ELEMENT_CONTENT_OR) || | ||
| 33 | - ((content->c2->type == XML_ELEMENT_CONTENT_SEQ) && | ||
| 34 | - (content->c2->ocur != XML_ELEMENT_CONTENT_ONCE))) | ||
| 35 | + if ((content->c2 != NULL) && | ||
| 36 | + ((content->c2->type == XML_ELEMENT_CONTENT_OR) || | ||
| 37 | + ((content->c2->type == XML_ELEMENT_CONTENT_SEQ) && | ||
| 38 | + (content->c2->ocur != XML_ELEMENT_CONTENT_ONCE)))) | ||
| 39 | xmlDumpElementContent(buf, content->c2, 1); | ||
| 40 | else | ||
| 41 | xmlDumpElementContent(buf, content->c2, 0); | ||
| 42 | break; | ||
| 43 | case XML_ELEMENT_CONTENT_OR: | ||
| 44 | - if ((content->c1->type == XML_ELEMENT_CONTENT_OR) || | ||
| 45 | - (content->c1->type == XML_ELEMENT_CONTENT_SEQ)) | ||
| 46 | + if ((content->c1 != NULL) && | ||
| 47 | + ((content->c1->type == XML_ELEMENT_CONTENT_OR) || | ||
| 48 | + (content->c1->type == XML_ELEMENT_CONTENT_SEQ))) | ||
| 49 | xmlDumpElementContent(buf, content->c1, 1); | ||
| 50 | else | ||
| 51 | xmlDumpElementContent(buf, content->c1, 0); | ||
| 52 | xmlBufferWriteChar(buf, " | "); | ||
| 53 | - if ((content->c2->type == XML_ELEMENT_CONTENT_SEQ) || | ||
| 54 | - ((content->c2->type == XML_ELEMENT_CONTENT_OR) && | ||
| 55 | - (content->c2->ocur != XML_ELEMENT_CONTENT_ONCE))) | ||
| 56 | + if ((content->c2 != NULL) && | ||
| 57 | + ((content->c2->type == XML_ELEMENT_CONTENT_SEQ) || | ||
| 58 | + ((content->c2->type == XML_ELEMENT_CONTENT_OR) && | ||
| 59 | + (content->c2->ocur != XML_ELEMENT_CONTENT_ONCE)))) | ||
| 60 | xmlDumpElementContent(buf, content->c2, 1); | ||
| 61 | else | ||
| 62 | xmlDumpElementContent(buf, content->c2, 0); | ||
diff --git a/meta/recipes-core/libxml/libxml2/libxml2-CVE-2017-8872.patch b/meta/recipes-core/libxml/libxml2/libxml2-CVE-2017-8872.patch deleted file mode 100644 index 26779aa572..0000000000 --- a/meta/recipes-core/libxml/libxml2/libxml2-CVE-2017-8872.patch +++ /dev/null | |||
| @@ -1,37 +0,0 @@ | |||
| 1 | From d2f873a541c72b0f67e15562819bf98b884b30b7 Mon Sep 17 00:00:00 2001 | ||
| 2 | From: Hongxu Jia <hongxu.jia@windriver.com> | ||
| 3 | Date: Wed, 23 Aug 2017 16:04:49 +0800 | ||
| 4 | Subject: [PATCH] fix CVE-2017-8872 | ||
| 5 | |||
| 6 | this makes xmlHaltParser "empty" the buffer, as it resets cur and ava | ||
| 7 | il too here. | ||
| 8 | |||
| 9 | this seems to cure this specific issue, and also passes the testsuite | ||
| 10 | |||
| 11 | Signed-off-by: Marcus Meissner <meissner@suse.de> | ||
| 12 | |||
| 13 | https://bugzilla.gnome.org/show_bug.cgi?id=775200 | ||
| 14 | Upstream-Status: Backport [https://bugzilla.gnome.org/attachment.cgi?id=355527&action=diff] | ||
| 15 | Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com> | ||
| 16 | --- | ||
| 17 | parser.c | 4 ++++ | ||
| 18 | 1 file changed, 4 insertions(+) | ||
| 19 | |||
| 20 | diff --git a/parser.c b/parser.c | ||
| 21 | index 9506ead..6c07ffd 100644 | ||
| 22 | --- a/parser.c | ||
| 23 | +++ b/parser.c | ||
| 24 | @@ -12664,6 +12664,10 @@ xmlHaltParser(xmlParserCtxtPtr ctxt) { | ||
| 25 | } | ||
| 26 | ctxt->input->cur = BAD_CAST""; | ||
| 27 | ctxt->input->base = ctxt->input->cur; | ||
| 28 | + if (ctxt->input->buf) { | ||
| 29 | + xmlBufEmpty (ctxt->input->buf->buffer); | ||
| 30 | + } else | ||
| 31 | + ctxt->input->length = 0; | ||
| 32 | } | ||
| 33 | } | ||
| 34 | |||
| 35 | -- | ||
| 36 | 2.7.4 | ||
| 37 | |||
diff --git a/meta/recipes-core/libxml/libxml2/libxml2-CVE-2017-9047_CVE-2017-9048.patch b/meta/recipes-core/libxml/libxml2/libxml2-CVE-2017-9047_CVE-2017-9048.patch deleted file mode 100644 index 8b034560fa..0000000000 --- a/meta/recipes-core/libxml/libxml2/libxml2-CVE-2017-9047_CVE-2017-9048.patch +++ /dev/null | |||
| @@ -1,103 +0,0 @@ | |||
| 1 | libxml2-2.9.4: Fix CVE-2017-9047 and CVE-2017-9048 | ||
| 2 | |||
| 3 | [No upstream tracking] -- https://bugzilla.gnome.org/show_bug.cgi?id=781333 | ||
| 4 | -- https://bugzilla.gnome.org/show_bug.cgi?id=781701 | ||
| 5 | |||
| 6 | valid: Fix buffer size checks in xmlSnprintfElementContent | ||
| 7 | |||
| 8 | xmlSnprintfElementContent failed to correctly check the available | ||
| 9 | buffer space in two locations. | ||
| 10 | |||
| 11 | Fixes bug 781333 and bug 781701 | ||
| 12 | |||
| 13 | Upstream-Status: Backport [https://git.gnome.org/browse/libxml2/commit/?id=932cc9896ab41475d4aa429c27d9afd175959d74] | ||
| 14 | CVE: CVE-2017-9047 CVE-2017-9048 | ||
| 15 | Signed-off-by: Andrej Valek <andrej.valek@siemens.com> | ||
| 16 | |||
| 17 | diff --git a/result/valid/781333.xml b/result/valid/781333.xml | ||
| 18 | new file mode 100644 | ||
| 19 | index 0000000..01baf11 | ||
| 20 | --- /dev/null | ||
| 21 | +++ b/result/valid/781333.xml | ||
| 22 | @@ -0,0 +1,5 @@ | ||
| 23 | +<?xml version="1.0"?> | ||
| 24 | +<!DOCTYPE a [ | ||
| 25 | +<!ELEMENT a (pppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppp:llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll)> | ||
| 26 | +]> | ||
| 27 | +<a/> | ||
| 28 | diff --git a/result/valid/781333.xml.err b/result/valid/781333.xml.err | ||
| 29 | new file mode 100644 | ||
| 30 | index 0000000..2176200 | ||
| 31 | --- /dev/null | ||
| 32 | +++ b/result/valid/781333.xml.err | ||
| 33 | @@ -0,0 +1,3 @@ | ||
| 34 | +./test/valid/781333.xml:4: element a: validity error : Element a content does not follow the DTD, expecting ( ..., got | ||
| 35 | +<a/> | ||
| 36 | + ^ | ||
| 37 | diff --git a/result/valid/781333.xml.err.rdr b/result/valid/781333.xml.err.rdr | ||
| 38 | new file mode 100644 | ||
| 39 | index 0000000..1195a04 | ||
| 40 | --- /dev/null | ||
| 41 | +++ b/result/valid/781333.xml.err.rdr | ||
| 42 | @@ -0,0 +1,6 @@ | ||
| 43 | +./test/valid/781333.xml:4: element a: validity error : Element a content does not follow the DTD, expecting ( ..., got | ||
| 44 | +<a/> | ||
| 45 | + ^ | ||
| 46 | +./test/valid/781333.xml:5: element a: validity error : Element a content does not follow the DTD, Expecting more child | ||
| 47 | + | ||
| 48 | +^ | ||
| 49 | diff --git a/test/valid/781333.xml b/test/valid/781333.xml | ||
| 50 | new file mode 100644 | ||
| 51 | index 0000000..bceac9c | ||
| 52 | --- /dev/null | ||
| 53 | +++ b/test/valid/781333.xml | ||
| 54 | @@ -0,0 +1,4 @@ | ||
| 55 | +<!DOCTYPE a [ | ||
| 56 | + <!ELEMENT a (pppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppp:llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll)> | ||
| 57 | +]> | ||
| 58 | +<a/> | ||
| 59 | diff --git a/valid.c b/valid.c | ||
| 60 | index 19f84b8..aaa30f6 100644 | ||
| 61 | --- a/valid.c | ||
| 62 | +++ b/valid.c | ||
| 63 | @@ -1262,22 +1262,23 @@ xmlSnprintfElementContent(char *buf, int size, xmlElementContentPtr content, int | ||
| 64 | case XML_ELEMENT_CONTENT_PCDATA: | ||
| 65 | strcat(buf, "#PCDATA"); | ||
| 66 | break; | ||
| 67 | - case XML_ELEMENT_CONTENT_ELEMENT: | ||
| 68 | + case XML_ELEMENT_CONTENT_ELEMENT: { | ||
| 69 | + int qnameLen = xmlStrlen(content->name); | ||
| 70 | + | ||
| 71 | + if (content->prefix != NULL) | ||
| 72 | + qnameLen += xmlStrlen(content->prefix) + 1; | ||
| 73 | + if (size - len < qnameLen + 10) { | ||
| 74 | + strcat(buf, " ..."); | ||
| 75 | + return; | ||
| 76 | + } | ||
| 77 | if (content->prefix != NULL) { | ||
| 78 | - if (size - len < xmlStrlen(content->prefix) + 10) { | ||
| 79 | - strcat(buf, " ..."); | ||
| 80 | - return; | ||
| 81 | - } | ||
| 82 | strcat(buf, (char *) content->prefix); | ||
| 83 | strcat(buf, ":"); | ||
| 84 | } | ||
| 85 | - if (size - len < xmlStrlen(content->name) + 10) { | ||
| 86 | - strcat(buf, " ..."); | ||
| 87 | - return; | ||
| 88 | - } | ||
| 89 | if (content->name != NULL) | ||
| 90 | strcat(buf, (char *) content->name); | ||
| 91 | break; | ||
| 92 | + } | ||
| 93 | case XML_ELEMENT_CONTENT_SEQ: | ||
| 94 | if ((content->c1->type == XML_ELEMENT_CONTENT_OR) || | ||
| 95 | (content->c1->type == XML_ELEMENT_CONTENT_SEQ)) | ||
| 96 | @@ -1319,6 +1320,7 @@ xmlSnprintfElementContent(char *buf, int size, xmlElementContentPtr content, int | ||
| 97 | xmlSnprintfElementContent(buf, size, content->c2, 0); | ||
| 98 | break; | ||
| 99 | } | ||
| 100 | + if (size - strlen(buf) <= 2) return; | ||
| 101 | if (englob) | ||
| 102 | strcat(buf, ")"); | ||
| 103 | switch (content->ocur) { | ||
diff --git a/meta/recipes-core/libxml/libxml2/libxml2-CVE-2017-9049_CVE-2017-9050.patch b/meta/recipes-core/libxml/libxml2/libxml2-CVE-2017-9049_CVE-2017-9050.patch deleted file mode 100644 index 591075de3c..0000000000 --- a/meta/recipes-core/libxml/libxml2/libxml2-CVE-2017-9049_CVE-2017-9050.patch +++ /dev/null | |||
| @@ -1,291 +0,0 @@ | |||
| 1 | libxml2-2.9.4: Fix CVE-2017-9049 and CVE-2017-9050 | ||
| 2 | |||
| 3 | [No upstream tracking] -- https://bugzilla.gnome.org/show_bug.cgi?id=781205 | ||
| 4 | -- https://bugzilla.gnome.org/show_bug.cgi?id=781361 | ||
| 5 | |||
| 6 | parser: Fix handling of parameter-entity references | ||
| 7 | |||
| 8 | There were two bugs where parameter-entity references could lead to an | ||
| 9 | unexpected change of the input buffer in xmlParseNameComplex and | ||
| 10 | xmlDictLookup being called with an invalid pointer. | ||
| 11 | |||
| 12 | Percent sign in DTD Names | ||
| 13 | ========================= | ||
| 14 | |||
| 15 | The NEXTL macro used to call xmlParserHandlePEReference. When parsing | ||
| 16 | "complex" names inside the DTD, this could result in entity expansion | ||
| 17 | which created a new input buffer. The fix is to simply remove the call | ||
| 18 | to xmlParserHandlePEReference from the NEXTL macro. This is safe because | ||
| 19 | no users of the macro require expansion of parameter entities. | ||
| 20 | |||
| 21 | - xmlParseNameComplex | ||
| 22 | - xmlParseNCNameComplex | ||
| 23 | - xmlParseNmtoken | ||
| 24 | |||
| 25 | The percent sign is not allowed in names, which are grammatical tokens. | ||
| 26 | |||
| 27 | - xmlParseEntityValue | ||
| 28 | |||
| 29 | Parameter-entity references in entity values are expanded but this | ||
| 30 | happens in a separate step in this function. | ||
| 31 | |||
| 32 | - xmlParseSystemLiteral | ||
| 33 | |||
| 34 | Parameter-entity references are ignored in the system literal. | ||
| 35 | |||
| 36 | - xmlParseAttValueComplex | ||
| 37 | - xmlParseCharDataComplex | ||
| 38 | - xmlParseCommentComplex | ||
| 39 | - xmlParsePI | ||
| 40 | - xmlParseCDSect | ||
| 41 | |||
| 42 | Parameter-entity references are ignored outside the DTD. | ||
| 43 | |||
| 44 | - xmlLoadEntityContent | ||
| 45 | |||
| 46 | This function is only called from xmlStringLenDecodeEntities and | ||
| 47 | entities are replaced in a separate step immediately after the function | ||
| 48 | call. | ||
| 49 | |||
| 50 | This bug could also be triggered with an internal subset and double | ||
| 51 | entity expansion. | ||
| 52 | |||
| 53 | This fixes bug 766956 initially reported by Wei Lei and independently by | ||
| 54 | Chromium's ClusterFuzz, Hanno Böck, and Marco Grassi. Thanks to everyone | ||
| 55 | involved. | ||
| 56 | |||
| 57 | xmlParseNameComplex with XML_PARSE_OLD10 | ||
| 58 | ======================================== | ||
| 59 | |||
| 60 | When parsing Names inside an expanded parameter entity with the | ||
| 61 | XML_PARSE_OLD10 option, xmlParseNameComplex would call xmlGROW via the | ||
| 62 | GROW macro if the input buffer was exhausted. At the end of the | ||
| 63 | parameter entity's replacement text, this function would then call | ||
| 64 | xmlPopInput which invalidated the input buffer. | ||
| 65 | |||
| 66 | There should be no need to invoke GROW in this situation because the | ||
| 67 | buffer is grown periodically every XML_PARSER_CHUNK_SIZE characters and, | ||
| 68 | at least for UTF-8, in xmlCurrentChar. This also matches the code path | ||
| 69 | executed when XML_PARSE_OLD10 is not set. | ||
| 70 | |||
| 71 | This fixes bugs 781205 (CVE-2017-9049) and 781361 (CVE-2017-9050). | ||
| 72 | Thanks to Marcel Böhme and Thuan Pham for the report. | ||
| 73 | |||
| 74 | Additional hardening | ||
| 75 | ==================== | ||
| 76 | |||
| 77 | A separate check was added in xmlParseNameComplex to validate the | ||
| 78 | buffer size. | ||
| 79 | |||
| 80 | Fixes bug 781205 and bug 781361 | ||
| 81 | |||
| 82 | Upstream-Status: Backport [https://git.gnome.org/browse/libxml2/commit/?id=932cc9896ab41475d4aa429c27d9afd175959d74] | ||
| 83 | CVE: CVE-2017-9049 CVE-2017-9050 | ||
| 84 | Signed-off-by: Andrej Valek <andrej.valek@siemens.com> | ||
| 85 | |||
| 86 | diff --git a/Makefile.am b/Makefile.am | ||
| 87 | index 9f988b0..dab15a4 100644 | ||
| 88 | --- a/Makefile.am | ||
| 89 | +++ b/Makefile.am | ||
| 90 | @@ -422,6 +422,24 @@ Errtests : xmllint$(EXEEXT) | ||
| 91 | if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \ | ||
| 92 | rm result.$$name error.$$name ; \ | ||
| 93 | fi ; fi ; done) | ||
| 94 | + @echo "## Error cases regression tests (old 1.0)" | ||
| 95 | + -@(for i in $(srcdir)/test/errors10/*.xml ; do \ | ||
| 96 | + name=`basename $$i`; \ | ||
| 97 | + if [ ! -d $$i ] ; then \ | ||
| 98 | + if [ ! -f $(srcdir)/result/errors10/$$name ] ; then \ | ||
| 99 | + echo New test file $$name ; \ | ||
| 100 | + $(CHECKER) $(top_builddir)/xmllint --oldxml10 $$i \ | ||
| 101 | + 2> $(srcdir)/result/errors10/$$name.err \ | ||
| 102 | + > $(srcdir)/result/errors10/$$name ; \ | ||
| 103 | + grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0"; \ | ||
| 104 | + else \ | ||
| 105 | + log=`$(CHECKER) $(top_builddir)/xmllint --oldxml10 $$i 2> error.$$name > result.$$name ; \ | ||
| 106 | + grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0"; \ | ||
| 107 | + diff $(srcdir)/result/errors10/$$name result.$$name ; \ | ||
| 108 | + diff $(srcdir)/result/errors10/$$name.err error.$$name` ; \ | ||
| 109 | + if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \ | ||
| 110 | + rm result.$$name error.$$name ; \ | ||
| 111 | + fi ; fi ; done) | ||
| 112 | @echo "## Error cases stream regression tests" | ||
| 113 | -@(for i in $(srcdir)/test/errors/*.xml ; do \ | ||
| 114 | name=`basename $$i`; \ | ||
| 115 | diff --git a/parser.c b/parser.c | ||
| 116 | index 609a270..8e11c12 100644 | ||
| 117 | --- a/parser.c | ||
| 118 | +++ b/parser.c | ||
| 119 | @@ -2115,7 +2115,6 @@ static void xmlGROW (xmlParserCtxtPtr ctxt) { | ||
| 120 | ctxt->input->line++; ctxt->input->col = 1; \ | ||
| 121 | } else ctxt->input->col++; \ | ||
| 122 | ctxt->input->cur += l; \ | ||
| 123 | - if (*ctxt->input->cur == '%') xmlParserHandlePEReference(ctxt); \ | ||
| 124 | } while (0) | ||
| 125 | |||
| 126 | #define CUR_CHAR(l) xmlCurrentChar(ctxt, &l) | ||
| 127 | @@ -3406,13 +3405,6 @@ xmlParseNameComplex(xmlParserCtxtPtr ctxt) { | ||
| 128 | len += l; | ||
| 129 | NEXTL(l); | ||
| 130 | c = CUR_CHAR(l); | ||
| 131 | - if (c == 0) { | ||
| 132 | - count = 0; | ||
| 133 | - GROW; | ||
| 134 | - if (ctxt->instate == XML_PARSER_EOF) | ||
| 135 | - return(NULL); | ||
| 136 | - c = CUR_CHAR(l); | ||
| 137 | - } | ||
| 138 | } | ||
| 139 | } | ||
| 140 | if ((len > XML_MAX_NAME_LENGTH) && | ||
| 141 | @@ -3420,6 +3412,16 @@ xmlParseNameComplex(xmlParserCtxtPtr ctxt) { | ||
| 142 | xmlFatalErr(ctxt, XML_ERR_NAME_TOO_LONG, "Name"); | ||
| 143 | return(NULL); | ||
| 144 | } | ||
| 145 | + if (ctxt->input->cur - ctxt->input->base < len) { | ||
| 146 | + /* | ||
| 147 | + * There were a couple of bugs where PERefs lead to to a change | ||
| 148 | + * of the buffer. Check the buffer size to avoid passing an invalid | ||
| 149 | + * pointer to xmlDictLookup. | ||
| 150 | + */ | ||
| 151 | + xmlFatalErr(ctxt, XML_ERR_INTERNAL_ERROR, | ||
| 152 | + "unexpected change of input buffer"); | ||
| 153 | + return (NULL); | ||
| 154 | + } | ||
| 155 | if ((*ctxt->input->cur == '\n') && (ctxt->input->cur[-1] == '\r')) | ||
| 156 | return(xmlDictLookup(ctxt->dict, ctxt->input->cur - (len + 1), len)); | ||
| 157 | return(xmlDictLookup(ctxt->dict, ctxt->input->cur - len, len)); | ||
| 158 | diff --git a/result/errors10/781205.xml b/result/errors10/781205.xml | ||
| 159 | new file mode 100644 | ||
| 160 | index 0000000..e69de29 | ||
| 161 | diff --git a/result/errors10/781205.xml.err b/result/errors10/781205.xml.err | ||
| 162 | new file mode 100644 | ||
| 163 | index 0000000..da15c3f | ||
| 164 | --- /dev/null | ||
| 165 | +++ b/result/errors10/781205.xml.err | ||
| 166 | @@ -0,0 +1,21 @@ | ||
| 167 | +Entity: line 1: parser error : internal error: xmlParseInternalSubset: error detected in Markup declaration | ||
| 168 | + | ||
| 169 | + %a; | ||
| 170 | + ^ | ||
| 171 | +Entity: line 1: | ||
| 172 | +<:0000 | ||
| 173 | +^ | ||
| 174 | +Entity: line 1: parser error : DOCTYPE improperly terminated | ||
| 175 | + %a; | ||
| 176 | + ^ | ||
| 177 | +Entity: line 1: | ||
| 178 | +<:0000 | ||
| 179 | +^ | ||
| 180 | +namespace error : Failed to parse QName ':0000' | ||
| 181 | + %a; | ||
| 182 | + ^ | ||
| 183 | +<:0000 | ||
| 184 | + ^ | ||
| 185 | +./test/errors10/781205.xml:4: parser error : Couldn't find end of Start Tag :0000 line 1 | ||
| 186 | + | ||
| 187 | +^ | ||
| 188 | diff --git a/result/errors10/781361.xml b/result/errors10/781361.xml | ||
| 189 | new file mode 100644 | ||
| 190 | index 0000000..e69de29 | ||
| 191 | diff --git a/result/errors10/781361.xml.err b/result/errors10/781361.xml.err | ||
| 192 | new file mode 100644 | ||
| 193 | index 0000000..655f41a | ||
| 194 | --- /dev/null | ||
| 195 | +++ b/result/errors10/781361.xml.err | ||
| 196 | @@ -0,0 +1,13 @@ | ||
| 197 | +./test/errors10/781361.xml:4: parser error : xmlParseElementDecl: 'EMPTY', 'ANY' or '(' expected | ||
| 198 | + | ||
| 199 | +^ | ||
| 200 | +./test/errors10/781361.xml:4: parser error : internal error: xmlParseInternalSubset: error detected in Markup declaration | ||
| 201 | + | ||
| 202 | + | ||
| 203 | +^ | ||
| 204 | +./test/errors10/781361.xml:4: parser error : DOCTYPE improperly terminated | ||
| 205 | + | ||
| 206 | +^ | ||
| 207 | +./test/errors10/781361.xml:4: parser error : Start tag expected, '<' not found | ||
| 208 | + | ||
| 209 | +^ | ||
| 210 | diff --git a/result/valid/766956.xml b/result/valid/766956.xml | ||
| 211 | new file mode 100644 | ||
| 212 | index 0000000..e69de29 | ||
| 213 | diff --git a/result/valid/766956.xml.err b/result/valid/766956.xml.err | ||
| 214 | new file mode 100644 | ||
| 215 | index 0000000..34b1dae | ||
| 216 | --- /dev/null | ||
| 217 | +++ b/result/valid/766956.xml.err | ||
| 218 | @@ -0,0 +1,9 @@ | ||
| 219 | +test/valid/dtds/766956.dtd:2: parser error : PEReference: expecting ';' | ||
| 220 | +%ä%ent; | ||
| 221 | + ^ | ||
| 222 | +Entity: line 1: parser error : Content error in the external subset | ||
| 223 | + %ent; | ||
| 224 | + ^ | ||
| 225 | +Entity: line 1: | ||
| 226 | +value | ||
| 227 | +^ | ||
| 228 | diff --git a/result/valid/766956.xml.err.rdr b/result/valid/766956.xml.err.rdr | ||
| 229 | new file mode 100644 | ||
| 230 | index 0000000..7760346 | ||
| 231 | --- /dev/null | ||
| 232 | +++ b/result/valid/766956.xml.err.rdr | ||
| 233 | @@ -0,0 +1,10 @@ | ||
| 234 | +test/valid/dtds/766956.dtd:2: parser error : PEReference: expecting ';' | ||
| 235 | +%ä%ent; | ||
| 236 | + ^ | ||
| 237 | +Entity: line 1: parser error : Content error in the external subset | ||
| 238 | + %ent; | ||
| 239 | + ^ | ||
| 240 | +Entity: line 1: | ||
| 241 | +value | ||
| 242 | +^ | ||
| 243 | +./test/valid/766956.xml : failed to parse | ||
| 244 | diff --git a/runtest.c b/runtest.c | ||
| 245 | index bb74d2a..63e8c20 100644 | ||
| 246 | --- a/runtest.c | ||
| 247 | +++ b/runtest.c | ||
| 248 | @@ -4202,6 +4202,9 @@ testDesc testDescriptions[] = { | ||
| 249 | { "Error cases regression tests", | ||
| 250 | errParseTest, "./test/errors/*.xml", "result/errors/", "", ".err", | ||
| 251 | 0 }, | ||
| 252 | + { "Error cases regression tests (old 1.0)", | ||
| 253 | + errParseTest, "./test/errors10/*.xml", "result/errors10/", "", ".err", | ||
| 254 | + XML_PARSE_OLD10 }, | ||
| 255 | #ifdef LIBXML_READER_ENABLED | ||
| 256 | { "Error cases stream regression tests", | ||
| 257 | streamParseTest, "./test/errors/*.xml", "result/errors/", NULL, ".str", | ||
| 258 | diff --git a/test/errors10/781205.xml b/test/errors10/781205.xml | ||
| 259 | new file mode 100644 | ||
| 260 | index 0000000..d9e9e83 | ||
| 261 | --- /dev/null | ||
| 262 | +++ b/test/errors10/781205.xml | ||
| 263 | @@ -0,0 +1,3 @@ | ||
| 264 | +<!DOCTYPE D [ | ||
| 265 | + <!ENTITY % a "<:0000"> | ||
| 266 | + %a; | ||
| 267 | diff --git a/test/errors10/781361.xml b/test/errors10/781361.xml | ||
| 268 | new file mode 100644 | ||
| 269 | index 0000000..67476bc | ||
| 270 | --- /dev/null | ||
| 271 | +++ b/test/errors10/781361.xml | ||
| 272 | @@ -0,0 +1,3 @@ | ||
| 273 | +<!DOCTYPE doc [ | ||
| 274 | + <!ENTITY % elem "<!ELEMENT e0000000000"> | ||
| 275 | + %elem; | ||
| 276 | diff --git a/test/valid/766956.xml b/test/valid/766956.xml | ||
| 277 | new file mode 100644 | ||
| 278 | index 0000000..19a95a0 | ||
| 279 | --- /dev/null | ||
| 280 | +++ b/test/valid/766956.xml | ||
| 281 | @@ -0,0 +1,2 @@ | ||
| 282 | +<!DOCTYPE test SYSTEM "dtds/766956.dtd"> | ||
| 283 | +<test/> | ||
| 284 | diff --git a/test/valid/dtds/766956.dtd b/test/valid/dtds/766956.dtd | ||
| 285 | new file mode 100644 | ||
| 286 | index 0000000..dddde68 | ||
| 287 | --- /dev/null | ||
| 288 | +++ b/test/valid/dtds/766956.dtd | ||
| 289 | @@ -0,0 +1,2 @@ | ||
| 290 | +<!ENTITY % ent "value"> | ||
| 291 | +%ä%ent; | ||
diff --git a/meta/recipes-core/libxml/libxml2/libxml2-fix_NULL_pointer_derefs.patch b/meta/recipes-core/libxml/libxml2/libxml2-fix_NULL_pointer_derefs.patch deleted file mode 100644 index c60e32f656..0000000000 --- a/meta/recipes-core/libxml/libxml2/libxml2-fix_NULL_pointer_derefs.patch +++ /dev/null | |||
| @@ -1,45 +0,0 @@ | |||
| 1 | libxml2-2.9.4: Fix more NULL pointer derefs | ||
| 2 | |||
| 3 | xpointer: Fix more NULL pointer derefs | ||
| 4 | |||
| 5 | Upstream-Status: Backport [https://git.gnome.org/browse/libxml2/commit/?id=e905f08123e4a6e7731549e6f09dadff4cab65bd] | ||
| 6 | Signed-off-by: Andrej Valek <andrej.valek@siemens.com> | ||
| 7 | Signed-off-by: Pascal Bach <pascal.bach@siemens.com> | ||
| 8 | |||
| 9 | diff --git a/xpointer.c b/xpointer.c | ||
| 10 | index 676c510..074db24 100644 | ||
| 11 | --- a/xpointer.c | ||
| 12 | +++ b/xpointer.c | ||
| 13 | @@ -555,7 +555,7 @@ xmlXPtrNewRangeNodeObject(xmlNodePtr start, xmlXPathObjectPtr end) { | ||
| 14 | /* | ||
| 15 | * Empty set ... | ||
| 16 | */ | ||
| 17 | - if (end->nodesetval->nodeNr <= 0) | ||
| 18 | + if ((end->nodesetval == NULL) || (end->nodesetval->nodeNr <= 0)) | ||
| 19 | return(NULL); | ||
| 20 | break; | ||
| 21 | default: | ||
| 22 | @@ -1400,7 +1400,7 @@ xmlXPtrEval(const xmlChar *str, xmlXPathContextPtr ctx) { | ||
| 23 | */ | ||
| 24 | xmlNodeSetPtr set; | ||
| 25 | set = tmp->nodesetval; | ||
| 26 | - if ((set->nodeNr != 1) || | ||
| 27 | + if ((set == NULL) || (set->nodeNr != 1) || | ||
| 28 | (set->nodeTab[0] != (xmlNodePtr) ctx->doc)) | ||
| 29 | stack++; | ||
| 30 | } else | ||
| 31 | @@ -2073,9 +2073,11 @@ xmlXPtrRangeFunction(xmlXPathParserContextPtr ctxt, int nargs) { | ||
| 32 | xmlXPathFreeObject(set); | ||
| 33 | XP_ERROR(XPATH_MEMORY_ERROR); | ||
| 34 | } | ||
| 35 | - for (i = 0;i < oldset->locNr;i++) { | ||
| 36 | - xmlXPtrLocationSetAdd(newset, | ||
| 37 | - xmlXPtrCoveringRange(ctxt, oldset->locTab[i])); | ||
| 38 | + if (oldset != NULL) { | ||
| 39 | + for (i = 0;i < oldset->locNr;i++) { | ||
| 40 | + xmlXPtrLocationSetAdd(newset, | ||
| 41 | + xmlXPtrCoveringRange(ctxt, oldset->locTab[i])); | ||
| 42 | + } | ||
| 43 | } | ||
| 44 | |||
| 45 | /* | ||
diff --git a/meta/recipes-core/libxml/libxml2/libxml2-fix_and_simplify_xmlParseStartTag2.patch b/meta/recipes-core/libxml/libxml2/libxml2-fix_and_simplify_xmlParseStartTag2.patch deleted file mode 100644 index faa57701f5..0000000000 --- a/meta/recipes-core/libxml/libxml2/libxml2-fix_and_simplify_xmlParseStartTag2.patch +++ /dev/null | |||
| @@ -1,590 +0,0 @@ | |||
| 1 | libxml2-2.9.4: Avoid reparsing and simplify control flow in xmlParseStartTag2 | ||
| 2 | |||
| 3 | [No upstream tracking] | ||
| 4 | |||
| 5 | parser: Avoid reparsing in xmlParseStartTag2 | ||
| 6 | |||
| 7 | The code in xmlParseStartTag2 must handle the case that the input | ||
| 8 | buffer was grown and reallocated which can invalidate pointers to | ||
| 9 | attribute values. Before, this was handled by detecting changes of | ||
| 10 | the input buffer "base" pointer and, in case of a change, jumping | ||
| 11 | back to the beginning of the function and reparsing the start tag. | ||
| 12 | |||
| 13 | The major problem of this approach is that whether an input buffer is | ||
| 14 | reallocated is nondeterministic, resulting in seemingly random test | ||
| 15 | failures. See the mailing list thread "runtest mystery bug: name2.xml | ||
| 16 | error case regression test" from 2012, for example. | ||
| 17 | |||
| 18 | If a reallocation was detected, the code also made no attempts to | ||
| 19 | continue parsing in case of errors which makes a difference in | ||
| 20 | the lax "recover" mode. | ||
| 21 | |||
| 22 | Now we store the current input buffer "base" pointer for each (not | ||
| 23 | separately allocated) attribute in the namespace URI field, which isn't | ||
| 24 | used until later. After the whole start tag was parsed, the pointers to | ||
| 25 | the attribute values are reconstructed using the offset between the | ||
| 26 | new and the old input buffer. This relies on arithmetic on dangling | ||
| 27 | pointers which is technically undefined behavior. But it seems like | ||
| 28 | the easiest and most efficient fix and a similar approach is used in | ||
| 29 | xmlParserInputGrow. | ||
| 30 | |||
| 31 | This changes the error output of several tests, typically making it | ||
| 32 | more verbose because we try harder to continue parsing in case of errors. | ||
| 33 | |||
| 34 | (Another possible solution is to check not only the "base" pointer | ||
| 35 | but the size of the input buffer as well. But this would result in | ||
| 36 | even more reparsing.) | ||
| 37 | |||
| 38 | Remove some goto labels and deduplicate a bit of code after handling | ||
| 39 | namespaces. | ||
| 40 | |||
| 41 | There were two bugs where parameter-entity references could lead to an | ||
| 42 | unexpected change of the input buffer in xmlParseNameComplex and | ||
| 43 | xmlDictLookup being called with an invalid pointer. | ||
| 44 | |||
| 45 | |||
| 46 | Upstream-Status: Backport | ||
| 47 | - [https://git.gnome.org/browse/libxml2/commit/?id=07b7428b69c368611d215a140fe630b2d1e61349] | ||
| 48 | - [https://git.gnome.org/browse/libxml2/commit/?id=855c19efb7cd30d927d673b3658563c4959ca6f0] | ||
| 49 | Signed-off-by: Andrej Valek <andrej.valek@siemens.com> | ||
| 50 | |||
| 51 | diff --git a/parser.c b/parser.c | ||
| 52 | index 609a270..74016e3 100644 | ||
| 53 | --- a/parser.c | ||
| 54 | +++ b/parser.c | ||
| 55 | @@ -43,6 +43,7 @@ | ||
| 56 | #include <limits.h> | ||
| 57 | #include <string.h> | ||
| 58 | #include <stdarg.h> | ||
| 59 | +#include <stddef.h> | ||
| 60 | #include <libxml/xmlmemory.h> | ||
| 61 | #include <libxml/threads.h> | ||
| 62 | #include <libxml/globals.h> | ||
| 63 | @@ -9377,8 +9378,7 @@ xmlParseStartTag2(xmlParserCtxtPtr ctxt, const xmlChar **pref, | ||
| 64 | const xmlChar **atts = ctxt->atts; | ||
| 65 | int maxatts = ctxt->maxatts; | ||
| 66 | int nratts, nbatts, nbdef; | ||
| 67 | - int i, j, nbNs, attval, oldline, oldcol, inputNr; | ||
| 68 | - const xmlChar *base; | ||
| 69 | + int i, j, nbNs, attval; | ||
| 70 | unsigned long cur; | ||
| 71 | int nsNr = ctxt->nsNr; | ||
| 72 | |||
| 73 | @@ -9392,13 +9392,8 @@ xmlParseStartTag2(xmlParserCtxtPtr ctxt, const xmlChar **pref, | ||
| 74 | * The Shrinking is only possible once the full set of attribute | ||
| 75 | * callbacks have been done. | ||
| 76 | */ | ||
| 77 | -reparse: | ||
| 78 | SHRINK; | ||
| 79 | - base = ctxt->input->base; | ||
| 80 | cur = ctxt->input->cur - ctxt->input->base; | ||
| 81 | - inputNr = ctxt->inputNr; | ||
| 82 | - oldline = ctxt->input->line; | ||
| 83 | - oldcol = ctxt->input->col; | ||
| 84 | nbatts = 0; | ||
| 85 | nratts = 0; | ||
| 86 | nbdef = 0; | ||
| 87 | @@ -9422,8 +9417,6 @@ reparse: | ||
| 88 | */ | ||
| 89 | SKIP_BLANKS; | ||
| 90 | GROW; | ||
| 91 | - if ((ctxt->input->base != base) || (inputNr != ctxt->inputNr)) | ||
| 92 | - goto base_changed; | ||
| 93 | |||
| 94 | while (((RAW != '>') && | ||
| 95 | ((RAW != '/') || (NXT(1) != '>')) && | ||
| 96 | @@ -9434,203 +9427,174 @@ reparse: | ||
| 97 | |||
| 98 | attname = xmlParseAttribute2(ctxt, prefix, localname, | ||
| 99 | &aprefix, &attvalue, &len, &alloc); | ||
| 100 | - if ((ctxt->input->base != base) || (inputNr != ctxt->inputNr)) { | ||
| 101 | - if ((attvalue != NULL) && (alloc != 0)) | ||
| 102 | - xmlFree(attvalue); | ||
| 103 | - attvalue = NULL; | ||
| 104 | - goto base_changed; | ||
| 105 | - } | ||
| 106 | - if ((attname != NULL) && (attvalue != NULL)) { | ||
| 107 | - if (len < 0) len = xmlStrlen(attvalue); | ||
| 108 | - if ((attname == ctxt->str_xmlns) && (aprefix == NULL)) { | ||
| 109 | - const xmlChar *URL = xmlDictLookup(ctxt->dict, attvalue, len); | ||
| 110 | - xmlURIPtr uri; | ||
| 111 | - | ||
| 112 | - if (URL == NULL) { | ||
| 113 | - xmlErrMemory(ctxt, "dictionary allocation failure"); | ||
| 114 | - if ((attvalue != NULL) && (alloc != 0)) | ||
| 115 | - xmlFree(attvalue); | ||
| 116 | - return(NULL); | ||
| 117 | - } | ||
| 118 | - if (*URL != 0) { | ||
| 119 | - uri = xmlParseURI((const char *) URL); | ||
| 120 | - if (uri == NULL) { | ||
| 121 | - xmlNsErr(ctxt, XML_WAR_NS_URI, | ||
| 122 | - "xmlns: '%s' is not a valid URI\n", | ||
| 123 | - URL, NULL, NULL); | ||
| 124 | - } else { | ||
| 125 | - if (uri->scheme == NULL) { | ||
| 126 | - xmlNsWarn(ctxt, XML_WAR_NS_URI_RELATIVE, | ||
| 127 | - "xmlns: URI %s is not absolute\n", | ||
| 128 | - URL, NULL, NULL); | ||
| 129 | - } | ||
| 130 | - xmlFreeURI(uri); | ||
| 131 | - } | ||
| 132 | - if (URL == ctxt->str_xml_ns) { | ||
| 133 | - if (attname != ctxt->str_xml) { | ||
| 134 | - xmlNsErr(ctxt, XML_NS_ERR_XML_NAMESPACE, | ||
| 135 | - "xml namespace URI cannot be the default namespace\n", | ||
| 136 | - NULL, NULL, NULL); | ||
| 137 | - } | ||
| 138 | - goto skip_default_ns; | ||
| 139 | - } | ||
| 140 | - if ((len == 29) && | ||
| 141 | - (xmlStrEqual(URL, | ||
| 142 | - BAD_CAST "http://www.w3.org/2000/xmlns/"))) { | ||
| 143 | - xmlNsErr(ctxt, XML_NS_ERR_XML_NAMESPACE, | ||
| 144 | - "reuse of the xmlns namespace name is forbidden\n", | ||
| 145 | - NULL, NULL, NULL); | ||
| 146 | - goto skip_default_ns; | ||
| 147 | - } | ||
| 148 | - } | ||
| 149 | - /* | ||
| 150 | - * check that it's not a defined namespace | ||
| 151 | - */ | ||
| 152 | - for (j = 1;j <= nbNs;j++) | ||
| 153 | - if (ctxt->nsTab[ctxt->nsNr - 2 * j] == NULL) | ||
| 154 | - break; | ||
| 155 | - if (j <= nbNs) | ||
| 156 | - xmlErrAttributeDup(ctxt, NULL, attname); | ||
| 157 | - else | ||
| 158 | - if (nsPush(ctxt, NULL, URL) > 0) nbNs++; | ||
| 159 | -skip_default_ns: | ||
| 160 | - if ((attvalue != NULL) && (alloc != 0)) { | ||
| 161 | - xmlFree(attvalue); | ||
| 162 | - attvalue = NULL; | ||
| 163 | - } | ||
| 164 | - if ((RAW == '>') || (((RAW == '/') && (NXT(1) == '>')))) | ||
| 165 | - break; | ||
| 166 | - if (!IS_BLANK_CH(RAW)) { | ||
| 167 | - xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, | ||
| 168 | - "attributes construct error\n"); | ||
| 169 | - break; | ||
| 170 | - } | ||
| 171 | - SKIP_BLANKS; | ||
| 172 | - if ((ctxt->input->base != base) || (inputNr != ctxt->inputNr)) | ||
| 173 | - goto base_changed; | ||
| 174 | - continue; | ||
| 175 | - } | ||
| 176 | - if (aprefix == ctxt->str_xmlns) { | ||
| 177 | - const xmlChar *URL = xmlDictLookup(ctxt->dict, attvalue, len); | ||
| 178 | - xmlURIPtr uri; | ||
| 179 | - | ||
| 180 | - if (attname == ctxt->str_xml) { | ||
| 181 | - if (URL != ctxt->str_xml_ns) { | ||
| 182 | - xmlNsErr(ctxt, XML_NS_ERR_XML_NAMESPACE, | ||
| 183 | - "xml namespace prefix mapped to wrong URI\n", | ||
| 184 | - NULL, NULL, NULL); | ||
| 185 | - } | ||
| 186 | - /* | ||
| 187 | - * Do not keep a namespace definition node | ||
| 188 | - */ | ||
| 189 | - goto skip_ns; | ||
| 190 | - } | ||
| 191 | + if ((attname == NULL) || (attvalue == NULL)) | ||
| 192 | + goto next_attr; | ||
| 193 | + if (len < 0) len = xmlStrlen(attvalue); | ||
| 194 | + | ||
| 195 | + if ((attname == ctxt->str_xmlns) && (aprefix == NULL)) { | ||
| 196 | + const xmlChar *URL = xmlDictLookup(ctxt->dict, attvalue, len); | ||
| 197 | + xmlURIPtr uri; | ||
| 198 | + | ||
| 199 | + if (URL == NULL) { | ||
| 200 | + xmlErrMemory(ctxt, "dictionary allocation failure"); | ||
| 201 | + if ((attvalue != NULL) && (alloc != 0)) | ||
| 202 | + xmlFree(attvalue); | ||
| 203 | + return(NULL); | ||
| 204 | + } | ||
| 205 | + if (*URL != 0) { | ||
| 206 | + uri = xmlParseURI((const char *) URL); | ||
| 207 | + if (uri == NULL) { | ||
| 208 | + xmlNsErr(ctxt, XML_WAR_NS_URI, | ||
| 209 | + "xmlns: '%s' is not a valid URI\n", | ||
| 210 | + URL, NULL, NULL); | ||
| 211 | + } else { | ||
| 212 | + if (uri->scheme == NULL) { | ||
| 213 | + xmlNsWarn(ctxt, XML_WAR_NS_URI_RELATIVE, | ||
| 214 | + "xmlns: URI %s is not absolute\n", | ||
| 215 | + URL, NULL, NULL); | ||
| 216 | + } | ||
| 217 | + xmlFreeURI(uri); | ||
| 218 | + } | ||
| 219 | if (URL == ctxt->str_xml_ns) { | ||
| 220 | - if (attname != ctxt->str_xml) { | ||
| 221 | - xmlNsErr(ctxt, XML_NS_ERR_XML_NAMESPACE, | ||
| 222 | - "xml namespace URI mapped to wrong prefix\n", | ||
| 223 | - NULL, NULL, NULL); | ||
| 224 | - } | ||
| 225 | - goto skip_ns; | ||
| 226 | - } | ||
| 227 | - if (attname == ctxt->str_xmlns) { | ||
| 228 | - xmlNsErr(ctxt, XML_NS_ERR_XML_NAMESPACE, | ||
| 229 | - "redefinition of the xmlns prefix is forbidden\n", | ||
| 230 | - NULL, NULL, NULL); | ||
| 231 | - goto skip_ns; | ||
| 232 | - } | ||
| 233 | - if ((len == 29) && | ||
| 234 | - (xmlStrEqual(URL, | ||
| 235 | - BAD_CAST "http://www.w3.org/2000/xmlns/"))) { | ||
| 236 | - xmlNsErr(ctxt, XML_NS_ERR_XML_NAMESPACE, | ||
| 237 | - "reuse of the xmlns namespace name is forbidden\n", | ||
| 238 | - NULL, NULL, NULL); | ||
| 239 | - goto skip_ns; | ||
| 240 | - } | ||
| 241 | - if ((URL == NULL) || (URL[0] == 0)) { | ||
| 242 | - xmlNsErr(ctxt, XML_NS_ERR_XML_NAMESPACE, | ||
| 243 | - "xmlns:%s: Empty XML namespace is not allowed\n", | ||
| 244 | - attname, NULL, NULL); | ||
| 245 | - goto skip_ns; | ||
| 246 | - } else { | ||
| 247 | - uri = xmlParseURI((const char *) URL); | ||
| 248 | - if (uri == NULL) { | ||
| 249 | - xmlNsErr(ctxt, XML_WAR_NS_URI, | ||
| 250 | - "xmlns:%s: '%s' is not a valid URI\n", | ||
| 251 | - attname, URL, NULL); | ||
| 252 | - } else { | ||
| 253 | - if ((ctxt->pedantic) && (uri->scheme == NULL)) { | ||
| 254 | - xmlNsWarn(ctxt, XML_WAR_NS_URI_RELATIVE, | ||
| 255 | - "xmlns:%s: URI %s is not absolute\n", | ||
| 256 | - attname, URL, NULL); | ||
| 257 | - } | ||
| 258 | - xmlFreeURI(uri); | ||
| 259 | - } | ||
| 260 | - } | ||
| 261 | - | ||
| 262 | - /* | ||
| 263 | - * check that it's not a defined namespace | ||
| 264 | - */ | ||
| 265 | - for (j = 1;j <= nbNs;j++) | ||
| 266 | - if (ctxt->nsTab[ctxt->nsNr - 2 * j] == attname) | ||
| 267 | - break; | ||
| 268 | - if (j <= nbNs) | ||
| 269 | - xmlErrAttributeDup(ctxt, aprefix, attname); | ||
| 270 | - else | ||
| 271 | - if (nsPush(ctxt, attname, URL) > 0) nbNs++; | ||
| 272 | -skip_ns: | ||
| 273 | - if ((attvalue != NULL) && (alloc != 0)) { | ||
| 274 | - xmlFree(attvalue); | ||
| 275 | - attvalue = NULL; | ||
| 276 | - } | ||
| 277 | - if ((RAW == '>') || (((RAW == '/') && (NXT(1) == '>')))) | ||
| 278 | - break; | ||
| 279 | - if (!IS_BLANK_CH(RAW)) { | ||
| 280 | - xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, | ||
| 281 | - "attributes construct error\n"); | ||
| 282 | - break; | ||
| 283 | - } | ||
| 284 | - SKIP_BLANKS; | ||
| 285 | - if ((ctxt->input->base != base) || (inputNr != ctxt->inputNr)) | ||
| 286 | - goto base_changed; | ||
| 287 | - continue; | ||
| 288 | - } | ||
| 289 | + if (attname != ctxt->str_xml) { | ||
| 290 | + xmlNsErr(ctxt, XML_NS_ERR_XML_NAMESPACE, | ||
| 291 | + "xml namespace URI cannot be the default namespace\n", | ||
| 292 | + NULL, NULL, NULL); | ||
| 293 | + } | ||
| 294 | + goto next_attr; | ||
| 295 | + } | ||
| 296 | + if ((len == 29) && | ||
| 297 | + (xmlStrEqual(URL, | ||
| 298 | + BAD_CAST "http://www.w3.org/2000/xmlns/"))) { | ||
| 299 | + xmlNsErr(ctxt, XML_NS_ERR_XML_NAMESPACE, | ||
| 300 | + "reuse of the xmlns namespace name is forbidden\n", | ||
| 301 | + NULL, NULL, NULL); | ||
| 302 | + goto next_attr; | ||
| 303 | + } | ||
| 304 | + } | ||
| 305 | + /* | ||
| 306 | + * check that it's not a defined namespace | ||
| 307 | + */ | ||
| 308 | + for (j = 1;j <= nbNs;j++) | ||
| 309 | + if (ctxt->nsTab[ctxt->nsNr - 2 * j] == NULL) | ||
| 310 | + break; | ||
| 311 | + if (j <= nbNs) | ||
| 312 | + xmlErrAttributeDup(ctxt, NULL, attname); | ||
| 313 | + else | ||
| 314 | + if (nsPush(ctxt, NULL, URL) > 0) nbNs++; | ||
| 315 | + | ||
| 316 | + } else if (aprefix == ctxt->str_xmlns) { | ||
| 317 | + const xmlChar *URL = xmlDictLookup(ctxt->dict, attvalue, len); | ||
| 318 | + xmlURIPtr uri; | ||
| 319 | + | ||
| 320 | + if (attname == ctxt->str_xml) { | ||
| 321 | + if (URL != ctxt->str_xml_ns) { | ||
| 322 | + xmlNsErr(ctxt, XML_NS_ERR_XML_NAMESPACE, | ||
| 323 | + "xml namespace prefix mapped to wrong URI\n", | ||
| 324 | + NULL, NULL, NULL); | ||
| 325 | + } | ||
| 326 | + /* | ||
| 327 | + * Do not keep a namespace definition node | ||
| 328 | + */ | ||
| 329 | + goto next_attr; | ||
| 330 | + } | ||
| 331 | + if (URL == ctxt->str_xml_ns) { | ||
| 332 | + if (attname != ctxt->str_xml) { | ||
| 333 | + xmlNsErr(ctxt, XML_NS_ERR_XML_NAMESPACE, | ||
| 334 | + "xml namespace URI mapped to wrong prefix\n", | ||
| 335 | + NULL, NULL, NULL); | ||
| 336 | + } | ||
| 337 | + goto next_attr; | ||
| 338 | + } | ||
| 339 | + if (attname == ctxt->str_xmlns) { | ||
| 340 | + xmlNsErr(ctxt, XML_NS_ERR_XML_NAMESPACE, | ||
| 341 | + "redefinition of the xmlns prefix is forbidden\n", | ||
| 342 | + NULL, NULL, NULL); | ||
| 343 | + goto next_attr; | ||
| 344 | + } | ||
| 345 | + if ((len == 29) && | ||
| 346 | + (xmlStrEqual(URL, | ||
| 347 | + BAD_CAST "http://www.w3.org/2000/xmlns/"))) { | ||
| 348 | + xmlNsErr(ctxt, XML_NS_ERR_XML_NAMESPACE, | ||
| 349 | + "reuse of the xmlns namespace name is forbidden\n", | ||
| 350 | + NULL, NULL, NULL); | ||
| 351 | + goto next_attr; | ||
| 352 | + } | ||
| 353 | + if ((URL == NULL) || (URL[0] == 0)) { | ||
| 354 | + xmlNsErr(ctxt, XML_NS_ERR_XML_NAMESPACE, | ||
| 355 | + "xmlns:%s: Empty XML namespace is not allowed\n", | ||
| 356 | + attname, NULL, NULL); | ||
| 357 | + goto next_attr; | ||
| 358 | + } else { | ||
| 359 | + uri = xmlParseURI((const char *) URL); | ||
| 360 | + if (uri == NULL) { | ||
| 361 | + xmlNsErr(ctxt, XML_WAR_NS_URI, | ||
| 362 | + "xmlns:%s: '%s' is not a valid URI\n", | ||
| 363 | + attname, URL, NULL); | ||
| 364 | + } else { | ||
| 365 | + if ((ctxt->pedantic) && (uri->scheme == NULL)) { | ||
| 366 | + xmlNsWarn(ctxt, XML_WAR_NS_URI_RELATIVE, | ||
| 367 | + "xmlns:%s: URI %s is not absolute\n", | ||
| 368 | + attname, URL, NULL); | ||
| 369 | + } | ||
| 370 | + xmlFreeURI(uri); | ||
| 371 | + } | ||
| 372 | + } | ||
| 373 | |||
| 374 | - /* | ||
| 375 | - * Add the pair to atts | ||
| 376 | - */ | ||
| 377 | - if ((atts == NULL) || (nbatts + 5 > maxatts)) { | ||
| 378 | - if (xmlCtxtGrowAttrs(ctxt, nbatts + 5) < 0) { | ||
| 379 | - if (attvalue[len] == 0) | ||
| 380 | - xmlFree(attvalue); | ||
| 381 | - goto failed; | ||
| 382 | - } | ||
| 383 | - maxatts = ctxt->maxatts; | ||
| 384 | - atts = ctxt->atts; | ||
| 385 | - } | ||
| 386 | - ctxt->attallocs[nratts++] = alloc; | ||
| 387 | - atts[nbatts++] = attname; | ||
| 388 | - atts[nbatts++] = aprefix; | ||
| 389 | - atts[nbatts++] = NULL; /* the URI will be fetched later */ | ||
| 390 | - atts[nbatts++] = attvalue; | ||
| 391 | - attvalue += len; | ||
| 392 | - atts[nbatts++] = attvalue; | ||
| 393 | - /* | ||
| 394 | - * tag if some deallocation is needed | ||
| 395 | - */ | ||
| 396 | - if (alloc != 0) attval = 1; | ||
| 397 | - } else { | ||
| 398 | - if ((attvalue != NULL) && (attvalue[len] == 0)) | ||
| 399 | - xmlFree(attvalue); | ||
| 400 | - } | ||
| 401 | + /* | ||
| 402 | + * check that it's not a defined namespace | ||
| 403 | + */ | ||
| 404 | + for (j = 1;j <= nbNs;j++) | ||
| 405 | + if (ctxt->nsTab[ctxt->nsNr - 2 * j] == attname) | ||
| 406 | + break; | ||
| 407 | + if (j <= nbNs) | ||
| 408 | + xmlErrAttributeDup(ctxt, aprefix, attname); | ||
| 409 | + else | ||
| 410 | + if (nsPush(ctxt, attname, URL) > 0) nbNs++; | ||
| 411 | + | ||
| 412 | + } else { | ||
| 413 | + /* | ||
| 414 | + * Add the pair to atts | ||
| 415 | + */ | ||
| 416 | + if ((atts == NULL) || (nbatts + 5 > maxatts)) { | ||
| 417 | + if (xmlCtxtGrowAttrs(ctxt, nbatts + 5) < 0) { | ||
| 418 | + goto next_attr; | ||
| 419 | + } | ||
| 420 | + maxatts = ctxt->maxatts; | ||
| 421 | + atts = ctxt->atts; | ||
| 422 | + } | ||
| 423 | + ctxt->attallocs[nratts++] = alloc; | ||
| 424 | + atts[nbatts++] = attname; | ||
| 425 | + atts[nbatts++] = aprefix; | ||
| 426 | + /* | ||
| 427 | + * The namespace URI field is used temporarily to point at the | ||
| 428 | + * base of the current input buffer for non-alloced attributes. | ||
| 429 | + * When the input buffer is reallocated, all the pointers become | ||
| 430 | + * invalid, but they can be reconstructed later. | ||
| 431 | + */ | ||
| 432 | + if (alloc) | ||
| 433 | + atts[nbatts++] = NULL; | ||
| 434 | + else | ||
| 435 | + atts[nbatts++] = ctxt->input->base; | ||
| 436 | + atts[nbatts++] = attvalue; | ||
| 437 | + attvalue += len; | ||
| 438 | + atts[nbatts++] = attvalue; | ||
| 439 | + /* | ||
| 440 | + * tag if some deallocation is needed | ||
| 441 | + */ | ||
| 442 | + if (alloc != 0) attval = 1; | ||
| 443 | + attvalue = NULL; /* moved into atts */ | ||
| 444 | + } | ||
| 445 | |||
| 446 | -failed: | ||
| 447 | +next_attr: | ||
| 448 | + if ((attvalue != NULL) && (alloc != 0)) { | ||
| 449 | + xmlFree(attvalue); | ||
| 450 | + attvalue = NULL; | ||
| 451 | + } | ||
| 452 | |||
| 453 | GROW | ||
| 454 | if (ctxt->instate == XML_PARSER_EOF) | ||
| 455 | break; | ||
| 456 | - if ((ctxt->input->base != base) || (inputNr != ctxt->inputNr)) | ||
| 457 | - goto base_changed; | ||
| 458 | if ((RAW == '>') || (((RAW == '/') && (NXT(1) == '>')))) | ||
| 459 | break; | ||
| 460 | if (!IS_BLANK_CH(RAW)) { | ||
| 461 | @@ -9646,8 +9610,20 @@ failed: | ||
| 462 | break; | ||
| 463 | } | ||
| 464 | GROW; | ||
| 465 | - if ((ctxt->input->base != base) || (inputNr != ctxt->inputNr)) | ||
| 466 | - goto base_changed; | ||
| 467 | + } | ||
| 468 | + | ||
| 469 | + /* Reconstruct attribute value pointers. */ | ||
| 470 | + for (i = 0, j = 0; j < nratts; i += 5, j++) { | ||
| 471 | + if (atts[i+2] != NULL) { | ||
| 472 | + /* | ||
| 473 | + * Arithmetic on dangling pointers is technically undefined | ||
| 474 | + * behavior, but well... | ||
| 475 | + */ | ||
| 476 | + ptrdiff_t offset = ctxt->input->base - atts[i+2]; | ||
| 477 | + atts[i+2] = NULL; /* Reset repurposed namespace URI */ | ||
| 478 | + atts[i+3] += offset; /* value */ | ||
| 479 | + atts[i+4] += offset; /* valuend */ | ||
| 480 | + } | ||
| 481 | } | ||
| 482 | |||
| 483 | /* | ||
| 484 | @@ -9804,34 +9780,6 @@ failed: | ||
| 485 | } | ||
| 486 | |||
| 487 | return(localname); | ||
| 488 | - | ||
| 489 | -base_changed: | ||
| 490 | - /* | ||
| 491 | - * the attribute strings are valid iif the base didn't changed | ||
| 492 | - */ | ||
| 493 | - if (attval != 0) { | ||
| 494 | - for (i = 3,j = 0; j < nratts;i += 5,j++) | ||
| 495 | - if ((ctxt->attallocs[j] != 0) && (atts[i] != NULL)) | ||
| 496 | - xmlFree((xmlChar *) atts[i]); | ||
| 497 | - } | ||
| 498 | - | ||
| 499 | - /* | ||
| 500 | - * We can't switch from one entity to another in the middle | ||
| 501 | - * of a start tag | ||
| 502 | - */ | ||
| 503 | - if (inputNr != ctxt->inputNr) { | ||
| 504 | - xmlFatalErrMsg(ctxt, XML_ERR_ENTITY_BOUNDARY, | ||
| 505 | - "Start tag doesn't start and stop in the same entity\n"); | ||
| 506 | - return(NULL); | ||
| 507 | - } | ||
| 508 | - | ||
| 509 | - ctxt->input->cur = ctxt->input->base + cur; | ||
| 510 | - ctxt->input->line = oldline; | ||
| 511 | - ctxt->input->col = oldcol; | ||
| 512 | - if (ctxt->wellFormed == 1) { | ||
| 513 | - goto reparse; | ||
| 514 | - } | ||
| 515 | - return(NULL); | ||
| 516 | } | ||
| 517 | |||
| 518 | /** | ||
| 519 | diff --git a/result/errors/759398.xml.err b/result/errors/759398.xml.err | ||
| 520 | index e08d9bf..f6036a3 100644 | ||
| 521 | --- a/result/errors/759398.xml.err | ||
| 522 | +++ b/result/errors/759398.xml.err | ||
| 523 | @@ -1,9 +1,12 @@ | ||
| 524 | ./test/errors/759398.xml:210: parser error : StartTag: invalid element name | ||
| 525 | need to worry about parsers whi<! don't expand PErefs finding | ||
| 526 | ^ | ||
| 527 | -./test/errors/759398.xml:309: parser error : Opening and ending tag mismatch: spec line 50 and termdef | ||
| 528 | +./test/errors/759398.xml:309: parser error : Opening and ending tag mismatch: â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–â„–m line 308 and termdef | ||
| 529 | and provide access to their content and structure.</termdef> <termdef | ||
| 530 | ^ | ||
| 531 | -./test/errors/759398.xml:309: parser error : Extra content at the end of the document | ||
| 532 | -and provide access to their content and structure.</termdef> <termdef | ||
| 533 | - ^ | ||
| 534 | +./test/errors/759398.xml:314: parser error : Opening and ending tag mismatch: spec line 50 and p | ||
| 535 | +data and the information it must provide to the application.</p> | ||
| 536 | + ^ | ||
| 537 | +./test/errors/759398.xml:316: parser error : Extra content at the end of the document | ||
| 538 | +<div2 id='sec-origin-goals'> | ||
| 539 | +^ | ||
| 540 | diff --git a/result/errors/attr1.xml.err b/result/errors/attr1.xml.err | ||
| 541 | index 4f08538..c4c4fc8 100644 | ||
| 542 | --- a/result/errors/attr1.xml.err | ||
| 543 | +++ b/result/errors/attr1.xml.err | ||
| 544 | @@ -1,6 +1,9 @@ | ||
| 545 | ./test/errors/attr1.xml:2: parser error : AttValue: ' expected | ||
| 546 | |||
| 547 | ^ | ||
| 548 | -./test/errors/attr1.xml:1: parser error : Extra content at the end of the document | ||
| 549 | -<foo foo="oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo | ||
| 550 | - ^ | ||
| 551 | +./test/errors/attr1.xml:2: parser error : attributes construct error | ||
| 552 | + | ||
| 553 | +^ | ||
| 554 | +./test/errors/attr1.xml:2: parser error : Couldn't find end of Start Tag foo line 1 | ||
| 555 | + | ||
| 556 | +^ | ||
| 557 | diff --git a/result/errors/attr2.xml.err b/result/errors/attr2.xml.err | ||
| 558 | index c8a9c7d..77e342e 100644 | ||
| 559 | --- a/result/errors/attr2.xml.err | ||
| 560 | +++ b/result/errors/attr2.xml.err | ||
| 561 | @@ -1,6 +1,9 @@ | ||
| 562 | ./test/errors/attr2.xml:2: parser error : AttValue: ' expected | ||
| 563 | |||
| 564 | ^ | ||
| 565 | -./test/errors/attr2.xml:1: parser error : Extra content at the end of the document | ||
| 566 | -<foo foo=">ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo | ||
| 567 | - ^ | ||
| 568 | +./test/errors/attr2.xml:2: parser error : attributes construct error | ||
| 569 | + | ||
| 570 | +^ | ||
| 571 | +./test/errors/attr2.xml:2: parser error : Couldn't find end of Start Tag foo line 1 | ||
| 572 | + | ||
| 573 | +^ | ||
| 574 | diff --git a/result/errors/name2.xml.err b/result/errors/name2.xml.err | ||
| 575 | index a6649a1..8a6acee 100644 | ||
| 576 | --- a/result/errors/name2.xml.err | ||
| 577 | +++ b/result/errors/name2.xml.err | ||
| 578 | @@ -1,6 +1,9 @@ | ||
| 579 | ./test/errors/name2.xml:2: parser error : Specification mandate value for attribute foooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo | ||
| 580 | |||
| 581 | ^ | ||
| 582 | -./test/errors/name2.xml:1: parser error : Extra content at the end of the document | ||
| 583 | -<foo foooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo | ||
| 584 | - ^ | ||
| 585 | +./test/errors/name2.xml:2: parser error : attributes construct error | ||
| 586 | + | ||
| 587 | +^ | ||
| 588 | +./test/errors/name2.xml:2: parser error : Couldn't find end of Start Tag foo line 1 | ||
| 589 | + | ||
| 590 | +^ | ||
diff --git a/meta/recipes-core/libxml/libxml2/libxml2-fix_node_comparison.patch b/meta/recipes-core/libxml/libxml2/libxml2-fix_node_comparison.patch deleted file mode 100644 index 65f6bef1e6..0000000000 --- a/meta/recipes-core/libxml/libxml2/libxml2-fix_node_comparison.patch +++ /dev/null | |||
| @@ -1,67 +0,0 @@ | |||
| 1 | libxml2-2.9.4: Fix comparison with root node in xmlXPathCmpNodes and NULL pointer deref in XPointer | ||
| 2 | |||
| 3 | xpath: | ||
| 4 | - Check for errors after evaluating first operand. | ||
| 5 | - Add sanity check for empty stack. | ||
| 6 | - Include comparation in changes from xmlXPathCmpNodesExt to xmlXPathCmpNodes | ||
| 7 | |||
| 8 | Upstream-Status: Backport | ||
| 9 | - [https://git.gnome.org/browse/libxml2/commit/?id=c1d1f7121194036608bf555f08d3062a36fd344b] | ||
| 10 | - [https://git.gnome.org/browse/libxml2/commit/?id=a005199330b86dada19d162cae15ef9bdcb6baa8] | ||
| 11 | CVE: CVE-2016-5131 | ||
| 12 | Signed-off-by: Andrej Valek <andrej.valek@siemens.com> | ||
| 13 | Signed-off-by: Pascal Bach <pascal.bach@siemens.com> | ||
| 14 | |||
| 15 | diff --git a/result/XPath/xptr/viderror b/result/XPath/xptr/viderror | ||
| 16 | new file mode 100644 | ||
| 17 | index 0000000..d589882 | ||
| 18 | --- /dev/null | ||
| 19 | +++ b/result/XPath/xptr/viderror | ||
| 20 | @@ -0,0 +1,4 @@ | ||
| 21 | + | ||
| 22 | +======================== | ||
| 23 | +Expression: xpointer(non-existing-fn()/range-to(id('chapter2'))) | ||
| 24 | +Object is empty (NULL) | ||
| 25 | diff --git a/test/XPath/xptr/viderror b/test/XPath/xptr/viderror | ||
| 26 | new file mode 100644 | ||
| 27 | index 0000000..da8c53b | ||
| 28 | --- /dev/null | ||
| 29 | +++ b/test/XPath/xptr/viderror | ||
| 30 | @@ -0,0 +1 @@ | ||
| 31 | +xpointer(non-existing-fn()/range-to(id('chapter2'))) | ||
| 32 | diff --git a/xpath.c b/xpath.c | ||
| 33 | index 113bce6..d992841 100644 | ||
| 34 | --- a/xpath.c | ||
| 35 | +++ b/xpath.c | ||
| 36 | @@ -3342,13 +3342,13 @@ xmlXPathCmpNodes(xmlNodePtr node1, xmlNodePtr node2) { | ||
| 37 | * compute depth to root | ||
| 38 | */ | ||
| 39 | for (depth2 = 0, cur = node2;cur->parent != NULL;cur = cur->parent) { | ||
| 40 | - if (cur == node1) | ||
| 41 | + if (cur->parent == node1) | ||
| 42 | return(1); | ||
| 43 | depth2++; | ||
| 44 | } | ||
| 45 | root = cur; | ||
| 46 | for (depth1 = 0, cur = node1;cur->parent != NULL;cur = cur->parent) { | ||
| 47 | - if (cur == node2) | ||
| 48 | + if (cur->parent == node2) | ||
| 49 | return(-1); | ||
| 50 | depth1++; | ||
| 51 | } | ||
| 52 | @@ -14005,9 +14005,14 @@ xmlXPathCompOpEval(xmlXPathParserContextPtr ctxt, xmlXPathStepOpPtr op) | ||
| 53 | xmlNodeSetPtr oldset; | ||
| 54 | int i, j; | ||
| 55 | |||
| 56 | - if (op->ch1 != -1) | ||
| 57 | + if (op->ch1 != -1) { | ||
| 58 | total += | ||
| 59 | xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); | ||
| 60 | + CHECK_ERROR0; | ||
| 61 | + } | ||
| 62 | + if (ctxt->value == NULL) { | ||
| 63 | + XP_ERROR0(XPATH_INVALID_OPERAND); | ||
| 64 | + } | ||
| 65 | if (op->ch2 == -1) | ||
| 66 | return (total); | ||
| 67 | |||
diff --git a/meta/recipes-core/libxml/libxml2/runtest.patch b/meta/recipes-core/libxml/libxml2/runtest.patch index 6e56857caf..cb171d5b36 100644 --- a/meta/recipes-core/libxml/libxml2/runtest.patch +++ b/meta/recipes-core/libxml/libxml2/runtest.patch | |||
| @@ -2,47 +2,29 @@ Add 'install-ptest' rule. | |||
| 2 | Print a standard result line for each test. | 2 | Print a standard result line for each test. |
| 3 | 3 | ||
| 4 | Signed-off-by: Mihaela Sendrea <mihaela.sendrea@enea.com> | 4 | Signed-off-by: Mihaela Sendrea <mihaela.sendrea@enea.com> |
| 5 | Signed-off-by: Andrej Valek <andrej.valek@enea.com> | 5 | Signed-off-by: Andrej Valek <andrej.valek@siemens.com> |
| 6 | Upstream-Status: Backport | 6 | Upstream-Status: Backport |
| 7 | 7 | ||
| 8 | diff -uNr a/Makefile.am b/Makefile.am | 8 | diff -uNr a/Makefile.am b/Makefile.am |
| 9 | --- a/Makefile.am 2016-05-22 03:49:02.000000000 +0200 | 9 | --- a/Makefile.am 2017-08-28 15:01:14.000000000 +0200 |
| 10 | +++ b/Makefile.am 2017-06-14 10:38:43.381305385 +0200 | 10 | +++ b/Makefile.am 2017-09-05 08:06:05.752287323 +0200 |
| 11 | @@ -202,10 +202,24 @@ | 11 | @@ -202,6 +202,15 @@ |
| 12 | #testOOM_DEPENDENCIES = $(DEPS) | 12 | #testOOM_DEPENDENCIES = $(DEPS) |
| 13 | #testOOM_LDADD= $(LDADDS) | 13 | #testOOM_LDADD= $(LDADDS) |
| 14 | 14 | ||
| 15 | +install-ptest: | 15 | +install-ptest: |
| 16 | + @(if [ -d .libs ] ; then cd .libs; fi; \ | 16 | + @(if [ -d .libs ] ; then cd .libs; fi; \ |
| 17 | + install $(noinst_PROGRAMS) $(DESTDIR)) | 17 | + install $(check_PROGRAMS) $(DESTDIR)) |
| 18 | + cp -r $(srcdir)/test $(DESTDIR) | 18 | + cp -r $(srcdir)/test $(DESTDIR) |
| 19 | + cp -r $(srcdir)/result $(DESTDIR) | 19 | + cp -r $(srcdir)/result $(DESTDIR) |
| 20 | + cp -r $(srcdir)/python $(DESTDIR) | 20 | + cp -r $(srcdir)/python $(DESTDIR) |
| 21 | + cp Makefile $(DESTDIR) | 21 | + cp Makefile $(DESTDIR) |
| 22 | + sed -i -e 's|^Makefile:|_Makefile:|' $(DESTDIR)/Makefile | 22 | + sed -i -e 's|^Makefile:|_Makefile:|' $(DESTDIR)/Makefile |
| 23 | + | 23 | + |
| 24 | runtests: | 24 | runtests: runtest$(EXEEXT) testrecurse$(EXEEXT) testapi$(EXEEXT) \ |
| 25 | testchar$(EXEEXT) testdict$(EXEEXT) runxmlconf$(EXEEXT) | ||
| 25 | [ -d test ] || $(LN_S) $(srcdir)/test . | 26 | [ -d test ] || $(LN_S) $(srcdir)/test . |
| 26 | [ -d result ] || $(LN_S) $(srcdir)/result . | 27 | |
| 27 | - $(CHECKER) ./runtest$(EXEEXT) && $(CHECKER) ./testrecurse$(EXEEXT) &&$(CHECKER) ./testapi$(EXEEXT) && $(CHECKER) ./testchar$(EXEEXT)&& $(CHECKER) ./testdict$(EXEEXT) && $(CHECKER) ./runxmlconf$(EXEEXT) | ||
| 28 | + $(CHECKER) ./runtest$(EXEEXT) && \ | ||
| 29 | + $(CHECKER) ./testrecurse$(EXEEXT) && \ | ||
| 30 | + ASAN_OPTIONS="$$ASAN_OPTIONS:detect_leaks=0" $(CHECKER) ./testapi$(EXEEXT) && \ | ||
| 31 | + $(CHECKER) ./testchar$(EXEEXT) && \ | ||
| 32 | + $(CHECKER) ./testdict$(EXEEXT) && \ | ||
| 33 | + $(CHECKER) ./runxmlconf$(EXEEXT) | ||
| 34 | @(if [ "$(PYTHON_SUBDIR)" != "" ] ; then cd python ; \ | ||
| 35 | $(MAKE) tests ; fi) | ||
| 36 | |||
| 37 | @@ -229,7 +243,7 @@ | ||
| 38 | |||
| 39 | APItests: testapi$(EXEEXT) | ||
| 40 | @echo "## Running the API regression tests this may take a little while" | ||
| 41 | - -@($(CHECKER) $(top_builddir)/testapi -q) | ||
| 42 | + -@(ASAN_OPTIONS="$$ASAN_OPTIONS:detect_leaks=0" $(CHECKER) $(top_builddir)/testapi -q) | ||
| 43 | |||
| 44 | HTMLtests : testHTML$(EXEEXT) | ||
| 45 | @(echo > .memdump) | ||
| 46 | diff -uNr a/runsuite.c b/runsuite.c | 28 | diff -uNr a/runsuite.c b/runsuite.c |
| 47 | --- a/runsuite.c 2013-04-12 16:17:11.462823238 +0200 | 29 | --- a/runsuite.c 2013-04-12 16:17:11.462823238 +0200 |
| 48 | +++ b/runsuite.c 2013-04-17 14:07:24.352693211 +0200 | 30 | +++ b/runsuite.c 2013-04-17 14:07:24.352693211 +0200 |
diff --git a/meta/recipes-core/libxml/libxml2_2.9.4.bb b/meta/recipes-core/libxml/libxml2_2.9.5.bb index 9adb29cfdd..df060d7266 100644 --- a/meta/recipes-core/libxml/libxml2_2.9.4.bb +++ b/meta/recipes-core/libxml/libxml2_2.9.5.bb | |||
| @@ -19,21 +19,11 @@ SRC_URI = "http://www.xmlsoft.org/sources/libxml2-${PV}.tar.gz;name=libtar \ | |||
| 19 | file://run-ptest \ | 19 | file://run-ptest \ |
| 20 | file://python-sitepackages-dir.patch \ | 20 | file://python-sitepackages-dir.patch \ |
| 21 | file://libxml-m4-use-pkgconfig.patch \ | 21 | file://libxml-m4-use-pkgconfig.patch \ |
| 22 | file://libxml2-fix_node_comparison.patch \ | ||
| 23 | file://libxml2-CVE-2016-5131.patch \ | ||
| 24 | file://libxml2-CVE-2016-4658.patch \ | ||
| 25 | file://libxml2-fix_NULL_pointer_derefs.patch \ | ||
| 26 | file://libxml2-fix_and_simplify_xmlParseStartTag2.patch \ | ||
| 27 | file://libxml2-CVE-2017-9047_CVE-2017-9048.patch \ | ||
| 28 | file://libxml2-CVE-2017-9049_CVE-2017-9050.patch \ | ||
| 29 | file://libxml2-CVE-2017-5969.patch \ | ||
| 30 | file://libxml2-CVE-2017-0663.patch \ | ||
| 31 | file://libxml2-CVE-2017-8872.patch \ | ||
| 32 | file://0001-Make-ptest-run-the-python-tests-if-python-is-enabled.patch \ | 22 | file://0001-Make-ptest-run-the-python-tests-if-python-is-enabled.patch \ |
| 33 | " | 23 | " |
| 34 | 24 | ||
| 35 | SRC_URI[libtar.md5sum] = "ae249165c173b1ff386ee8ad676815f5" | 25 | SRC_URI[libtar.md5sum] = "5ce0da9bdaa267b40c4ca36d35363b8b" |
| 36 | SRC_URI[libtar.sha256sum] = "ffb911191e509b966deb55de705387f14156e1a56b21824357cdf0053233633c" | 26 | SRC_URI[libtar.sha256sum] = "4031c1ecee9ce7ba4f313e91ef6284164885cdb69937a123f6a83bb6a72dcd38" |
| 37 | SRC_URI[testtar.md5sum] = "ae3d1ebe000a3972afa104ca7f0e1b4a" | 27 | SRC_URI[testtar.md5sum] = "ae3d1ebe000a3972afa104ca7f0e1b4a" |
| 38 | SRC_URI[testtar.sha256sum] = "96151685cec997e1f9f3387e3626d61e6284d4d6e66e0e440c209286c03e9cc7" | 28 | SRC_URI[testtar.sha256sum] = "96151685cec997e1f9f3387e3626d61e6284d4d6e66e0e440c209286c03e9cc7" |
| 39 | 29 | ||
| @@ -81,6 +71,10 @@ do_configure_prepend () { | |||
| 81 | find ${WORKDIR}/xmlconf/ -type f -exec chmod -x {} \+ | 71 | find ${WORKDIR}/xmlconf/ -type f -exec chmod -x {} \+ |
| 82 | } | 72 | } |
| 83 | 73 | ||
| 74 | do_compile_ptest() { | ||
| 75 | oe_runmake check-am | ||
| 76 | } | ||
| 77 | |||
| 84 | do_install_ptest () { | 78 | do_install_ptest () { |
| 85 | cp -r ${WORKDIR}/xmlconf ${D}${PTEST_PATH} | 79 | cp -r ${WORKDIR}/xmlconf ${D}${PTEST_PATH} |
| 86 | if [ "${@bb.utils.filter('PACKAGECONFIG', 'python', d)}" ]; then | 80 | if [ "${@bb.utils.filter('PACKAGECONFIG', 'python', d)}" ]; then |
