• Show log

    Commit

  • Hash : 855c19ef
    Author : Nick Wellnhofer
    Date : 2017-06-01T01:04:08

    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.)
    

  • README

  •                   XML toolkit from the GNOME project
    
    Full documentation is available on-line at
        http://xmlsoft.org/
    
    This code is released under the MIT Licence see the Copyright file.
    
    To build on an Unixised setup:
       ./configure ; make ; make install
    To build on Windows:
       see instructions on win32/Readme.txt
    
    To assert build quality:
       on an Unixised setup:
          run make tests
       otherwise:
           There is 3 standalone tools runtest.c runsuite.c testapi.c, which
           should compile as part of the build or as any application would.
           Launch them from this directory to get results, runtest checks 
           the proper functionning of libxml2 main APIs while testapi does
           a full coverage check. Report failures to the list.
    
    To report bugs, follow the instructions at: 
      http://xmlsoft.org/bugs.html
    
    A mailing-list xml@gnome.org is available, to subscribe:
        http://mail.gnome.org/mailman/listinfo/xml
    
    The list archive is at:
        http://mail.gnome.org/archives/xml/
    
    All technical answers asked privately will be automatically answered on
    the list and archived for public access unless privacy is explicitly
    required and justified.
    
    Daniel Veillard
    
    $Id$