[OE-core] [PATCH v3 2/7] libxml2: Avoid reparsing and simplify control flow in xmlParseStartTag2

Burton, Ross ross.burton at intel.com
Thu Jun 15 12:15:16 UTC 2017


This patch won't apply, probably because of the crazy encodings.  Can you
push the series to a branch?

Ross

On 15 June 2017 at 13:08, Andrej Valek <andrej.valek at siemens.com> wrote:

> Signed-off-by: Andrej Valek <andrej.valek at siemens.com>
> ---
>  ...ibxml2-fix_and_simplify_xmlParseStartTag2.patch | 590
> +++++++++++++++++++++
>  meta/recipes-core/libxml/libxml2_2.9.4.bb          |   1 +
>  2 files changed, 591 insertions(+)
>  create mode 100644 meta/recipes-core/libxml/libxml2/libxml2-fix_and_
> simplify_xmlParseStartTag2.patch
>
> 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
> new file mode 100644
> index 0000000..faa5770
> --- /dev/null
> +++ b/meta/recipes-core/libxml/libxml2/libxml2-fix_and_
> simplify_xmlParseStartTag2.patch
> @@ -0,0 +1,590 @@
> +libxml2-2.9.4: Avoid reparsing and simplify control flow in
> xmlParseStartTag2
> +
> +[No upstream tracking]
> +
> +parser: Avoid reparsing in xmlParseStartTag2
> +
> +The code in xmlParseStartTag2 must handle the case that the input
> +buffer was grown and reallocated which can invalidate pointers to
> +attribute values. Before, this was handled by detecting changes of
> +the input buffer "base" pointer and, in case of a change, jumping
> +back to the beginning of the function and reparsing the start tag.
> +
> +The major problem of this approach is that whether an input buffer is
> +reallocated is nondeterministic, resulting in seemingly random test
> +failures. See the mailing list thread "runtest mystery bug: name2.xml
> +error case regression test" from 2012, for example.
> +
> +If a reallocation was detected, the code also made no attempts to
> +continue parsing in case of errors which makes a difference in
> +the lax "recover" mode.
> +
> +Now we store the current input buffer "base" pointer for each (not
> +separately allocated) attribute in the namespace URI field, which isn't
> +used until later. After the whole start tag was parsed, the pointers to
> +the attribute values are reconstructed using the offset between the
> +new and the old input buffer. This relies on arithmetic on dangling
> +pointers which is technically undefined behavior. But it seems like
> +the easiest and most efficient fix and a similar approach is used in
> +xmlParserInputGrow.
> +
> +This changes the error output of several tests, typically making it
> +more verbose because we try harder to continue parsing in case of errors.
> +
> +(Another possible solution is to check not only the "base" pointer
> +but the size of the input buffer as well. But this would result in
> +even more reparsing.)
> +
> +Remove some goto labels and deduplicate a bit of code after handling
> +namespaces.
> +
> +There were two bugs where parameter-entity references could lead to an
> +unexpected change of the input buffer in xmlParseNameComplex and
> +xmlDictLookup being called with an invalid pointer.
> +
> +
> +Upstream-Status: Backport
> + - [https://git.gnome.org/browse/libxml2/commit/?id=
> 07b7428b69c368611d215a140fe630b2d1e61349]
> + - [https://git.gnome.org/browse/libxml2/commit/?id=
> 855c19efb7cd30d927d673b3658563c4959ca6f0]
> +Signed-off-by: Andrej Valek <andrej.valek at siemens.com>
> +
> +diff --git a/parser.c b/parser.c
> +index 609a270..74016e3 100644
> +--- a/parser.c
> ++++ b/parser.c
> +@@ -43,6 +43,7 @@
> + #include <limits.h>
> + #include <string.h>
> + #include <stdarg.h>
> ++#include <stddef.h>
> + #include <libxml/xmlmemory.h>
> + #include <libxml/threads.h>
> + #include <libxml/globals.h>
> +@@ -9377,8 +9378,7 @@ xmlParseStartTag2(xmlParserCtxtPtr ctxt, const
> xmlChar **pref,
> +     const xmlChar **atts = ctxt->atts;
> +     int maxatts = ctxt->maxatts;
> +     int nratts, nbatts, nbdef;
> +-    int i, j, nbNs, attval, oldline, oldcol, inputNr;
> +-    const xmlChar *base;
> ++    int i, j, nbNs, attval;
> +     unsigned long cur;
> +     int nsNr = ctxt->nsNr;
> +
> +@@ -9392,13 +9392,8 @@ xmlParseStartTag2(xmlParserCtxtPtr ctxt, const
> xmlChar **pref,
> +      *       The Shrinking is only possible once the full set of
> attribute
> +      *       callbacks have been done.
> +      */
> +-reparse:
> +     SHRINK;
> +-    base = ctxt->input->base;
> +     cur = ctxt->input->cur - ctxt->input->base;
> +-    inputNr = ctxt->inputNr;
> +-    oldline = ctxt->input->line;
> +-    oldcol = ctxt->input->col;
> +     nbatts = 0;
> +     nratts = 0;
> +     nbdef = 0;
> +@@ -9422,8 +9417,6 @@ reparse:
> +      */
> +     SKIP_BLANKS;
> +     GROW;
> +-    if ((ctxt->input->base != base) || (inputNr != ctxt->inputNr))
> +-        goto base_changed;
> +
> +     while (((RAW != '>') &&
> +          ((RAW != '/') || (NXT(1) != '>')) &&
> +@@ -9434,203 +9427,174 @@ reparse:
> +
> +       attname = xmlParseAttribute2(ctxt, prefix, localname,
> +                                    &aprefix, &attvalue, &len, &alloc);
> +-      if ((ctxt->input->base != base) || (inputNr != ctxt->inputNr)) {
> +-          if ((attvalue != NULL) && (alloc != 0))
> +-              xmlFree(attvalue);
> +-          attvalue = NULL;
> +-          goto base_changed;
> +-      }
> +-        if ((attname != NULL) && (attvalue != NULL)) {
> +-          if (len < 0) len = xmlStrlen(attvalue);
> +-            if ((attname == ctxt->str_xmlns) && (aprefix == NULL)) {
> +-              const xmlChar *URL = xmlDictLookup(ctxt->dict, attvalue,
> len);
> +-              xmlURIPtr uri;
> +-
> +-                if (URL == NULL) {
> +-                  xmlErrMemory(ctxt, "dictionary allocation failure");
> +-                  if ((attvalue != NULL) && (alloc != 0))
> +-                      xmlFree(attvalue);
> +-                  return(NULL);
> +-              }
> +-                if (*URL != 0) {
> +-                  uri = xmlParseURI((const char *) URL);
> +-                  if (uri == NULL) {
> +-                      xmlNsErr(ctxt, XML_WAR_NS_URI,
> +-                               "xmlns: '%s' is not a valid URI\n",
> +-                                         URL, NULL, NULL);
> +-                  } else {
> +-                      if (uri->scheme == NULL) {
> +-                          xmlNsWarn(ctxt, XML_WAR_NS_URI_RELATIVE,
> +-                                    "xmlns: URI %s is not absolute\n",
> +-                                    URL, NULL, NULL);
> +-                      }
> +-                      xmlFreeURI(uri);
> +-                  }
> +-                  if (URL == ctxt->str_xml_ns) {
> +-                      if (attname != ctxt->str_xml) {
> +-                          xmlNsErr(ctxt, XML_NS_ERR_XML_NAMESPACE,
> +-                       "xml namespace URI cannot be the default
> namespace\n",
> +-                                   NULL, NULL, NULL);
> +-                      }
> +-                      goto skip_default_ns;
> +-                  }
> +-                  if ((len == 29) &&
> +-                      (xmlStrEqual(URL,
> +-                               BAD_CAST "http://www.w3.org/2000/xmlns/")))
> {
> +-                      xmlNsErr(ctxt, XML_NS_ERR_XML_NAMESPACE,
> +-                           "reuse of the xmlns namespace name is
> forbidden\n",
> +-                               NULL, NULL, NULL);
> +-                      goto skip_default_ns;
> +-                  }
> +-              }
> +-              /*
> +-               * check that it's not a defined namespace
> +-               */
> +-              for (j = 1;j <= nbNs;j++)
> +-                  if (ctxt->nsTab[ctxt->nsNr - 2 * j] == NULL)
> +-                      break;
> +-              if (j <= nbNs)
> +-                  xmlErrAttributeDup(ctxt, NULL, attname);
> +-              else
> +-                  if (nsPush(ctxt, NULL, URL) > 0) nbNs++;
> +-skip_default_ns:
> +-              if ((attvalue != NULL) && (alloc != 0)) {
> +-                  xmlFree(attvalue);
> +-                  attvalue = NULL;
> +-              }
> +-              if ((RAW == '>') || (((RAW == '/') && (NXT(1) == '>'))))
> +-                  break;
> +-              if (!IS_BLANK_CH(RAW)) {
> +-                  xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED,
> +-                                 "attributes construct error\n");
> +-                  break;
> +-              }
> +-              SKIP_BLANKS;
> +-              if ((ctxt->input->base != base) || (inputNr !=
> ctxt->inputNr))
> +-                  goto base_changed;
> +-              continue;
> +-          }
> +-            if (aprefix == ctxt->str_xmlns) {
> +-              const xmlChar *URL = xmlDictLookup(ctxt->dict, attvalue,
> len);
> +-              xmlURIPtr uri;
> +-
> +-                if (attname == ctxt->str_xml) {
> +-                  if (URL != ctxt->str_xml_ns) {
> +-                      xmlNsErr(ctxt, XML_NS_ERR_XML_NAMESPACE,
> +-                               "xml namespace prefix mapped to wrong
> URI\n",
> +-                               NULL, NULL, NULL);
> +-                  }
> +-                  /*
> +-                   * Do not keep a namespace definition node
> +-                   */
> +-                  goto skip_ns;
> +-              }
> ++        if ((attname == NULL) || (attvalue == NULL))
> ++            goto next_attr;
> ++      if (len < 0) len = xmlStrlen(attvalue);
> ++
> ++        if ((attname == ctxt->str_xmlns) && (aprefix == NULL)) {
> ++            const xmlChar *URL = xmlDictLookup(ctxt->dict, attvalue,
> len);
> ++            xmlURIPtr uri;
> ++
> ++            if (URL == NULL) {
> ++                xmlErrMemory(ctxt, "dictionary allocation failure");
> ++                if ((attvalue != NULL) && (alloc != 0))
> ++                    xmlFree(attvalue);
> ++                return(NULL);
> ++            }
> ++            if (*URL != 0) {
> ++                uri = xmlParseURI((const char *) URL);
> ++                if (uri == NULL) {
> ++                    xmlNsErr(ctxt, XML_WAR_NS_URI,
> ++                             "xmlns: '%s' is not a valid URI\n",
> ++                                       URL, NULL, NULL);
> ++                } else {
> ++                    if (uri->scheme == NULL) {
> ++                        xmlNsWarn(ctxt, XML_WAR_NS_URI_RELATIVE,
> ++                                  "xmlns: URI %s is not absolute\n",
> ++                                  URL, NULL, NULL);
> ++                    }
> ++                    xmlFreeURI(uri);
> ++                }
> +                 if (URL == ctxt->str_xml_ns) {
> +-                  if (attname != ctxt->str_xml) {
> +-                      xmlNsErr(ctxt, XML_NS_ERR_XML_NAMESPACE,
> +-                               "xml namespace URI mapped to wrong
> prefix\n",
> +-                               NULL, NULL, NULL);
> +-                  }
> +-                  goto skip_ns;
> +-              }
> +-                if (attname == ctxt->str_xmlns) {
> +-                  xmlNsErr(ctxt, XML_NS_ERR_XML_NAMESPACE,
> +-                           "redefinition of the xmlns prefix is
> forbidden\n",
> +-                           NULL, NULL, NULL);
> +-                  goto skip_ns;
> +-              }
> +-              if ((len == 29) &&
> +-                  (xmlStrEqual(URL,
> +-                               BAD_CAST "http://www.w3.org/2000/xmlns/")))
> {
> +-                  xmlNsErr(ctxt, XML_NS_ERR_XML_NAMESPACE,
> +-                           "reuse of the xmlns namespace name is
> forbidden\n",
> +-                           NULL, NULL, NULL);
> +-                  goto skip_ns;
> +-              }
> +-              if ((URL == NULL) || (URL[0] == 0)) {
> +-                  xmlNsErr(ctxt, XML_NS_ERR_XML_NAMESPACE,
> +-                           "xmlns:%s: Empty XML namespace is not
> allowed\n",
> +-                                attname, NULL, NULL);
> +-                  goto skip_ns;
> +-              } else {
> +-                  uri = xmlParseURI((const char *) URL);
> +-                  if (uri == NULL) {
> +-                      xmlNsErr(ctxt, XML_WAR_NS_URI,
> +-                           "xmlns:%s: '%s' is not a valid URI\n",
> +-                                         attname, URL, NULL);
> +-                  } else {
> +-                      if ((ctxt->pedantic) && (uri->scheme == NULL)) {
> +-                          xmlNsWarn(ctxt, XML_WAR_NS_URI_RELATIVE,
> +-                                    "xmlns:%s: URI %s is not absolute\n",
> +-                                    attname, URL, NULL);
> +-                      }
> +-                      xmlFreeURI(uri);
> +-                  }
> +-              }
> +-
> +-              /*
> +-               * check that it's not a defined namespace
> +-               */
> +-              for (j = 1;j <= nbNs;j++)
> +-                  if (ctxt->nsTab[ctxt->nsNr - 2 * j] == attname)
> +-                      break;
> +-              if (j <= nbNs)
> +-                  xmlErrAttributeDup(ctxt, aprefix, attname);
> +-              else
> +-                  if (nsPush(ctxt, attname, URL) > 0) nbNs++;
> +-skip_ns:
> +-              if ((attvalue != NULL) && (alloc != 0)) {
> +-                  xmlFree(attvalue);
> +-                  attvalue = NULL;
> +-              }
> +-              if ((RAW == '>') || (((RAW == '/') && (NXT(1) == '>'))))
> +-                  break;
> +-              if (!IS_BLANK_CH(RAW)) {
> +-                  xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED,
> +-                                 "attributes construct error\n");
> +-                  break;
> +-              }
> +-              SKIP_BLANKS;
> +-              if ((ctxt->input->base != base) || (inputNr !=
> ctxt->inputNr))
> +-                  goto base_changed;
> +-              continue;
> +-          }
> ++                    if (attname != ctxt->str_xml) {
> ++                        xmlNsErr(ctxt, XML_NS_ERR_XML_NAMESPACE,
> ++                     "xml namespace URI cannot be the default
> namespace\n",
> ++                                 NULL, NULL, NULL);
> ++                    }
> ++                    goto next_attr;
> ++                }
> ++                if ((len == 29) &&
> ++                    (xmlStrEqual(URL,
> ++                             BAD_CAST "http://www.w3.org/2000/xmlns/")))
> {
> ++                    xmlNsErr(ctxt, XML_NS_ERR_XML_NAMESPACE,
> ++                         "reuse of the xmlns namespace name is
> forbidden\n",
> ++                             NULL, NULL, NULL);
> ++                    goto next_attr;
> ++                }
> ++            }
> ++            /*
> ++             * check that it's not a defined namespace
> ++             */
> ++            for (j = 1;j <= nbNs;j++)
> ++                if (ctxt->nsTab[ctxt->nsNr - 2 * j] == NULL)
> ++                    break;
> ++            if (j <= nbNs)
> ++                xmlErrAttributeDup(ctxt, NULL, attname);
> ++            else
> ++                if (nsPush(ctxt, NULL, URL) > 0) nbNs++;
> ++
> ++        } else if (aprefix == ctxt->str_xmlns) {
> ++            const xmlChar *URL = xmlDictLookup(ctxt->dict, attvalue,
> len);
> ++            xmlURIPtr uri;
> ++
> ++            if (attname == ctxt->str_xml) {
> ++                if (URL != ctxt->str_xml_ns) {
> ++                    xmlNsErr(ctxt, XML_NS_ERR_XML_NAMESPACE,
> ++                             "xml namespace prefix mapped to wrong
> URI\n",
> ++                             NULL, NULL, NULL);
> ++                }
> ++                /*
> ++                 * Do not keep a namespace definition node
> ++                 */
> ++                goto next_attr;
> ++            }
> ++            if (URL == ctxt->str_xml_ns) {
> ++                if (attname != ctxt->str_xml) {
> ++                    xmlNsErr(ctxt, XML_NS_ERR_XML_NAMESPACE,
> ++                             "xml namespace URI mapped to wrong
> prefix\n",
> ++                             NULL, NULL, NULL);
> ++                }
> ++                goto next_attr;
> ++            }
> ++            if (attname == ctxt->str_xmlns) {
> ++                xmlNsErr(ctxt, XML_NS_ERR_XML_NAMESPACE,
> ++                         "redefinition of the xmlns prefix is
> forbidden\n",
> ++                         NULL, NULL, NULL);
> ++                goto next_attr;
> ++            }
> ++            if ((len == 29) &&
> ++                (xmlStrEqual(URL,
> ++                             BAD_CAST "http://www.w3.org/2000/xmlns/")))
> {
> ++                xmlNsErr(ctxt, XML_NS_ERR_XML_NAMESPACE,
> ++                         "reuse of the xmlns namespace name is
> forbidden\n",
> ++                         NULL, NULL, NULL);
> ++                goto next_attr;
> ++            }
> ++            if ((URL == NULL) || (URL[0] == 0)) {
> ++                xmlNsErr(ctxt, XML_NS_ERR_XML_NAMESPACE,
> ++                         "xmlns:%s: Empty XML namespace is not
> allowed\n",
> ++                              attname, NULL, NULL);
> ++                goto next_attr;
> ++            } else {
> ++                uri = xmlParseURI((const char *) URL);
> ++                if (uri == NULL) {
> ++                    xmlNsErr(ctxt, XML_WAR_NS_URI,
> ++                         "xmlns:%s: '%s' is not a valid URI\n",
> ++                                       attname, URL, NULL);
> ++                } else {
> ++                    if ((ctxt->pedantic) && (uri->scheme == NULL)) {
> ++                        xmlNsWarn(ctxt, XML_WAR_NS_URI_RELATIVE,
> ++                                  "xmlns:%s: URI %s is not absolute\n",
> ++                                  attname, URL, NULL);
> ++                    }
> ++                    xmlFreeURI(uri);
> ++                }
> ++            }
> +
> +-          /*
> +-           * Add the pair to atts
> +-           */
> +-          if ((atts == NULL) || (nbatts + 5 > maxatts)) {
> +-              if (xmlCtxtGrowAttrs(ctxt, nbatts + 5) < 0) {
> +-                  if (attvalue[len] == 0)
> +-                      xmlFree(attvalue);
> +-                  goto failed;
> +-              }
> +-              maxatts = ctxt->maxatts;
> +-              atts = ctxt->atts;
> +-          }
> +-          ctxt->attallocs[nratts++] = alloc;
> +-          atts[nbatts++] = attname;
> +-          atts[nbatts++] = aprefix;
> +-          atts[nbatts++] = NULL; /* the URI will be fetched later */
> +-          atts[nbatts++] = attvalue;
> +-          attvalue += len;
> +-          atts[nbatts++] = attvalue;
> +-          /*
> +-           * tag if some deallocation is needed
> +-           */
> +-          if (alloc != 0) attval = 1;
> +-      } else {
> +-          if ((attvalue != NULL) && (attvalue[len] == 0))
> +-              xmlFree(attvalue);
> +-      }
> ++            /*
> ++             * check that it's not a defined namespace
> ++             */
> ++            for (j = 1;j <= nbNs;j++)
> ++                if (ctxt->nsTab[ctxt->nsNr - 2 * j] == attname)
> ++                    break;
> ++            if (j <= nbNs)
> ++                xmlErrAttributeDup(ctxt, aprefix, attname);
> ++            else
> ++                if (nsPush(ctxt, attname, URL) > 0) nbNs++;
> ++
> ++        } else {
> ++            /*
> ++             * Add the pair to atts
> ++             */
> ++            if ((atts == NULL) || (nbatts + 5 > maxatts)) {
> ++                if (xmlCtxtGrowAttrs(ctxt, nbatts + 5) < 0) {
> ++                    goto next_attr;
> ++                }
> ++                maxatts = ctxt->maxatts;
> ++                atts = ctxt->atts;
> ++            }
> ++            ctxt->attallocs[nratts++] = alloc;
> ++            atts[nbatts++] = attname;
> ++            atts[nbatts++] = aprefix;
> ++            /*
> ++             * The namespace URI field is used temporarily to point at
> the
> ++             * base of the current input buffer for non-alloced
> attributes.
> ++             * When the input buffer is reallocated, all the pointers
> become
> ++             * invalid, but they can be reconstructed later.
> ++             */
> ++            if (alloc)
> ++                atts[nbatts++] = NULL;
> ++            else
> ++                atts[nbatts++] = ctxt->input->base;
> ++            atts[nbatts++] = attvalue;
> ++            attvalue += len;
> ++            atts[nbatts++] = attvalue;
> ++            /*
> ++             * tag if some deallocation is needed
> ++             */
> ++            if (alloc != 0) attval = 1;
> ++            attvalue = NULL; /* moved into atts */
> ++        }
> +
> +-failed:
> ++next_attr:
> ++        if ((attvalue != NULL) && (alloc != 0)) {
> ++            xmlFree(attvalue);
> ++            attvalue = NULL;
> ++        }
> +
> +       GROW
> +         if (ctxt->instate == XML_PARSER_EOF)
> +             break;
> +-      if ((ctxt->input->base != base) || (inputNr != ctxt->inputNr))
> +-          goto base_changed;
> +       if ((RAW == '>') || (((RAW == '/') && (NXT(1) == '>'))))
> +           break;
> +       if (!IS_BLANK_CH(RAW)) {
> +@@ -9646,8 +9610,20 @@ failed:
> +           break;
> +       }
> +         GROW;
> +-      if ((ctxt->input->base != base) || (inputNr != ctxt->inputNr))
> +-          goto base_changed;
> ++    }
> ++
> ++    /* Reconstruct attribute value pointers. */
> ++    for (i = 0, j = 0; j < nratts; i += 5, j++) {
> ++        if (atts[i+2] != NULL) {
> ++            /*
> ++             * Arithmetic on dangling pointers is technically undefined
> ++             * behavior, but well...
> ++             */
> ++            ptrdiff_t offset = ctxt->input->base - atts[i+2];
> ++            atts[i+2]  = NULL;    /* Reset repurposed namespace URI */
> ++            atts[i+3] += offset;  /* value */
> ++            atts[i+4] += offset;  /* valuend */
> ++        }
> +     }
> +
> +     /*
> +@@ -9804,34 +9780,6 @@ failed:
> +     }
> +
> +     return(localname);
> +-
> +-base_changed:
> +-    /*
> +-     * the attribute strings are valid iif the base didn't changed
> +-     */
> +-    if (attval != 0) {
> +-      for (i = 3,j = 0; j < nratts;i += 5,j++)
> +-          if ((ctxt->attallocs[j] != 0) && (atts[i] != NULL))
> +-              xmlFree((xmlChar *) atts[i]);
> +-    }
> +-
> +-    /*
> +-     * We can't switch from one entity to another in the middle
> +-     * of a start tag
> +-     */
> +-    if (inputNr != ctxt->inputNr) {
> +-        xmlFatalErrMsg(ctxt, XML_ERR_ENTITY_BOUNDARY,
> +-                  "Start tag doesn't start and stop in the same
> entity\n");
> +-      return(NULL);
> +-    }
> +-
> +-    ctxt->input->cur = ctxt->input->base + cur;
> +-    ctxt->input->line = oldline;
> +-    ctxt->input->col = oldcol;
> +-    if (ctxt->wellFormed == 1) {
> +-      goto reparse;
> +-    }
> +-    return(NULL);
> + }
> +
> + /**
> +diff --git a/result/errors/759398.xml.err b/result/errors/759398.xml.err
> +index e08d9bf..f6036a3 100644
> +--- a/result/errors/759398.xml.err
> ++++ b/result/errors/759398.xml.err
> +@@ -1,9 +1,12 @@
> + ./test/errors/759398.xml:210: parser error : StartTag: invalid element
> name
> + need to worry about parsers whi<! don't expand PErefs finding
> +                                 ^
> +-./test/errors/759398.xml:309: parser error : Opening and ending tag
> mismatch: spec line 50 and termdef
> ++./test/errors/759398.xml:309: parser error : Opening and ending tag
> mismatch: №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№
> №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№
> №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№
> №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№
> №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№!
>  №№№
>  №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№
> №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№
> №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№
> №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№
> №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№
> №№№№№№№№№№№№№№№№№№№№№№№№№№№№№â!
>  ��№№â
>  ��№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№
> №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№
> №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№
> №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№
> №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№
> №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№�„!
>  �№№�„
>  �№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№
> №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№m
> line 308 and termdef
> + and provide access to their content and structure.</termdef> <termdef
> +                                                             ^
> +-./test/errors/759398.xml:309: parser error : Extra content at the end
> of the document
> +-and provide access to their content and structure.</termdef> <termdef
> +-                                                             ^
> ++./test/errors/759398.xml:314: parser error : Opening and ending tag
> mismatch: spec line 50 and p
> ++data and the information it must provide to the application.</p>
> ++                                                                ^
> ++./test/errors/759398.xml:316: parser error : Extra content at the end
> of the document
> ++<div2 id='sec-origin-goals'>
> ++^
> +diff --git a/result/errors/attr1.xml.err b/result/errors/attr1.xml.err
> +index 4f08538..c4c4fc8 100644
> +--- a/result/errors/attr1.xml.err
> ++++ b/result/errors/attr1.xml.err
> +@@ -1,6 +1,9 @@
> + ./test/errors/attr1.xml:2: parser error : AttValue: ' expected
> +
> + ^
> +-./test/errors/attr1.xml:1: parser error : Extra content at the end of
> the document
> +-<foo foo="oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooo
> +- ^
> ++./test/errors/attr1.xml:2: parser error : attributes construct error
> ++
> ++^
> ++./test/errors/attr1.xml:2: parser error : Couldn't find end of Start Tag
> foo line 1
> ++
> ++^
> +diff --git a/result/errors/attr2.xml.err b/result/errors/attr2.xml.err
> +index c8a9c7d..77e342e 100644
> +--- a/result/errors/attr2.xml.err
> ++++ b/result/errors/attr2.xml.err
> +@@ -1,6 +1,9 @@
> + ./test/errors/attr2.xml:2: parser error : AttValue: ' expected
> +
> + ^
> +-./test/errors/attr2.xml:1: parser error : Extra content at the end of
> the document
> +-<foo foo=">oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> ooooooooo
> +- ^
> ++./test/errors/attr2.xml:2: parser error : attributes construct error
> ++
> ++^
> ++./test/errors/attr2.xml:2: parser error : Couldn't find end of Start Tag
> foo line 1
> ++
> ++^
> +diff --git a/result/errors/name2.xml.err b/result/errors/name2.xml.err
> +index a6649a1..8a6acee 100644
> +--- a/result/errors/name2.xml.err
> ++++ b/result/errors/name2.xml.err
> +@@ -1,6 +1,9 @@
> + ./test/errors/name2.xml:2: parser error : Specification mandate value
> for attribute fooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo!
>  ooooooooo
>  oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooo!
>  ooooooooo
>  oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooo!
>  ooooooooo
>  oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooo!
>  ooooooooo
>  oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooo!
>  ooooooooo
>  oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> ooooooooooooooooooooo
> +
> + ^
> +-./test/errors/name2.xml:1: parser error : Extra content at the end of
> the document
> +-<foo fooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
> ooooooooooooooo
> +- ^
> ++./test/errors/name2.xml:2: parser error : attributes construct error
> ++
> ++^
> ++./test/errors/name2.xml:2: parser error : Couldn't find end of Start Tag
> foo line 1
> ++
> ++^
> diff --git a/meta/recipes-core/libxml/libxml2_2.9.4.bb
> b/meta/recipes-core/libxml/libxml2_2.9.4.bb
> index 4f60781..0577ad6 100644
> --- a/meta/recipes-core/libxml/libxml2_2.9.4.bb
> +++ b/meta/recipes-core/libxml/libxml2_2.9.4.bb
> @@ -23,6 +23,7 @@ SRC_URI = "ftp://xmlsoft.org/libxml2/
> libxml2-${PV}.tar.gz;name=libtar \
>             file://libxml2-CVE-2016-5131.patch \
>             file://libxml2-CVE-2016-4658.patch \
>             file://libxml2-fix_NULL_pointer_derefs.patch \
> +           file://libxml2-fix_and_simplify_xmlParseStartTag2.patch \
>             file://CVE-2016-9318.patch \
>             file://0001-Make-ptest-run-the-python-tests-if-python-is-enabled.patch
> \
>             "
> --
> 2.1.4
>
>
> --
> _______________________________________________
> Openembedded-core mailing list
> Openembedded-core at lists.openembedded.org
> http://lists.openembedded.org/mailman/listinfo/openembedded-core
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openembedded.org/pipermail/openembedded-core/attachments/20170615/bfd4955c/attachment-0002.html>


More information about the Openembedded-core mailing list