XML::Parser versions through 2.45 for Perl could overflow the pre-allocated buffer size cause a heap corruption (double free or corruption) and crashes.
A :utf8 PerlIO layer, parse_stream() in Expat.xs could overflow the XML input buffer because Perl's read() returns decoded characters while SvPV() gives back multi-byte UTF-8 bytes that can exceed the pre-allocated buffer size. This can cause heap corruption (double free or corruption) and crashes.
XML::Parser versions through 2.47 for Perl has an off-by-one heap buffer overflow in st_serial_stack.
In the case (stackptr == stacksize - 1), the stack will NOT be expanded. Then the new value will be written at location (++stackptr), which equals stacksize and therefore falls just outside the allocated buffer.
The bug can be observed when parsing an XML file with very deep element nesting
Ken Beesley <ken.beesley@xrce.xerox.com> discovered that declarations in the external subset are not sent to registered handlers when there is no internal subset.
Fixed parse_dtd to work when entity values or attribute defaults are so large that they might be broken across multiple calls to the default handler.
For lwp_ext_ent_handler, use URI::URL instead of URI so that old 5.004 installations will work with it.