Compare commits

...

No commits in common. "c8s" and "c9s" have entirely different histories.
c8s ... c9s

5 changed files with 325 additions and 25 deletions

9
.gitignore vendored
View File

@ -49,3 +49,12 @@ XML-LibXML-1.70.tar.gz
/XML-LibXML-2.0130.tar.gz /XML-LibXML-2.0130.tar.gz
/XML-LibXML-2.0131.tar.gz /XML-LibXML-2.0131.tar.gz
/XML-LibXML-2.0132.tar.gz /XML-LibXML-2.0132.tar.gz
/XML-LibXML-2.0133.tar.gz
/XML-LibXML-2.0134.tar.gz
/XML-LibXML-2.0200.tar.gz
/XML-LibXML-2.0201.tar.gz
/XML-LibXML-2.0202.tar.gz
/XML-LibXML-2.0203.tar.gz
/XML-LibXML-2.0204.tar.gz
/XML-LibXML-2.0205.tar.gz
/XML-LibXML-2.0206.tar.gz

View File

@ -0,0 +1,180 @@
From 3d0adda7560137309be8b10c63ff41e41dfb1516 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Petr=20P=C3=ADsa=C5=99?= <ppisar@redhat.com>
Date: Tue, 28 Jan 2020 17:05:32 +0100
Subject: [PATCH] Parse an ampersand entity in SAX interface
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
After disabling parsing external entities in XML-LibXML-2.0202,
XML::LibXML::SAX interface stopped expanding &amp; and &#38; entities
in attribute values (often found in href XHTML attributes) and
returned "&#38;" instead. This was discovered by a RDF-Trine test
suite failure <https://github.com/kasei/perlrdf/issues/167>.
First, I suspected XML-LibXML
<https://rt.cpan.org/Ticket/Display.html?id=131498>, but it turned out
that the unexpanded entity comes from libxml2 C library itself. And
that it's not just an ommitted expansion, but that it's actually an
escape sequence for "&" characters. Other XML metacharacters (like
"<") are not affeced. Also text nodes are also not affected. My
finding was confirmed by an old libxml2 bug report
<https://bugzilla.gnome.org/show_bug.cgi?id=316487>.
This patch "fixes" this discepancy by replacing all "&#38;"
subtstrings with a literal "&" in SAX interface of start_element()
callbacks.
Signed-off-by: Petr Písař <ppisar@redhat.com>
---
MANIFEST | 1 +
perl-libxml-sax.c | 44 ++++++++++++++++++++++++++++++++++++++++++--
t/52_sax_intent.t | 40 ++++++++++++++++++++++++++++++++++++++++
3 files changed, 83 insertions(+), 2 deletions(-)
create mode 100755 t/52_sax_intent.t
diff --git a/MANIFEST b/MANIFEST
index 5248ea5..ccc3410 100644
--- a/MANIFEST
+++ b/MANIFEST
@@ -174,6 +174,7 @@ t/49callbacks_returning_undef.t
t/49global_extent.t
t/50devel.t
t/51_parse_html_string_rt87089.t
+t/52_sax_intent.t
t/60error_prev_chain.t
t/60struct_error.t
t/61error.t
diff --git a/perl-libxml-sax.c b/perl-libxml-sax.c
index b949d3c..232a879 100644
--- a/perl-libxml-sax.c
+++ b/perl-libxml-sax.c
@@ -20,6 +20,7 @@ extern "C" {
#include "ppport.h"
#include <stdlib.h>
+#include <string.h>
#include <libxml/xmlmemory.h>
#include <libxml/parser.h>
#include <libxml/parserInternals.h>
@@ -639,6 +640,34 @@ PmmGenNsName( const xmlChar * name, const xmlChar * nsURI )
return retval;
}
+/* If a value argument does not contain "&#38;", the value pointer is returned.
+ * Otherwise a new xmlChar * string is allocated, the value copied there and
+ * "&#38;" occurences replaced with "&". Then the caller must free it. */
+static
+xmlChar *
+_expandAmp( const xmlChar *value )
+{
+ xmlChar *expanded = NULL;
+ const xmlChar *entity;
+ int length;
+
+ if (value == NULL ||
+ (NULL == (entity = (const xmlChar *)strstr((const char *)value, "&#38;")))) {
+ return (xmlChar *)value;
+ }
+
+ do {
+ length = entity - value;
+ expanded = xmlStrncat(expanded, value, length);
+ expanded = xmlStrncat(expanded, (const xmlChar *)"&", 1);
+ value += length + 5; /* "&#38;" */
+ } while (NULL != (entity = (const xmlChar*)strstr((const char *)value, "&#38;")));
+
+ expanded = xmlStrcat(expanded, value);
+
+ return expanded;
+}
+
HV *
PmmGenAttributeHashSV( pTHX_ PmmSAXVectorPtr sax,
const xmlChar **attr, SV * handler )
@@ -653,8 +682,8 @@ PmmGenAttributeHashSV( pTHX_ PmmSAXVectorPtr sax,
const xmlChar * nsURI = NULL;
const xmlChar **ta = attr;
const xmlChar * name = NULL;
- const xmlChar * value = NULL;
+ xmlChar * value = NULL;
xmlChar * keyname = NULL;
xmlChar * localname = NULL;
xmlChar * prefix = NULL;
@@ -665,7 +694,13 @@ PmmGenAttributeHashSV( pTHX_ PmmSAXVectorPtr sax,
while ( *ta != NULL ) {
atV = newHV();
name = *ta; ta++;
- value = *ta; ta++;
+ /* XXX: libxml2 SAX2 interface does not expand &#38;
+ * entity in the attribute values
+ * <https://bugzilla.gnome.org/show_bug.cgi?id=316487>
+ * resulting in stray "&#38;" sequences after disabling
+ * external entity expansion
+ * <https://rt.cpan.org/Ticket/Display.html?id=131498>. */
+ value = _expandAmp(*ta);
if ( name != NULL && XML_STR_NOT_EMPTY( name ) ) {
localname = xmlSplitQName(NULL, name, &prefix);
@@ -754,6 +789,11 @@ PmmGenAttributeHashSV( pTHX_ PmmSAXVectorPtr sax,
prefix = NULL;
}
+
+ if (value != *ta) {
+ xmlFree(value);
+ }
+ ta++;
}
}
diff --git a/t/52_sax_intent.t b/t/52_sax_intent.t
new file mode 100755
index 0000000..a45b4d1
--- /dev/null
+++ b/t/52_sax_intent.t
@@ -0,0 +1,40 @@
+use strict;
+use warnings;
+use Test::More;
+
+my %tests = (
+ # attribte name raw attrib. value expected parsed value
+ predefined => ['&quot;', '"'], # alawys worked
+ numeric => ['&#65;', 'A'], # always worked
+ numericampersand => ['&#38;', '&'], # a regression
+ ampA => ['&#38;A', '&A'], # a corner case
+ Aamp => ['A&#38;', 'A&'], # a corner case
+ AampBampC => ['A&#38;B&#38;C', 'A&B&C'], # a corner case
+);
+plan tests => scalar (keys %tests);
+
+my $input = '<?xml version="1.0"?><root';
+for my $test (sort keys %tests) {
+ $input .= sprintf(" %s='%s'", $test, $tests{$test}->[0]);
+}
+$input .= '/>';
+
+diag("Parsing $input");
+use XML::LibXML::SAX;
+
+XML::LibXML::SAX->new(Handler => 'Handler')->parse_string($input);
+
+
+package Handler;
+sub start_element {
+ my ($self, $node) = @_;
+ for my $attribute (sort keys %{$node->{Attributes}}) {
+ my $name = $node->{Attributes}->{$attribute}->{Name};
+ Test::More::is(
+ $node->{Attributes}->{$attribute}->{Value},
+ $tests{$name}->[1],
+ sprintf("%s='%s' attribute", $name, $tests{$name}->[0])
+ );
+ }
+}
+
--
2.21.1

View File

@ -0,0 +1,48 @@
diff -up XML-LibXML-2.0206/Makefile.PL.orig XML-LibXML-2.0206/Makefile.PL
--- XML-LibXML-2.0206/Makefile.PL.orig 2020-09-15 10:00:42.000000000 +0200
+++ XML-LibXML-2.0206/Makefile.PL 2020-11-30 15:54:20.965335954 +0100
@@ -17,15 +17,31 @@ use warnings;
require 5.008001;
-use Alien::Base::Wrapper qw( Alien::Libxml2 );
use ExtUtils::MakeMaker;
use Config;
my $SKIP_SAX_INSTALL = $ENV{SKIP_SAX_INSTALL};
+my $libs = '';
+my $inc = '';
+if (`xml2-config --modules 2>/dev/null`) {
+ $libs = `xml2-config --libs 2>/dev/null`;
+ $inc = `xml2-config --cflags 2>/dev/null`;
+}
+elsif (`pkg-config --modversion libcrypto 2>/dev/null`) {
+ $libs = `pkg-config --libs libxml-2.0 2>/dev/null`;
+ $inc = `pkg-config --cflags libxml-2.0 2>/dev/null`;
+}
+
+$libs =~ s/[\r\n]+/ /g;
+$inc =~ s/[\r\n]+/ /g;
+
+die "Could not determine location of libxml2 libs."
+ unless $libs =~ /^-/;
+die "Could not determine location of libxml2 headers."
+ unless $inc =~ /^-/;
+
my %ConfigReqs = (
- "Alien::Libxml2" => '0.14',
- "Alien::Base::Wrapper" => 0,
"Config" => 0,
"ExtUtils::MakeMaker" => 0,
);
@@ -71,7 +87,8 @@ my %prereqs = (
my %xsbuild = (
DEFINE => '-DHAVE_UTF8',
OBJECT => '$(O_FILES)',
- Alien::Base::Wrapper->mm_args,
+ LIBS => $libs,
+ INC => $inc,
);
my %WriteMakefileArgs = (

View File

@ -7,34 +7,31 @@ Name: perl-XML-LibXML
# https://bugzilla.redhat.com/show_bug.cgi?id=469480 # https://bugzilla.redhat.com/show_bug.cgi?id=469480
# it might not be needed anymore # it might not be needed anymore
# this module is maintained, the other is not # this module is maintained, the other is not
Version: 2.0132 Version: 2.0206
Release: 2%{?dist} Release: 5%{?dist}
Epoch: 1 Epoch: 1
Summary: Perl interface to the libxml2 library Summary: Perl interface to the libxml2 library
Group: Development/Libraries
License: (GPL+ or Artistic) and MIT License: (GPL+ or Artistic) and MIT
URL: http://search.cpan.org/dist/XML-LibXML/ URL: https://metacpan.org/release/XML-LibXML
Source0: http://search.cpan.org/CPAN/authors/id/S/SH/SHLOMIF/XML-LibXML-%{version}.tar.gz Source0: https://cpan.metacpan.org/authors/id/S/SH/SHLOMIF/XML-LibXML-%{version}.tar.gz
# Fix parsing ampersand entities in SAX interface, CPAN RT#131498,
# posted to the upstream.
Patch0: XML-LibXML-2.0202-Parse-an-ampersand-entity-in-SAX-interface.patch
# To reduce dependencies replace Alien::Libxml2 with pkg-config
Patch1: XML-LibXML-2.0206-Use-pkgconfig-instead-of-Alien-Libxml2.patch
BuildRequires: coreutils BuildRequires: coreutils
BuildRequires: findutils BuildRequires: findutils
BuildRequires: glibc-common BuildRequires: glibc-common
BuildRequires: gcc BuildRequires: gcc
BuildRequires: libxml2-devel BuildRequires: libxml2-devel
BuildRequires: make BuildRequires: make
BuildRequires: perl-interpreter
BuildRequires: perl-devel BuildRequires: perl-devel
BuildRequires: perl-generators BuildRequires: perl-generators
BuildRequires: perl(Config) BuildRequires: perl-interpreter
BuildRequires: perl(Cwd) BuildRequires: perl(ExtUtils::MakeMaker) >= 6.76
BuildRequires: perl(Devel::CheckLib)
BuildRequires: perl(ExtUtils::MakeMaker)
BuildRequires: perl(File::Spec)
BuildRequires: perl(lib)
BuildRequires: perl(strict) BuildRequires: perl(strict)
BuildRequires: perl(Symbol)
BuildRequires: perl(vars)
BuildRequires: perl(warnings) BuildRequires: perl(warnings)
BuildRequires: sed BuildRequires: pkgconfig(libxml-2.0)
# Run-time # Run-time
BuildRequires: perl(base) BuildRequires: perl(base)
BuildRequires: perl(Carp) BuildRequires: perl(Carp)
@ -49,12 +46,15 @@ BuildRequires: perl(overload)
BuildRequires: perl(parent) BuildRequires: perl(parent)
BuildRequires: perl(Scalar::Util) BuildRequires: perl(Scalar::Util)
BuildRequires: perl(Tie::Hash) BuildRequires: perl(Tie::Hash)
BuildRequires: perl(vars)
BuildRequires: perl(XML::NamespaceSupport) BuildRequires: perl(XML::NamespaceSupport)
BuildRequires: perl(XML::SAX::Base) BuildRequires: perl(XML::SAX::Base)
BuildRequires: perl(XML::SAX::DocumentLocator) BuildRequires: perl(XML::SAX::DocumentLocator)
BuildRequires: perl(XML::SAX::Exception) BuildRequires: perl(XML::SAX::Exception)
# Tests # Tests
BuildRequires: perl(Errno) BuildRequires: perl(Errno)
BuildRequires: perl(File::Spec)
BuildRequires: perl(lib)
BuildRequires: perl(locale) BuildRequires: perl(locale)
BuildRequires: perl(POSIX) BuildRequires: perl(POSIX)
BuildRequires: perl(Test::More) BuildRequires: perl(Test::More)
@ -73,7 +73,7 @@ BuildRequires: perl(URI::file)
BuildRequires: perl(utf8) BuildRequires: perl(utf8)
# Author test - Test::CPAN::Changes # Author test - Test::CPAN::Changes
# Author test - Test::Pod # Author test - Test::Pod
# Author test - Test::Kwalitee::Extra # Author test - Test::Kwalitee
# Author test - Test::TrailingSpace # Author test - Test::TrailingSpace
Requires: perl(:MODULE_COMPAT_%(eval "`perl -V:version`"; echo $version)) Requires: perl(:MODULE_COMPAT_%(eval "`perl -V:version`"; echo $version))
# Run-require "perl-interpreter" because a triggerin script needs it. # Run-require "perl-interpreter" because a triggerin script needs it.
@ -93,23 +93,22 @@ validating XML parser and the high performance DOM implementation.
%prep %prep
%setup -q -n XML-LibXML-%{version} %setup -q -n XML-LibXML-%{version}
%patch0 -p1
%patch1 -p1
chmod -x *.c chmod -x *.c
for i in Changes; do for i in Changes; do
/usr/bin/iconv -f iso8859-1 -t utf-8 $i > $i.conv && /bin/mv -f $i.conv $i /usr/bin/iconv -f iso8859-1 -t utf-8 $i > $i.conv && /bin/mv -f $i.conv $i
done done
# Remove bundled modules
rm -r inc/*
sed -i -e '/^inc\// d' MANIFEST
%build %build
perl Makefile.PL SKIP_SAX_INSTALL=1 INSTALLDIRS=vendor OPTIMIZE="%{optflags}" perl Makefile.PL SKIP_SAX_INSTALL=1 INSTALLDIRS=vendor \
make %{?_smp_mflags} OPTIMIZE="%{optflags}" NO_PACKLIST=1 NO_PERLLOCAL=1
%{make_build}
%install %install
make pure_install DESTDIR=%{buildroot} %{make_install}
find %{buildroot} -type f -name .packlist -delete
find %{buildroot} -type f -name '*.bs' -empty -delete find %{buildroot} -type f -name '*.bs' -empty -delete
chmod -R u+w %{buildroot}/* %{_fixperms} %{buildroot}/*
%check %check
THREAD_TEST=0%{?with_thread_test:1} make test THREAD_TEST=0%{?with_thread_test:1} make test
@ -136,6 +135,70 @@ fi
%{_mandir}/man3/*.3* %{_mandir}/man3/*.3*
%changelog %changelog
* Mon Aug 09 2021 Mohan Boddu <mboddu@redhat.com> - 1:2.0206-5
- Rebuilt for IMA sigs, glibc 2.34, aarch64 flags
Related: rhbz#1991688
* Fri Apr 16 2021 Mohan Boddu <mboddu@redhat.com> - 1:2.0206-4
- Rebuilt for RHEL 9 BETA on Apr 15th 2021. Related: rhbz#1947937
* Wed Jan 27 2021 Fedora Release Engineering <releng@fedoraproject.org> - 1:2.0206-3
- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild
* Mon Nov 30 2020 Jitka Plesnikova <jplesnik@redhat.com> - 1:2.0206-2
- Replace using of Alien::Libxml2 with pkg-config
* Tue Sep 15 2020 Jitka Plesnikova <jplesnik@redhat.com> - 1:2.0206-1
- 2.0206 bump
* Tue Jul 28 2020 Fedora Release Engineering <releng@fedoraproject.org> - 1:2.0205-3
- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild
* Tue Jun 23 2020 Jitka Plesnikova <jplesnik@redhat.com> - 1:2.0205-2
- Perl 5.32 rebuild
* Mon May 11 2020 Jitka Plesnikova <jplesnik@redhat.com> - 1:2.0205-1
- 2.0205 bump
* Wed Mar 18 2020 Jitka Plesnikova <jplesnik@redhat.com> - 1:2.0204-1
- 2.0204 bump
* Wed Mar 11 2020 Jitka Plesnikova <jplesnik@redhat.com> - 1:2.0203-1
- 2.0203 bump
* Tue Jan 28 2020 Petr Pisar <ppisar@redhat.com> - 1:2.0202-2
- Fix parsing ampersand entities in SAX interface (CPAN RT#131498)
* Mon Jan 13 2020 Jitka Plesnikova <jplesnik@redhat.com> - 1:2.0202-1
- 2.0202 bump
* Fri Jul 26 2019 Fedora Release Engineering <releng@fedoraproject.org> - 1:2.0201-3
- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild
* Fri May 31 2019 Jitka Plesnikova <jplesnik@redhat.com> - 1:2.0201-2
- Perl 5.30 rebuild
* Mon May 27 2019 Jitka Plesnikova <jplesnik@redhat.com> - 1:2.0201-1
- 2.0201 bump
* Mon Mar 25 2019 Jitka Plesnikova <jplesnik@redhat.com> - 1:2.0200-1
- 2.0200 bump
* Mon Feb 11 2019 Jitka Plesnikova <jplesnik@redhat.com> - 1:2.0134-1
- 2.0134 bump
* Wed Feb 06 2019 Jitka Plesnikova <jplesnik@redhat.com> - 1:2.0133-1
- 2.0133 bump
* Sat Feb 02 2019 Fedora Release Engineering <releng@fedoraproject.org> - 1:2.0132-5
- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild
* Fri Jul 13 2018 Fedora Release Engineering <releng@fedoraproject.org> - 1:2.0132-4
- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild
* Fri Jun 29 2018 Jitka Plesnikova <jplesnik@redhat.com> - 1:2.0132-3
- Perl 5.28 rebuild
* Fri Feb 09 2018 Fedora Release Engineering <releng@fedoraproject.org> - 1:2.0132-2 * Fri Feb 09 2018 Fedora Release Engineering <releng@fedoraproject.org> - 1:2.0132-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild - Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild

View File

@ -1 +1 @@
SHA512 (XML-LibXML-2.0132.tar.gz) = 3df1cb67ea955133492f2b6f8def2b28079c59e99170a31820aca69ea81686c4b67171509f1b311faab9389d200c4a24942b3950d7c0730ff1233a009b398fce SHA512 (XML-LibXML-2.0206.tar.gz) = 113a2e21ced86fdb0bb01f3fa958b110539a3a5f2cf82b2ed18e7d5a3ad437a051353103f42f324a2e148996c9a0abc7fff193b67552491a7212b69a7ba4d952