Package: libxml-xerces-perl
Version: 2.7.0-0-2
Severity: normal
When calling parse() on an XML::Xerces::XercesDOMParser that has a custom
entity resolver set, perl will segfault. I have created a simple example that
can demonstrate the segfault. To run, just save the driver, entity resolver,
xml, and dtd code into 4 seperate files ( say, driver.pl,
ConfEntityResolver.pm, Sample.xml, and Sample.dtd ). Then run ./driver.pl
Sample.xml
This will segfault and dump core. A backtrace of the core ( gdb perl -c
<corefile> ) shows:
#0 0xb785fa03 in xercesc_2_7::ReaderMgr::createReader () from
/usr/lib/libxerces-c.so.27
#1 0xb786161f in xercesc_2_7::ReaderMgr::createReader () from
/usr/lib/libxerces-c.so.27
#2 0xb782b8e4 in xercesc_2_7::IGXMLScanner::scanDocTypeDecl () from
/usr/lib/libxerces-c.so.27
#3 0xb78f4e36 in xercesc_2_7::XMLScanner::scanProlog () from
/usr/lib/libxerces-c.so.27
#4 0xb782f67f in xercesc_2_7::IGXMLScanner::scanDocument () from
/usr/lib/libxerces-c.so.27
#5 0xb7783738 in xercesc_2_7::AbstractDOMParser::parse () from
/usr/lib/libxerces-c.so.27
#6 0xb7aa16ef in _wrap_AbstractDOMParser_parse__SWIG_0 () from
/usr/lib/perl5/auto/XML/Xerces/Xerces.so
#7 0xb7af71a6 in _wrap_AbstractDOMParser_parse () from
/usr/lib/perl5/auto/XML/Xerces/Xerces.so
#8 0x080bdaa1 in Perl_pp_entersub ()
#9 0x080bc379 in Perl_runops_standard ()
#10 0x08063bfd in perl_run ()
#11 0x0805ffd1 in main ()
PERL DRIVER PROGRAM
#!/usr/bin/perl
use ConfEntityResolver;
use XML::Xerces;
use File::Spec;
use File::Basename;
my $Prog = basename($0);
die "Usage: $Prog xmlfile\n" unless scalar( @ARGV ) == 1;
my $Parser = XML::Xerces::XercesDOMParser->new();
$Parser->setValidationScheme($XML::Xerces::AbstractDOMParser::Val_Never);
my $ERROR_HANDLER = XML::Xerces::PerlErrorHandler->new();
$Parser->setErrorHandler($ERROR_HANDLER);
my $Xml = $ARGV[0];
open( XML, $Xml ) || die "Can't open file '$XML'";
my $Contents = join( '', <XML> );
close( FILE );
my $Conf = $ARGV[1];
my $InputSource = XML::Xerces::LocalFileInputSource->new( $Xml );
my $InputSource = XML::Xerces::MemBufInputSource->new
( $Contents, length( $Contents ) );
my $EntityResolver =
ConfEntityResolver->new( {
SearchDirs =>
[ File::Basename::dirname( $Xml ) ]
} );
$Parser->setEntityResolver( $EntityResolver );
eval { $Parser->parse( $InputSource ) };
ENTITY RESOLVER PACKAGE
package ConfEntityResolver;
use vars qw( @ISA );
@ISA = qw( XML::Xerces::PerlEntityResolver );
sub new
{
my $Proto = shift @_;
my $Self = $Proto->SUPER::new();
my $Args = shift @_;
$Self->{SearchDirs} = $Args->{SearchDirs};
return $Self;
}
sub resolve_entity
{
my ( $Self, $PublicId, $SystemId ) = @_;
print "Resolving $PublicId $SystemId\n";
# Try the search directories in the order specified.
foreach my $Directory ( @{ $Self->{SearchDirs} } )
{
my $TestPath = File::Spec->catfile( $Directory, $SystemId );
if( -e $TestPath )
{
print "Done Resolving $PublicId $SystemId\n";
return XML::Xerces::LocalFileInputSource->new( $TestPath );
}
}
die "Unable to locate Entity '$SystemId' search directories:" .
join( ":", @{ $Self->{SearchDirs} } ) . "\n";
return undef;
}
1;
SAMPLE XML FILE
<?xml version="1.0" encoding="us-ascii" ?>
<!DOCTYPE Configuration SYSTEM "Sample.dtd" >
<Data>
<SubData>SomeSubData</SubData>
</Data>
SAMPLE DTD
<?xml version="1.0" encoding="us-ascii" ?>
<!ELEMENT Data ( SubData )* >
<!ATTLIST Data list ( list ) "list" >
<!ELEMENT SubData ( #PCDATA )>
<!ATTLIST SubData Type ( string ) "string" >
-- System Information:
Debian Release: 4.0
APT prefers oldstable
APT policy: (900, 'oldstable'), (4, 'stable'), (3, 'testing'), (2, 'unstable')
Architecture: i386 (i686)
Shell: /bin/sh linked to /bin/bash
Kernel: Linux 2.6.26-686-smp
Locale: LANG=en_US, LC_CTYPE=en_US (charmap=ISO-8859-1)
Versions of packages libxml-xerces-perl depends on:
ii libc6 2.3.6.ds1-13etch9+b1 GNU C Library: Shared libraries
ii libgcc1 1:4.1.1-21 GCC support library
ii libxerces27 2.7.0-3 validating XML parser library for
ii perl 5.8.8-7etch6 Larry Wall's Practical Extraction
ii perl-base [perlapi- 5.8.8-7etch6 The Pathologically Eclectic Rubbis
libxml-xerces-perl recommends no packages.
-- no debconf information
--
To UNSUBSCRIBE, email to [email protected]
with a subject of "unsubscribe". Trouble? Contact [email protected]