mirror of
https://github.com/freebsd/freebsd-src.git
synced 2026-10-28 11:25:21 +01:00
Compare commits
97
Commits
stable/13
...
releng/13.3
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
72aa3d55e9 | ||
|
|
9f1314a30b | ||
|
|
9867aebc1d | ||
|
|
adb7b541ae | ||
|
|
7d1d641efe | ||
|
|
127f37c9b3 | ||
|
|
296083d6bd | ||
|
|
50ca525bfe | ||
|
|
c31be7380a | ||
|
|
417e81a400 | ||
|
|
e7a790dc3f | ||
|
|
ea9257bcd0 | ||
|
|
aca9955aec | ||
|
|
fceeab39e9 | ||
|
|
7dabb89209 | ||
|
|
36265a707d | ||
|
|
a16cd5ff50 | ||
|
|
49c896761e | ||
|
|
f51f7cb899 | ||
|
|
811a30c55a | ||
|
|
8fd0fa88b5 | ||
|
|
aba74e58f7 | ||
|
|
01a7233a39 | ||
|
|
4c07dbe5b0 | ||
|
|
5d6576f4f0 | ||
|
|
639494a3c1 | ||
|
|
f368a02e10 | ||
|
|
4752a984dc | ||
|
|
352775ac8b | ||
|
|
33b4e2361c | ||
|
|
fd4ee5b9ea | ||
|
|
eab94c0fbb | ||
|
|
f5a50714b4 | ||
|
|
769536bcb5 | ||
|
|
f41c11d7f2 | ||
|
|
5eb30c313c | ||
|
|
dcc05aee14 | ||
|
|
b778bbead3 | ||
|
|
e576536cba | ||
|
|
3d5cb2b9a9 | ||
|
|
deb948cd8d | ||
|
|
e3e0912f29 | ||
|
|
2dc3f3a5e2 | ||
|
|
eb410545d0 | ||
|
|
d45cf1d2f1 | ||
|
|
be4f1894ef | ||
|
|
266b3bd3f2 | ||
|
|
7a0d63c909 | ||
|
|
26059a4f2c | ||
|
|
f07351f90a | ||
|
|
80d2b634dd | ||
|
|
814761540e | ||
|
|
784695750e | ||
|
|
8997b0270d | ||
|
|
b33556f035 | ||
|
|
6831288c8c | ||
|
|
e99479f817 | ||
|
|
f15ff67ef9 | ||
|
|
88bdc4bb60 | ||
|
|
9f2e70a87d | ||
|
|
776fe3ce57 | ||
|
|
aac9dda7f8 | ||
|
|
00c958f12c | ||
|
|
f2de7ba78a | ||
|
|
07ece5936a | ||
|
|
401dbf9cfc | ||
|
|
9b2da4bc5a | ||
|
|
d4b4efc6db | ||
|
|
a75a3d7afc | ||
|
|
9b998db87c | ||
|
|
eecf453c0e | ||
|
|
f7c8d54484 | ||
|
|
5463d4cd99 | ||
|
|
f93d06ac87 | ||
|
|
804a4c1c7b | ||
|
|
4a646242c3 | ||
|
|
7d781b891e | ||
|
|
dc50f981e1 | ||
|
|
75316a59b3 | ||
|
|
7c51748a44 | ||
|
|
67aff34d9a | ||
|
|
fbbfcab6b8 | ||
|
|
da2e35b0ec | ||
|
|
c6edb21e37 | ||
|
|
394ceefc2f | ||
|
|
a233f7fadf | ||
|
|
313b30b6ab | ||
|
|
d19b59cfe5 | ||
|
|
1ee910875c | ||
|
|
b36ddb27b3 | ||
|
|
16eebc4e19 | ||
|
|
f2c72486da | ||
|
|
3e6382c1ed | ||
|
|
dbc87c1ebd | ||
|
|
ba90708fb1 | ||
|
|
24eb518714 | ||
|
|
6c21375939 |
No files matched your search
@@ -51,6 +51,9 @@
|
||||
# xargs -n1 | sort | uniq -d;
|
||||
# done
|
||||
|
||||
# 20240213: caroot bundle updated
|
||||
OLD_FILES+=usr/share/certs/trusted/Security_Communication_Root_CA.pem
|
||||
|
||||
# 20240112: replaced NetBSD tests for uniq with our own
|
||||
OLD_FILES+=usr/tests/usr.bin/uniq/d_basic.in
|
||||
OLD_FILES+=usr/tests/usr.bin/uniq/d_basic.out
|
||||
|
||||
@@ -12,6 +12,101 @@ Items affecting the ports and packages system can be found in
|
||||
/usr/ports/UPDATING. Please read that file before updating system packages
|
||||
and/or ports.
|
||||
|
||||
20241029:
|
||||
13.3-RELEASE-p8 SA-24:17.bhyve
|
||||
SA-24:18.ctl
|
||||
SA-24.19.fetch
|
||||
|
||||
Multiple issues in the bhyve hypervisor [SA-24:17.bhyve]
|
||||
|
||||
Unbounded allocation in ctl(4) CAM Target Layer [SA-24:18.ctl]
|
||||
|
||||
Certificate revocation list fetch(1) option fails [SA-24:19.fetch]
|
||||
|
||||
20240919:
|
||||
13.3-RELEASE-p7 EN-24:16.pf
|
||||
SA-24:15.bhyve
|
||||
SA-24:16.libnv
|
||||
|
||||
Fix incorrect ICMPv6 state handling in pf [EN-24:16.pf]
|
||||
|
||||
Fix bhyve(8) out-of-bounds read access via XHCI emulation [SA-24:15.bhyve]
|
||||
|
||||
Fix integer overflow in libnv [SA-24:16.libnv]
|
||||
|
||||
20240904:
|
||||
13.3-RELEASE-p6 EN-24:15.calendar
|
||||
SA-24:09.libnv
|
||||
SA-24:11.ctl
|
||||
SA-24:12.bhyve
|
||||
SA-24:14.umtx
|
||||
|
||||
cron(8) / periodic(8) session login [EN-24:15.calendar]
|
||||
|
||||
Multiple vulnerabilities in libnv [SA-24:09.libnv]
|
||||
|
||||
Multiple issues in ctl(4) CAM Target Layer [SA-24:11.ctl]
|
||||
|
||||
bhyve(8) privileged guest escape via USB controller [SA-24:12.bhyve]
|
||||
|
||||
umtx Kernel panic or Use-After-Free [SA-24:14.umtx]
|
||||
|
||||
20240806:
|
||||
13.3-RELEASE-p5 SA-24:05.pf
|
||||
SA-24:06.ktrace
|
||||
SA-24:07.nfsclient
|
||||
SA-24:08.openssh
|
||||
|
||||
pf incorrectly matches different ICMPv6 states in the state table [SA-24:05.pf]
|
||||
|
||||
ktrace(2) fails to detach when executing a setuid binary [SA-24:06.ktrace]
|
||||
|
||||
NFS client accepts file names containing path separators [SA-24:07.nfsclient]
|
||||
|
||||
OpenSSH pre-authentication async signal safety issue [SA-24:08.openssh]
|
||||
|
||||
20240701:
|
||||
13.3-RELEASE-p4 SA-24:04.openssh
|
||||
|
||||
Fix pre-authentication remote code execution in sshd [SA-24:04.openssh]
|
||||
|
||||
20240619:
|
||||
13.3-RELEASE-p3 EN-24:11.ldns
|
||||
EN-24:12.killpg
|
||||
|
||||
Fix LDNS uses nameserver commented out in resolv.conf [EN-24:11.ldns]
|
||||
|
||||
Fix lock order reversal in killpg causing livelock [EN-24:12.killpg]
|
||||
|
||||
20240424:
|
||||
13.3-RELEASE-p2 EN-24:09.zfs
|
||||
|
||||
Fix high CPU usage by kernel threads related to ZFS [EN-24:09.zfs]
|
||||
|
||||
20240327:
|
||||
13.3-RELEASE-p1 EN-24:06.wireguard
|
||||
EN-24:07.clang
|
||||
|
||||
Fix insufficient barriers in WireGuard if_wg(4) [EN-24:06.wireguard]
|
||||
|
||||
Fix clang crash when certain optimization is enabled [EN-24:07.clang]
|
||||
|
||||
20240305:
|
||||
13.3-RELEASE.
|
||||
|
||||
20240218:
|
||||
Change 9b998db87c28 changed 'struct ieee80211vap' internals in net80211.
|
||||
Given we do not have enough spares and the struct is allocated by
|
||||
drivers, all wireless drivers have to be recompiled.
|
||||
__FreeBSD_version is updated to 1303001 to track this change.
|
||||
|
||||
20240207:
|
||||
sendmail 8.18.1 has been imported and merged. This version enforces
|
||||
stricter RFC compliance by default, especially with respect to line
|
||||
endings. This may cause issues with receiving messages from
|
||||
non-compliant MTAs; please see the first 8.18.1 release note in
|
||||
contrib/sendmail/RELEASE_NOTES for mitigations.
|
||||
|
||||
20230913:
|
||||
Improvements to libtacplus(8) mean that tacplus.conf(5) now
|
||||
follows POSIX shell syntax rules. This may cause TACACS+
|
||||
|
||||
+116
-2
@@ -2,6 +2,120 @@ NOTE: We are looking for help with a few things:
|
||||
https://github.com/libexpat/libexpat/labels/help%20wanted
|
||||
If you can help, please get in touch. Thanks!
|
||||
|
||||
Release 2.6.0 Tue February 6 2024
|
||||
Security fixes:
|
||||
#789 #814 CVE-2023-52425 -- Fix quadratic runtime issues with big tokens
|
||||
that can cause denial of service, in partial where
|
||||
dealing with compressed XML input. Applications
|
||||
that parsed a document in one go -- a single call to
|
||||
functions XML_Parse or XML_ParseBuffer -- were not affected.
|
||||
The smaller the chunks/buffers you use for parsing
|
||||
previously, the bigger the problem prior to the fix.
|
||||
Backporters should be careful to no omit parts of
|
||||
pull request #789 and to include earlier pull request #771,
|
||||
in order to not break the fix.
|
||||
#777 CVE-2023-52426 -- Fix billion laughs attacks for users
|
||||
compiling *without* XML_DTD defined (which is not common).
|
||||
Users with XML_DTD defined have been protected since
|
||||
Expat >=2.4.0 (and that was CVE-2013-0340 back then).
|
||||
|
||||
Bug fixes:
|
||||
#753 Fix parse-size-dependent "invalid token" error for
|
||||
external entities that start with a byte order mark
|
||||
#780 Fix NULL pointer dereference in setContext via
|
||||
XML_ExternalEntityParserCreate for compilation with
|
||||
XML_DTD undefined
|
||||
#812 #813 Protect against closing entities out of order
|
||||
|
||||
Other changes:
|
||||
#723 Improve support for arc4random/arc4random_buf
|
||||
#771 #788 Improve buffer growth in XML_GetBuffer and XML_Parse
|
||||
#761 #770 xmlwf: Support --help and --version
|
||||
#759 #770 xmlwf: Support custom buffer size for XML_GetBuffer and read
|
||||
#744 xmlwf: Improve language and URL clickability in help output
|
||||
#673 examples: Add new example "element_declarations.c"
|
||||
#764 Be stricter about macro XML_CONTEXT_BYTES at build time
|
||||
#765 Make inclusion to expat_config.h consistent
|
||||
#726 #727 Autotools: configure.ac: Support --disable-maintainer-mode
|
||||
#678 #705 ..
|
||||
#706 #733 #792 Autotools: Sync CMake templates with CMake 3.26
|
||||
#795 Autotools: Make installation of shipped man page doc/xmlwf.1
|
||||
independent of docbook2man availability
|
||||
#815 Autotools|CMake: Add missing -DXML_STATIC to pkg-config file
|
||||
section "Cflags.private" in order to fix compilation
|
||||
against static libexpat using pkg-config on Windows
|
||||
#724 #751 Autotools|CMake: Require a C99 compiler
|
||||
(a de-facto requirement already since Expat 2.2.2 of 2017)
|
||||
#793 Autotools|CMake: Fix PACKAGE_BUGREPORT variable
|
||||
#750 #786 Autotools|CMake: Make test suite require a C++11 compiler
|
||||
#749 CMake: Require CMake >=3.5.0
|
||||
#672 CMake: Lowercase off_t and size_t to help a bug in Meson
|
||||
#746 CMake: Sort xmlwf sources alphabetically
|
||||
#785 CMake|Windows: Fix generation of DLL file version info
|
||||
#790 CMake: Build tests/benchmark/benchmark.c as well for
|
||||
a build with -DEXPAT_BUILD_TESTS=ON
|
||||
#745 #757 docs: Document the importance of isFinal + adjust tests
|
||||
accordingly
|
||||
#736 docs: Improve use of "NULL" and "null"
|
||||
#713 docs: Be specific about version of XML (XML 1.0r4)
|
||||
and version of C (C99); (XML 1.0r5 will need a sponsor.)
|
||||
#762 docs: reference.html: Promote function XML_ParseBuffer more
|
||||
#779 docs: reference.html: Add HTML anchors to XML_* macros
|
||||
#760 docs: reference.html: Upgrade to OK.css 1.2.0
|
||||
#763 #739 docs: Fix typos
|
||||
#696 docs|CI: Use HTTPS URLs instead of HTTP at various places
|
||||
#669 #670 ..
|
||||
#692 #703 ..
|
||||
#733 #772 Address compiler warnings
|
||||
#798 #800 Address clang-tidy warnings
|
||||
#775 #776 Version info bumped from 9:10:8 (libexpat*.so.1.8.10)
|
||||
to 10:0:9 (libexpat*.so.1.9.0); see https://verbump.de/
|
||||
for what these numbers do
|
||||
|
||||
Infrastructure:
|
||||
#700 #701 docs: Document security policy in file SECURITY.md
|
||||
#766 docs: Improve parse buffer variables in-code documentation
|
||||
#674 #738 ..
|
||||
#740 #747 ..
|
||||
#748 #781 #782 Refactor coverage and conformance tests
|
||||
#714 #716 Refactor debug level variables to unsigned long
|
||||
#671 Improve handling of empty environment variable value
|
||||
in function getDebugLevel (without visible user effect)
|
||||
#755 #774 ..
|
||||
#758 #783 ..
|
||||
#784 #787 tests: Improve test coverage with regard to parse chunk size
|
||||
#660 #797 #801 Fuzzing: Improve fuzzing coverage
|
||||
#367 #799 Fuzzing|CI: Start running OSS-Fuzz fuzzing regression tests
|
||||
#698 #721 CI: Resolve some Travis CI leftovers
|
||||
#669 CI: Be robust towards absence of Git tags
|
||||
#693 #694 CI: Set permissions to "contents: read" for security
|
||||
#709 CI: Pin all GitHub Actions to specific commits for security
|
||||
#739 CI: Reject spelling errors using codespell
|
||||
#798 CI: Enforce clang-tidy clean code
|
||||
#773 #808 ..
|
||||
#809 #810 CI: Upgrade Clang from 15 to 18
|
||||
#796 CI: Start using Clang's Control Flow Integrity sanitizer
|
||||
#675 #720 #722 CI: Adapt to breaking changes in GitHub Actions Ubuntu images
|
||||
#689 CI: Adapt to breaking changes in Clang/LLVM Debian packaging
|
||||
#763 CI: Adapt to breaking changes in codespell
|
||||
#803 CI: Adapt to breaking changes in Cppcheck
|
||||
|
||||
Special thanks to:
|
||||
Ivan Galkin
|
||||
Joyce Brum
|
||||
Philippe Antoine
|
||||
Rhodri James
|
||||
Snild Dolkow
|
||||
spookyahell
|
||||
Steven Garske
|
||||
and
|
||||
Clang AddressSanitizer
|
||||
Clang UndefinedBehaviorSanitizer
|
||||
codespell
|
||||
GCC Farm Project
|
||||
OSS-Fuzz
|
||||
Sony Mobile
|
||||
|
||||
Release 2.5.0 Tue October 25 2022
|
||||
Security fixes:
|
||||
#616 #649 #650 CVE-2022-43680 -- Fix heap use-after-free after overeager
|
||||
@@ -11,7 +125,7 @@ Release 2.5.0 Tue October 25 2022
|
||||
arbitrary code execution.
|
||||
|
||||
Bug fixes:
|
||||
#612 #645 Fix curruption from undefined entities
|
||||
#612 #645 Fix corruption from undefined entities
|
||||
#613 #654 Fix case when parsing was suspended while processing nested
|
||||
entities
|
||||
#616 #652 #653 Stop leaking opening tag bindings after a closing tag
|
||||
@@ -318,7 +432,7 @@ Release 2.4.2 Sun December 19 2021
|
||||
see https://verbump.de/ for what these numbers do
|
||||
|
||||
Special thanks to:
|
||||
Dong-hee Na
|
||||
Donghee Na
|
||||
Joergen Ibsen
|
||||
Kai Pastor
|
||||
|
||||
|
||||
@@ -6,9 +6,10 @@
|
||||
# \___/_/\_\ .__/ \__,_|\__|
|
||||
# |_| XML parser
|
||||
#
|
||||
# Copyright (c) 2017-2021 Sebastian Pipping <[email protected]>
|
||||
# Copyright (c) 2017-2023 Sebastian Pipping <[email protected]>
|
||||
# Copyright (c) 2018 KangLin <[email protected]>
|
||||
# Copyright (c) 2022 Johnny Jazeix <[email protected]>
|
||||
# Copyright (c) 2023 Sony Corporation / Snild Dolkow <[email protected]>
|
||||
# Licensed under the MIT license:
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
@@ -84,7 +85,7 @@ _EXTRA_DIST_WINDOWS = \
|
||||
win32/expat.iss \
|
||||
win32/MANIFEST.txt \
|
||||
win32/README.txt \
|
||||
win32/version.rc
|
||||
win32/version.rc.cmake
|
||||
|
||||
EXTRA_DIST = \
|
||||
$(_EXTRA_DIST_CMAKE) \
|
||||
@@ -131,6 +132,11 @@ buildlib:
|
||||
run-benchmark:
|
||||
$(MAKE) -C tests/benchmark
|
||||
./run.sh tests/benchmark/benchmark@EXEEXT@ -n $(top_srcdir)/../testdata/largefiles/recset.xml 65535 3
|
||||
./run.sh tests/benchmark/benchmark@EXEEXT@ -n $(top_srcdir)/../testdata/largefiles/aaaaaa_attr.xml 4096 3
|
||||
./run.sh tests/benchmark/benchmark@EXEEXT@ -n $(top_srcdir)/../testdata/largefiles/aaaaaa_cdata.xml 4096 3
|
||||
./run.sh tests/benchmark/benchmark@EXEEXT@ -n $(top_srcdir)/../testdata/largefiles/aaaaaa_comment.xml 4096 3
|
||||
./run.sh tests/benchmark/benchmark@EXEEXT@ -n $(top_srcdir)/../testdata/largefiles/aaaaaa_tag.xml 4096 3
|
||||
./run.sh tests/benchmark/benchmark@EXEEXT@ -n $(top_srcdir)/../testdata/largefiles/aaaaaa_text.xml 4096 3
|
||||
|
||||
.PHONY: download-xmlts-zip
|
||||
download-xmlts-zip:
|
||||
|
||||
@@ -22,9 +22,10 @@
|
||||
# \___/_/\_\ .__/ \__,_|\__|
|
||||
# |_| XML parser
|
||||
#
|
||||
# Copyright (c) 2017-2021 Sebastian Pipping <[email protected]>
|
||||
# Copyright (c) 2017-2023 Sebastian Pipping <[email protected]>
|
||||
# Copyright (c) 2018 KangLin <[email protected]>
|
||||
# Copyright (c) 2022 Johnny Jazeix <[email protected]>
|
||||
# Copyright (c) 2023 Sony Corporation / Snild Dolkow <[email protected]>
|
||||
# Licensed under the MIT license:
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
@@ -136,6 +137,8 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
|
||||
$(top_srcdir)/conftools/ax-append-compile-flags.m4 \
|
||||
$(top_srcdir)/conftools/ax-append-link-flags.m4 \
|
||||
$(top_srcdir)/conftools/expatcfg-compiler-supports-visibility.m4 \
|
||||
$(top_srcdir)/conftools/ax-cxx-compile-stdcxx.m4 \
|
||||
$(top_srcdir)/conftools/ax-cxx-compile-stdcxx-11.m4 \
|
||||
$(top_srcdir)/configure.ac
|
||||
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
||||
$(ACLOCAL_M4)
|
||||
@@ -339,6 +342,7 @@ FGREP = @FGREP@
|
||||
FILECMD = @FILECMD@
|
||||
FILEMAP = @FILEMAP@
|
||||
GREP = @GREP@
|
||||
HAVE_CXX11 = @HAVE_CXX11@
|
||||
INSTALL = @INSTALL@
|
||||
INSTALL_DATA = @INSTALL_DATA@
|
||||
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
||||
@@ -358,6 +362,7 @@ LIPO = @LIPO@
|
||||
LN_S = @LN_S@
|
||||
LTLIBOBJS = @LTLIBOBJS@
|
||||
LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
|
||||
MAINT = @MAINT@
|
||||
MAKEINFO = @MAKEINFO@
|
||||
MANIFEST_TOOL = @MANIFEST_TOOL@
|
||||
MKDIR_P = @MKDIR_P@
|
||||
@@ -478,7 +483,7 @@ _EXTRA_DIST_WINDOWS = \
|
||||
win32/expat.iss \
|
||||
win32/MANIFEST.txt \
|
||||
win32/README.txt \
|
||||
win32/version.rc
|
||||
win32/version.rc.cmake
|
||||
|
||||
EXTRA_DIST = \
|
||||
$(_EXTRA_DIST_CMAKE) \
|
||||
@@ -506,7 +511,7 @@ all: expat_config.h
|
||||
.SUFFIXES:
|
||||
am--refresh: Makefile
|
||||
@:
|
||||
$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
|
||||
$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
|
||||
@for dep in $?; do \
|
||||
case '$(am__configure_deps)' in \
|
||||
*$$dep*) \
|
||||
@@ -532,9 +537,9 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
||||
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
|
||||
$(SHELL) ./config.status --recheck
|
||||
|
||||
$(top_srcdir)/configure: $(am__configure_deps)
|
||||
$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
|
||||
$(am__cd) $(srcdir) && $(AUTOCONF)
|
||||
$(ACLOCAL_M4): $(am__aclocal_m4_deps)
|
||||
$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
|
||||
$(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
|
||||
$(am__aclocal_m4_deps):
|
||||
|
||||
@@ -545,7 +550,7 @@ expat_config.h: stamp-h1
|
||||
stamp-h1: $(srcdir)/expat_config.h.in $(top_builddir)/config.status
|
||||
@rm -f stamp-h1
|
||||
cd $(top_builddir) && $(SHELL) ./config.status expat_config.h
|
||||
$(srcdir)/expat_config.h.in: $(am__configure_deps)
|
||||
$(srcdir)/expat_config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
|
||||
($(am__cd) $(top_srcdir) && $(AUTOHEADER))
|
||||
rm -f stamp-h1
|
||||
touch $@
|
||||
@@ -1092,6 +1097,11 @@ buildlib:
|
||||
run-benchmark:
|
||||
$(MAKE) -C tests/benchmark
|
||||
./run.sh tests/benchmark/benchmark@EXEEXT@ -n $(top_srcdir)/../testdata/largefiles/recset.xml 65535 3
|
||||
./run.sh tests/benchmark/benchmark@EXEEXT@ -n $(top_srcdir)/../testdata/largefiles/aaaaaa_attr.xml 4096 3
|
||||
./run.sh tests/benchmark/benchmark@EXEEXT@ -n $(top_srcdir)/../testdata/largefiles/aaaaaa_cdata.xml 4096 3
|
||||
./run.sh tests/benchmark/benchmark@EXEEXT@ -n $(top_srcdir)/../testdata/largefiles/aaaaaa_comment.xml 4096 3
|
||||
./run.sh tests/benchmark/benchmark@EXEEXT@ -n $(top_srcdir)/../testdata/largefiles/aaaaaa_tag.xml 4096 3
|
||||
./run.sh tests/benchmark/benchmark@EXEEXT@ -n $(top_srcdir)/../testdata/largefiles/aaaaaa_text.xml 4096 3
|
||||
|
||||
.PHONY: download-xmlts-zip
|
||||
download-xmlts-zip:
|
||||
|
||||
@@ -1,13 +1,14 @@
|
||||
[](https://github.com/libexpat/libexpat/actions/workflows/linux.yml)
|
||||
[](https://github.com/libexpat/libexpat/actions/workflows/linux.yml)
|
||||
[](https://ci.appveyor.com/project/libexpat/libexpat)
|
||||
[](https://repology.org/metapackage/expat/versions)
|
||||
[](https://sourceforge.net/projects/expat/files/)
|
||||
[](https://github.com/libexpat/libexpat/releases)
|
||||
|
||||
|
||||
# Expat, Release 2.5.0
|
||||
# Expat, Release 2.6.0
|
||||
|
||||
This is Expat, a C library for parsing XML, started by
|
||||
This is Expat, a C99 library for parsing
|
||||
[XML 1.0 Fourth Edition](https://www.w3.org/TR/2006/REC-xml-20060816/), started by
|
||||
[James Clark](https://en.wikipedia.org/wiki/James_Clark_%28programmer%29) in 1997.
|
||||
Expat is a stream-oriented XML parser. This means that you register
|
||||
handlers with the parser before starting the parse. These handlers
|
||||
|
||||
+29
-14
@@ -11,7 +11,7 @@ dnl Copyright (c) 2000 Clark Cooper <[email protected]>
|
||||
dnl Copyright (c) 2000-2005 Fred L. Drake, Jr. <[email protected]>
|
||||
dnl Copyright (c) 2001-2003 Greg Stein <[email protected]>
|
||||
dnl Copyright (c) 2006-2012 Karl Waclawek <[email protected]>
|
||||
dnl Copyright (c) 2016-2022 Sebastian Pipping <[email protected]>
|
||||
dnl Copyright (c) 2016-2024 Sebastian Pipping <[email protected]>
|
||||
dnl Copyright (c) 2017 S. P. Zeidler <[email protected]>
|
||||
dnl Copyright (c) 2017 Stephen Groat <[email protected]>
|
||||
dnl Copyright (c) 2017-2020 Joe Orton <[email protected]>
|
||||
@@ -60,7 +60,7 @@ m4_define([expat_version],
|
||||
m4_ifdef([__gnu__],
|
||||
[esyscmd(conftools/get-version.sh lib/expat.h)],
|
||||
[2.2.x]))
|
||||
AC_INIT([expat], expat_version, [expat-bugs@libexpat.org])
|
||||
AC_INIT([expat], expat_version, [https://github.com/libexpat/libexpat/issues])
|
||||
m4_undefine([expat_version])
|
||||
|
||||
AC_CONFIG_SRCDIR([Makefile.in])
|
||||
@@ -68,6 +68,7 @@ AC_CONFIG_AUX_DIR([conftools])
|
||||
AC_CONFIG_MACRO_DIR([m4])
|
||||
AC_CANONICAL_HOST
|
||||
AM_INIT_AUTOMAKE
|
||||
AM_MAINTAINER_MODE([enable]) # to allow argument --disable-maintainer-mode
|
||||
|
||||
|
||||
dnl
|
||||
@@ -81,9 +82,9 @@ dnl
|
||||
dnl If the API changes incompatibly set LIBAGE back to 0
|
||||
dnl
|
||||
|
||||
LIBCURRENT=9 # sync
|
||||
LIBREVISION=10 # with
|
||||
LIBAGE=8 # CMakeLists.txt!
|
||||
LIBCURRENT=10 # sync
|
||||
LIBREVISION=0 # with
|
||||
LIBAGE=9 # CMakeLists.txt!
|
||||
|
||||
AC_CONFIG_HEADERS([expat_config.h])
|
||||
AH_TOP([#ifndef EXPAT_CONFIG_H
|
||||
@@ -105,6 +106,9 @@ AC_SUBST(LIBAGE)
|
||||
AC_LANG([C])
|
||||
AC_PROG_CC_C99
|
||||
|
||||
AS_IF([test "${ac_cv_prog_cc_c99}" = no],
|
||||
[AC_MSG_ERROR([Expat requires a C99 compiler.])])
|
||||
|
||||
AS_IF([test "$GCC" = yes],
|
||||
[AX_APPEND_COMPILE_FLAGS([-Wall -Wextra], [AM_CFLAGS])
|
||||
dnl Be careful about adding the -fexceptions option; some versions of
|
||||
@@ -176,6 +180,8 @@ AC_ARG_WITH([tests],
|
||||
[with_tests=yes])
|
||||
AM_CONDITIONAL([WITH_TESTS], [test x${with_tests} = xyes])
|
||||
|
||||
AS_IF([test x${with_tests} = xyes],
|
||||
[AX_CXX_COMPILE_STDCXX_11([noext], [mandatory])])
|
||||
|
||||
AS_VAR_SET([EXPATCFG_ON_MINGW],[no])
|
||||
AS_CASE("${host_os}",
|
||||
@@ -202,14 +208,16 @@ AS_IF([test "x${with_libbsd}" != xno],
|
||||
[],
|
||||
[AS_IF([test "x${with_libbsd}" = xyes],
|
||||
[AC_MSG_ERROR([Enforced use of libbsd cannot be satisfied.])])])])
|
||||
AC_MSG_CHECKING([for arc4random_buf (BSD or libbsd)])
|
||||
AC_MSG_CHECKING([for arc4random_buf (BSD, libbsd or glibc 2.36+)])
|
||||
AC_LINK_IFELSE([AC_LANG_SOURCE([
|
||||
#include <stdlib.h> /* for arc4random_buf on BSD, for NULL */
|
||||
#if defined(HAVE_LIBBSD)
|
||||
# include <bsd/stdlib.h>
|
||||
#else
|
||||
# include <stdlib.h> /* for arc4random_buf on BSD */
|
||||
#endif
|
||||
int main() {
|
||||
arc4random_buf(NULL, 0U);
|
||||
char dummy[[123]]; // double brackets for m4
|
||||
arc4random_buf(dummy, 0U);
|
||||
return 0;
|
||||
}
|
||||
])],
|
||||
@@ -217,7 +225,7 @@ AC_LINK_IFELSE([AC_LANG_SOURCE([
|
||||
AC_MSG_RESULT([yes])],
|
||||
[AC_MSG_RESULT([no])
|
||||
|
||||
AC_MSG_CHECKING([for arc4random (BSD, macOS or libbsd)])
|
||||
AC_MSG_CHECKING([for arc4random (BSD, macOS, libbsd or glibc 2.36+)])
|
||||
AC_LINK_IFELSE([AC_LANG_SOURCE([
|
||||
#if defined(HAVE_LIBBSD)
|
||||
# include <bsd/stdlib.h>
|
||||
@@ -295,6 +303,8 @@ AC_SUBST(FILEMAP)
|
||||
dnl Some basic configuration:
|
||||
AC_DEFINE([XML_NS], 1,
|
||||
[Define to make XML Namespaces functionality available.])
|
||||
AC_DEFINE([XML_GE], 1,
|
||||
[Define as 1/0 to enable/disable support for general entities.])
|
||||
AC_DEFINE([XML_DTD], 1,
|
||||
[Define to make parameter entity parsing functionality available.])
|
||||
AC_DEFINE([XML_DEV_URANDOM], 1,
|
||||
@@ -319,9 +329,10 @@ AS_HELP_STRING([--disable-xml-context],
|
||||
AS_IF([test "x${enable_xml_context}" != "xno"],
|
||||
[AS_IF([test "x${enable_xml_context}" = "xyes" \
|
||||
-o "x${enable_xml_context}" = "x"],
|
||||
[AS_VAR_SET(enable_xml_context,1024)])
|
||||
AC_DEFINE_UNQUOTED([XML_CONTEXT_BYTES], [${enable_xml_context}],
|
||||
[Define to specify how much context to retain around the current parse point.])])
|
||||
[AS_VAR_SET(enable_xml_context,1024)])],
|
||||
[AS_VAR_SET(enable_xml_context,0)])
|
||||
AC_DEFINE_UNQUOTED([XML_CONTEXT_BYTES], [${enable_xml_context}],
|
||||
[Define to specify how much context to retain around the current parse point, 0 to disable.])
|
||||
|
||||
AC_ARG_WITH([docbook],
|
||||
[AS_HELP_STRING([--with-docbook],
|
||||
@@ -345,8 +356,12 @@ AS_IF([test "x${DOCBOOK_TO_MAN}" != x -a "x$with_docbook" != xno],
|
||||
You can also configure using --without-docbook if you can do without a man
|
||||
page for xmlwf.])])])
|
||||
|
||||
AM_CONDITIONAL(WITH_DOCBOOK, [test "x${DOCBOOK_TO_MAN}" != x])
|
||||
|
||||
dnl This will make sure that a release tarball shipping a pre-rendered xmlwf man page will
|
||||
dnl get it installed, independent of whether some flavor of docbook2man is available.
|
||||
dnl This relies on file xmlwf.1 being at least as recent as its source file xmlwf.xml.
|
||||
AS_IF([test -f "${srcdir}"/doc/xmlwf.1],
|
||||
[AM_CONDITIONAL(WITH_DOCBOOK, [true])],
|
||||
[AM_CONDITIONAL(WITH_DOCBOOK, [test "x${DOCBOOK_TO_MAN}" != x])])
|
||||
|
||||
dnl Configure CMake file templates
|
||||
dnl NOTE: The *_TRUE variables read here are Automake conditionals
|
||||
|
||||
@@ -132,6 +132,8 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
|
||||
$(top_srcdir)/conftools/ax-append-compile-flags.m4 \
|
||||
$(top_srcdir)/conftools/ax-append-link-flags.m4 \
|
||||
$(top_srcdir)/conftools/expatcfg-compiler-supports-visibility.m4 \
|
||||
$(top_srcdir)/conftools/ax-cxx-compile-stdcxx.m4 \
|
||||
$(top_srcdir)/conftools/ax-cxx-compile-stdcxx-11.m4 \
|
||||
$(top_srcdir)/configure.ac
|
||||
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
||||
$(ACLOCAL_M4)
|
||||
@@ -241,6 +243,7 @@ FGREP = @FGREP@
|
||||
FILECMD = @FILECMD@
|
||||
FILEMAP = @FILEMAP@
|
||||
GREP = @GREP@
|
||||
HAVE_CXX11 = @HAVE_CXX11@
|
||||
INSTALL = @INSTALL@
|
||||
INSTALL_DATA = @INSTALL_DATA@
|
||||
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
||||
@@ -260,6 +263,7 @@ LIPO = @LIPO@
|
||||
LN_S = @LN_S@
|
||||
LTLIBOBJS = @LTLIBOBJS@
|
||||
LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
|
||||
MAINT = @MAINT@
|
||||
MAKEINFO = @MAKEINFO@
|
||||
MANIFEST_TOOL = @MANIFEST_TOOL@
|
||||
MKDIR_P = @MKDIR_P@
|
||||
@@ -351,7 +355,7 @@ EXTRA_DIST = \
|
||||
all: all-am
|
||||
|
||||
.SUFFIXES:
|
||||
$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
|
||||
$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
|
||||
@for dep in $?; do \
|
||||
case '$(am__configure_deps)' in \
|
||||
*$$dep*) \
|
||||
@@ -375,9 +379,9 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
||||
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
|
||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||
|
||||
$(top_srcdir)/configure: $(am__configure_deps)
|
||||
$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
|
||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||
$(ACLOCAL_M4): $(am__aclocal_m4_deps)
|
||||
$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
|
||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||
$(am__aclocal_m4_deps):
|
||||
|
||||
|
||||
Vendored
+2
-2
@@ -1,2 +1,2 @@
|
||||
/*! OK.css v1.0.3 | MIT License | github.com/andrewh0/okcss */@import url("https://rsms.me/inter/inter.css");
|
||||
/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}:root{--ok-sans:"Inter",system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Open Sans","Helvetica Neue","Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--ok-mono:SFMono-Regular,Menlo,Monaco,Consolas,"Ubuntu Mono","Liberation Mono","Courier New",Courier,monospace;--ok-fw-0:400;--ok-fw-1:600;--ok-fw-2:700;--ok-fw-3:700;--ok-fs-0:2.5rem;--ok-fs-1:2rem;--ok-fs-2:1.5rem;--ok-fs-3:1.25rem;--ok-fs-4:1rem;--ok-fs-5:0.75rem;--ok-br:0.25rem;--ok-s-0:0;--ok-s-1:0.25rem;--ok-s-2:0.5rem;--ok-s-3:1rem;--ok-s-4:1.5rem;--ok-s-5:2rem;--ok-s-6:2.5rem;--ok-lh-body:1.5;--ok-lh-heading:1.25;--ok-t-hl:#ffcf30;--ok-accent-0:#3e67fa;--ok-accent-1:#4788ff;--ok-tc-accent:#3173de;--ok-tc-code:#c23a30;--ok-tc-0:#000;--ok-tc-1:#747474;--ok-tc-2:#848484;--ok-bg-0:#fff;--ok-bg-1:#f0f0f0;--ok-bg-2:#ccc;--ok-b-0:1px solid #cbcbcb;--ok-b-1:1px solid #848484;--ok-down-0:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' height='8' viewBox='0 0 12 8' width='24' fill='none'%3E%3Cpath d='M6 6l4-4h1v1-1L6 7 1 2h1l4 4z' fill='%23747474'/%3E%3C/svg%3E");--ok-down-1:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' height='8' viewBox='0 0 12 8' width='24' fill='none'%3E%3Cpath d='M6 6l4-4h1v1-1L6 7 1 2h1l4 4z' fill='%23848484'/%3E%3C/svg%3E")}@media (prefers-color-scheme:dark){:root{--ok-tc-accent:#5c9aff;--ok-tc-code:#ed5853;--ok-tc-0:#fff;--ok-tc-1:#ababab;--ok-tc-2:#929292;--ok-bg-0:#000;--ok-bg-1:#212121;--ok-bg-2:#3e3e3e;--ok-b-0:1px solid #747474;--ok-b-1:1px solid #929292;--ok-down-0:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' height='8' viewBox='0 0 12 8' width='24' fill='none'%3E%3Cpath d='M6 6l4-4h1v1-1L6 7 1 2h1l4 4z' fill='%23ababab'/%3E%3C/svg%3E");--ok-down-1:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' height='8' viewBox='0 0 12 8' width='24' fill='none'%3E%3Cpath d='M6 6l4-4h1v1-1L6 7 1 2h1l4 4z' fill='%23929292'/%3E%3C/svg%3E")}}*,:after,:before{box-sizing:border-box}*{margin:0;padding:0}html{font-family:var(--ok-sans);line-sizing:normal;line-height:var(--ok-lh-body);font-weight:var(--ok-fw-0);color:var(--ok-tc-0);background-color:var(--ok-bg-0);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%;-ms-text-size-adjust:100%;text-size-adjust:100%;text-rendering:optimizeLegibility}@supports (font-variation-settings:normal){html{font-family:Inter var,var(--ok-sans)}}button,input,optgroup,select,textarea{font-family:inherit;line-height:var(--ok-lh-body)}[role=button],button{cursor:pointer}audio,canvas,embed,iframe,img,input,object,select,svg,textarea,video{display:block}img,video{max-width:100%;height:auto}body{padding:var(--ok-s-3);max-width:80ch;margin:auto}h1{font-size:var(--ok-fs-0);margin:0}h2{font-size:var(--ok-fs-1)}h3{font-size:var(--ok-fs-2)}h4{font-size:var(--ok-fs-3)}h5{font-size:var(--ok-fs-4)}h6{font-size:var(--ok-fs-5);text-transform:uppercase;font-weight:var(--ok-fw-1)}h1,h2,h3,h4,h5,h6{line-height:var(--ok-lh-heading);font-weight:var(--ok-fw-3)}p{font-size:var(--ok-fs-4)}small{fontLine truncated
|
||||
/*! OK.css v1.2.0 | MIT License | github.com/andrewh0/okcss */@import url("https://rsms.me/inter/inter.css");
|
||||
/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}:root{--ok-sans:"Inter",system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Open Sans","Helvetica Neue","Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--ok-mono:SFMono-Regular,Menlo,Monaco,Consolas,"Ubuntu Mono","Liberation Mono","Courier New",Courier,monospace;--ok-fw-0:400;--ok-fw-1:600;--ok-fw-2:700;--ok-fw-3:700;--ok-fs-0:2.5rem;--ok-fs-1:2rem;--ok-fs-2:1.5rem;--ok-fs-3:1.25rem;--ok-fs-4:1rem;--ok-fs-5:0.75rem;--ok-br:0.25rem;--ok-s-0:0;--ok-s-1:0.25rem;--ok-s-2:0.5rem;--ok-s-3:1rem;--ok-s-4:1.5rem;--ok-s-5:2rem;--ok-s-6:2.5rem;--ok-lh-body:1.5;--ok-lh-heading:1.25;--ok-t-hl:#ffcf30;--ok-accent-0:#3e67fa;--ok-accent-1:#4788ff;--ok-tc-accent:#3173de;--ok-tc-code:#c23a30;--ok-tc-0:#000;--ok-tc-1:#747474;--ok-tc-2:#848484;--ok-bg-0:#fff;--ok-bg-1:#f0f0f0;--ok-bg-2:#ccc;--ok-b-0:1px solid #cbcbcb;--ok-b-1:1px solid #848484;--ok-down-0:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' height='8' viewBox='0 0 12 8' width='24' fill='none'%3E%3Cpath d='M6 6l4-4h1v1-1L6 7 1 2h1l4 4z' fill='%23747474'/%3E%3C/svg%3E");--ok-down-1:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' height='8' viewBox='0 0 12 8' width='24' fill='none'%3E%3Cpath d='M6 6l4-4h1v1-1L6 7 1 2h1l4 4z' fill='%23848484'/%3E%3C/svg%3E")}@media (prefers-color-scheme:dark){:root{--ok-tc-accent:#5c9aff;--ok-tc-code:#ed5853;--ok-tc-0:#fff;--ok-tc-1:#ababab;--ok-tc-2:#929292;--ok-bg-0:#000;--ok-bg-1:#212121;--ok-bg-2:#3e3e3e;--ok-b-0:1px solid #747474;--ok-b-1:1px solid #929292;--ok-down-0:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' height='8' viewBox='0 0 12 8' width='24' fill='none'%3E%3Cpath d='M6 6l4-4h1v1-1L6 7 1 2h1l4 4z' fill='%23ababab'/%3E%3C/svg%3E");--ok-down-1:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' height='8' viewBox='0 0 12 8' width='24' fill='none'%3E%3Cpath d='M6 6l4-4h1v1-1L6 7 1 2h1l4 4z' fill='%23929292'/%3E%3C/svg%3E")}}*,:after,:before{box-sizing:border-box}*{margin:0;padding:0}html{font-family:var(--ok-sans);line-sizing:normal;line-height:var(--ok-lh-body);font-weight:var(--ok-fw-0);color:var(--ok-tc-0);background-color:var(--ok-bg-0);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%;-ms-text-size-adjust:100%;text-size-adjust:100%;text-rendering:optimizeLegibility;scroll-behavior:smooth}@supports (font-variation-settings:normal){html{font-family:Inter var,var(--ok-sans)}}button,input,optgroup,select,textarea{font-family:inherit;line-height:var(--ok-lh-body)}[role=button],button{cursor:pointer}audio,canvas,embed,iframe,img,input,object,select,svg,textarea,video{display:block}img,video{max-width:100%;height:auto}body{padding:var(--ok-s-3);max-width:80ch;margin:auto}article{padding-bottom:var(--ok-s-6)}h1{font-size:var(--ok-fs-0);margin:0}h2{font-size:var(--ok-fs-1)}h3{font-size:var(--ok-fs-2)}h4{font-size:var(--ok-fs-3)}h5{font-size:var(--ok-fs-4)}h6{font-size:var(--ok-fs-5);text-transform:uppercase;font-weight:var(--ok-fw-1)}h1,h2,h3,h4,h5,h6{line-height:var(--ok-lh-heading);fontLine truncated
|
||||
@@ -14,11 +14,13 @@
|
||||
Copyright (c) 2000 Clark Cooper <[email protected]>
|
||||
Copyright (c) 2000-2004 Fred L. Drake, Jr. <[email protected]>
|
||||
Copyright (c) 2002-2012 Karl Waclawek <[email protected]>
|
||||
Copyright (c) 2017-2022 Sebastian Pipping <[email protected]>
|
||||
Copyright (c) 2017-2024 Sebastian Pipping <[email protected]>
|
||||
Copyright (c) 2017 Jakub Wilk <[email protected]>
|
||||
Copyright (c) 2021 Tomas Korbar <[email protected]>
|
||||
Copyright (c) 2021 Nicolas Cavallari <nicolas.cavallari@green-communications.fr>
|
||||
Copyright (c) 2022 Thijs Schreijer <[email protected]>
|
||||
Copyright (c) 2023 Hanno Böck <[email protected]>
|
||||
Copyright (c) 2023 Sony Corporation / Snild Dolkow <[email protected]>
|
||||
Licensed under the MIT license:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
@@ -50,7 +52,7 @@
|
||||
<div>
|
||||
<h1>
|
||||
The Expat XML Parser
|
||||
<small>Release 2.5.0</small>
|
||||
<small>Release 2.6.0</small>
|
||||
</h1>
|
||||
</div>
|
||||
<div class="content">
|
||||
@@ -68,11 +70,11 @@ Working Group at W3C that produced the XML specification.</p>
|
||||
|
||||
<p>This is free software, licensed under the <a
|
||||
href="../COPYING">MIT/X Consortium license</a>. You may download it
|
||||
from <a href="http://www.libexpat.org/">the Expat home page</a>.
|
||||
from <a href="https://libexpat.github.io/">the Expat home page</a>.
|
||||
</p>
|
||||
|
||||
<p>The bulk of this document was originally commissioned as an article
|
||||
by <a href="http://www.xml.com/">XML.com</a>. They graciously allowed
|
||||
by <a href="https://www.xml.com/">XML.com</a>. They graciously allowed
|
||||
Clark Cooper to retain copyright and to distribute it with Expat.
|
||||
This version has been substantially extended to include documentation
|
||||
on features which have been added since the original article was
|
||||
@@ -151,10 +153,11 @@ interface.</p>
|
||||
</ul>
|
||||
</li>
|
||||
<li>
|
||||
<a href="#billion-laughs">Billion Laughs Attack Protection</a>
|
||||
<a href="#attack-protection">Attack Protection</a>
|
||||
<ul>
|
||||
<li><a href="#XML_SetBillionLaughsAttackProtectionMaximumAmplification">XML_SetBillionLaughsAttackProtectionMaximumAmplification</a></li>
|
||||
<li><a href="#XML_SetBillionLaughsAttackProtectionActivationThreshold">XML_SetBillionLaughsAttackProtectionActivationThreshold</a></li>
|
||||
<li><a href="#XML_SetReparseDeferralEnabled">XML_SetReparseDeferralEnabled</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href="#miscellaneous">Miscellaneous Functions</a>
|
||||
@@ -305,7 +308,7 @@ shoveling the document to the parser so that it can do its work.</p>
|
||||
|
||||
<p>The Expat distribution comes as a compressed (with GNU gzip) tar
|
||||
file. You may download the latest version from <a href=
|
||||
"http://sourceforge.net/projects/expat/" >Source Forge</a>. After
|
||||
"https://sourceforge.net/projects/expat/" >Source Forge</a>. After
|
||||
unpacking this, cd into the directory. Then follow either the Win32
|
||||
directions or Unix directions below.</p>
|
||||
|
||||
@@ -359,37 +362,64 @@ and the definition of character types in the case of
|
||||
<code>XML_UNICODE_WCHAR_T</code>. The symbols are:</p>
|
||||
|
||||
<dl class="cpp-symbols">
|
||||
<dt>XML_DTD</dt>
|
||||
<dt><a name="XML_GE">XML_GE</a></dt>
|
||||
<dd>
|
||||
Added in Expat 2.6.0.
|
||||
Include support for
|
||||
<a href="https://www.w3.org/TR/2006/REC-xml-20060816/#sec-physical-struct">general entities</a>
|
||||
(syntax <code>&e1;</code> to reference and
|
||||
syntax <code><!ENTITY e1 'value1'></code> (an internal general entity) or
|
||||
<code><!ENTITY e2 SYSTEM 'file2'></code> (an external general entity) to declare).
|
||||
With <code>XML_GE</code> enabled, general entities will be replaced by their declared replacement text;
|
||||
for this to work for <em>external</em> general entities, in addition an
|
||||
<code><a href="#XML_SetExternalEntityRefHandler">XML_ExternalEntityRefHandler</a></code> must be set using
|
||||
<code><a href="#XML_SetExternalEntityRefHandler">XML_SetExternalEntityRefHandler</a></code>.
|
||||
Also, enabling <code>XML_GE</code> makes
|
||||
the functions <code><a href="#XML_SetBillionLaughsAttackProtectionMaximumAmplification">
|
||||
XML_SetBillionLaughsAttackProtectionMaximumAmplification</a></code> and <code>
|
||||
<a href="#XML_SetBillionLaughsAttackProtectionActivationThreshold">
|
||||
XML_SetBillionLaughsAttackProtectionActivationThreshold</a></code> available.
|
||||
<br/>
|
||||
With <code>XML_GE</code> disabled, Expat has a smaller memory footprint and can be faster, but will
|
||||
not load external general entities and will replace all general entities
|
||||
(except the <a href="https://www.w3.org/TR/2006/REC-xml-20060816/#sec-predefined-ent">predefined five</a>:
|
||||
<code>amp</code>, <code>apos</code>, <code>gt</code>, <code>lt</code>, <code>quot</code>)
|
||||
with a self-reference:
|
||||
for example, referencing an entity <code>e1</code> via <code>&e1;</code> will be replaced
|
||||
by text <code>&e1;</code>.
|
||||
</dd>
|
||||
|
||||
<dt><a name="XML_DTD">XML_DTD</a></dt>
|
||||
<dd>Include support for using and reporting DTD-based content. If
|
||||
this is defined, default attribute values from an external DTD subset
|
||||
are reported and attribute value normalization occurs based on the
|
||||
type of attributes defined in the external subset. Without
|
||||
this, Expat has a smaller memory footprint and can be faster, but will
|
||||
not load external entities or process conditional sections. If defined, makes
|
||||
not load external parameter entities or process conditional sections. If defined, makes
|
||||
the functions <code><a
|
||||
href="#XML_SetBillionLaughsAttackProtectionMaximumAmplification">
|
||||
XML_SetBillionLaughsAttackProtectionMaximumAmplification</a></code> and <code>
|
||||
<a href="#XML_SetBillionLaughsAttackProtectionActivationThreshold">
|
||||
XML_SetBillionLaughsAttackProtectionActivationThreshold</a></code> available.</dd>
|
||||
|
||||
<dt>XML_NS</dt>
|
||||
<dt><a name="XML_NS">XML_NS</a></dt>
|
||||
<dd>When defined, support for the <cite><a href=
|
||||
"http://www.w3.org/TR/REC-xml-names/" >Namespaces in XML</a></cite>
|
||||
"https://www.w3.org/TR/REC-xml-names/" >Namespaces in XML</a></cite>
|
||||
specification is included.</dd>
|
||||
|
||||
<dt>XML_UNICODE</dt>
|
||||
<dt><a name="XML_UNICODE">XML_UNICODE</a></dt>
|
||||
<dd>When defined, character data reported to the application is
|
||||
encoded in UTF-16 using wide characters of the type
|
||||
<code>XML_Char</code>. This is implied if
|
||||
<code>XML_UNICODE_WCHAR_T</code> is defined.</dd>
|
||||
|
||||
<dt>XML_UNICODE_WCHAR_T</dt>
|
||||
<dt><a name="XML_UNICODE_WCHAR_T">XML_UNICODE_WCHAR_T</a></dt>
|
||||
<dd>If defined, causes the <code>XML_Char</code> character type to be
|
||||
defined using the <code>wchar_t</code> type; otherwise, <code>unsigned
|
||||
short</code> is used. Defining this implies
|
||||
<code>XML_UNICODE</code>.</dd>
|
||||
|
||||
<dt>XML_LARGE_SIZE</dt>
|
||||
<dt><a name="XML_LARGE_SIZE">XML_LARGE_SIZE</a></dt>
|
||||
<dd>If defined, causes the <code>XML_Size</code> and <code>XML_Index</code>
|
||||
integer types to be at least 64 bits in size. This is intended to support
|
||||
processing of very large input streams, where the return values of
|
||||
@@ -399,23 +429,23 @@ processing of very large input streams, where the return values of
|
||||
could overflow. It may not be supported by all compilers, and is turned
|
||||
off by default.</dd>
|
||||
|
||||
<dt>XML_CONTEXT_BYTES</dt>
|
||||
<dt><a name="XML_CONTEXT_BYTES">XML_CONTEXT_BYTES</a></dt>
|
||||
<dd>The number of input bytes of markup context which the parser will
|
||||
ensure are available for reporting via <code><a href=
|
||||
"#XML_GetInputContext" >XML_GetInputContext</a></code>. This is
|
||||
normally set to 1024, and must be set to a positive integer. If this
|
||||
is not defined, the input context will not be available and <code><a
|
||||
normally set to 1024, and must be set to a positive integer to enable.
|
||||
If this is set to zero, the input context will not be available and <code><a
|
||||
href= "#XML_GetInputContext" >XML_GetInputContext</a></code> will
|
||||
always report NULL. Without this, Expat has a smaller memory
|
||||
always report <code>NULL</code>. Without this, Expat has a smaller memory
|
||||
footprint and can be faster.</dd>
|
||||
|
||||
<dt>XML_STATIC</dt>
|
||||
<dt><a name="XML_STATIC">XML_STATIC</a></dt>
|
||||
<dd>On Windows, this should be set if Expat is going to be linked
|
||||
statically with the code that calls it; this is required to get all
|
||||
the right MSVC magic annotations correct. This is ignored on other
|
||||
platforms.</dd>
|
||||
|
||||
<dt>XML_ATTR_INFO</dt>
|
||||
<dt><a name="XML_ATTR_INFO">XML_ATTR_INFO</a></dt>
|
||||
<dd>If defined, makes the additional function <code><a href=
|
||||
"#XML_GetAttributeInfo" >XML_GetAttributeInfo</a></code> available
|
||||
for reporting attribute byte offsets.</dd>
|
||||
@@ -669,8 +699,9 @@ function. The StartNamespaceDeclHandler is called prior to the start
|
||||
tag handler and the EndNamespaceDeclHandler is called after the
|
||||
corresponding end tag that ends the namespace's scope. The namespace
|
||||
start handler gets passed the prefix and URI for the namespace. For a
|
||||
default namespace declaration (xmlns='...'), the prefix will be null.
|
||||
The URI will be null for the case where the default namespace is being
|
||||
default namespace declaration (xmlns='...'), the prefix will be
|
||||
<code>NULL</code>.
|
||||
The URI will be <code>NULL</code> for the case where the default namespace is being
|
||||
unset. The namespace end handler just gets the prefix for the closing
|
||||
scope.</p>
|
||||
|
||||
@@ -799,7 +830,7 @@ has already been passed into the parser. Applications for this
|
||||
include</p>
|
||||
|
||||
<ul>
|
||||
<li>Supporting the <a href= "http://www.w3.org/TR/xinclude/"
|
||||
<li>Supporting the <a href= "https://www.w3.org/TR/xinclude/"
|
||||
>XInclude</a> specification.</li>
|
||||
|
||||
<li>Delaying further processing until additional information is
|
||||
@@ -947,16 +978,20 @@ XML_Parser XMLCALL
|
||||
XML_ParserCreate(const XML_Char *encoding);
|
||||
</pre>
|
||||
<div class="fcndef">
|
||||
Construct a new parser. If encoding is non-null, it specifies a
|
||||
<p>
|
||||
Construct a new parser. If encoding is non-<code>NULL</code>, it specifies a
|
||||
character encoding to use for the document. This overrides the document
|
||||
encoding declaration. There are four built-in encodings:
|
||||
</p>
|
||||
<ul>
|
||||
<li>US-ASCII</li>
|
||||
<li>UTF-8</li>
|
||||
<li>UTF-16</li>
|
||||
<li>ISO-8859-1</li>
|
||||
</ul>
|
||||
<p>
|
||||
Any other value will invoke a call to the UnknownEncodingHandler.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<h4 id="XML_ParserCreateNS">XML_ParserCreateNS</h4>
|
||||
@@ -1003,9 +1038,9 @@ typedef struct {
|
||||
</pre>
|
||||
<div class="fcndef">
|
||||
<p>Construct a new parser using the suite of memory handling functions
|
||||
specified in <code>ms</code>. If <code>ms</code> is NULL, then use the
|
||||
specified in <code>ms</code>. If <code>ms</code> is <code>NULL</code>, then use the
|
||||
standard set of memory management functions. If <code>sep</code> is
|
||||
non NULL, then namespace processing is enabled in the created parser
|
||||
non-<code>NULL</code>, then namespace processing is enabled in the created parser
|
||||
and the character pointed at by sep is used as the separator between
|
||||
the namespace URI and the local part of the name.</p>
|
||||
</div>
|
||||
@@ -1077,6 +1112,11 @@ exceed the maximum integer value. Input data at the end of a buffer
|
||||
will remain unprocessed if it is part of an XML token for which the
|
||||
end is not part of that buffer.</p>
|
||||
|
||||
<p><a name="isFinal"></a>The application <em>must</em> make a concluding
|
||||
<code><a href="#XML_Parse">XML_Parse</a></code> or
|
||||
<code><a href="#XML_ParseBuffer">XML_ParseBuffer</a></code> call
|
||||
with <code>isFinal</code> set to <code>XML_TRUE</code>.</p>
|
||||
|
||||
<h4 id="XML_Parse">XML_Parse</h4>
|
||||
<pre class="fcndec">
|
||||
enum XML_Status XMLCALL
|
||||
@@ -1092,17 +1132,50 @@ enum XML_Status {
|
||||
};
|
||||
</pre>
|
||||
<div class="fcndef">
|
||||
<p>
|
||||
Parse some more of the document. The string <code>s</code> is a buffer
|
||||
containing part (or perhaps all) of the document. The number of bytes of s
|
||||
that are part of the document is indicated by <code>len</code>. This means
|
||||
that <code>s</code> doesn't have to be null terminated. It also means that
|
||||
that <code>s</code> doesn't have to be null-terminated. It also means that
|
||||
if <code>len</code> is larger than the number of bytes in the block of
|
||||
memory that <code>s</code> points at, then a memory fault is likely. The
|
||||
<code>isFinal</code> parameter informs the parser that this is the last
|
||||
piece of the document. Frequently, the last piece is empty (i.e.
|
||||
<code>len</code> is zero.)
|
||||
</p>
|
||||
|
||||
<p>
|
||||
If a parse error occurred, it returns <code>XML_STATUS_ERROR</code>.
|
||||
Otherwise it returns <code>XML_STATUS_OK</code> value.
|
||||
Note that regardless of the return value, there is no guarantee that all
|
||||
provided input has been parsed; only after <a href="#isFinal">the
|
||||
concluding call</a> will all handler callbacks and parsing errors have
|
||||
happened.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Simplified, <code>XML_Parse</code> can be considered a convenience wrapper
|
||||
that is pairing calls
|
||||
to <code><a href="#XML_GetBuffer">XML_GetBuffer</a></code>
|
||||
and <code><a href="#XML_ParseBuffer">XML_ParseBuffer</a></code>
|
||||
(when Expat is built with macro <code>XML_CONTEXT_BYTES</code>
|
||||
defined to a positive value, which is both common and default).
|
||||
<code>XML_Parse</code> is then functionally equivalent to calling
|
||||
<code><a href="#XML_GetBuffer">XML_GetBuffer</a></code>,
|
||||
<code>memcpy</code>, and
|
||||
<code><a href="#XML_ParseBuffer">XML_ParseBuffer</a></code>.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
To avoid double copying of the input, direct use of functions
|
||||
<code><a href="#XML_GetBuffer">XML_GetBuffer</a></code> and
|
||||
<code><a href="#XML_ParseBuffer">XML_ParseBuffer</a></code> is advised
|
||||
for most production use, e.g.
|
||||
if you're using <code>read</code> or similar functionality to fill your
|
||||
buffers, fill directly into the buffer from
|
||||
<code><a href="#XML_GetBuffer">XML_GetBuffer</a></code>,
|
||||
then parse with <code><a href="#XML_ParseBuffer">XML_ParseBuffer</a></code>.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<h4 id="XML_ParseBuffer">XML_ParseBuffer</h4>
|
||||
@@ -1128,8 +1201,8 @@ XML_GetBuffer(XML_Parser p,
|
||||
</pre>
|
||||
<div class="fcndef">
|
||||
Obtain a buffer of size <code>len</code> to read a piece of the document
|
||||
into. A NULL value is returned if Expat can't allocate enough memory for
|
||||
this buffer. A NULL value may also be returned if <code>len</code> is zero.
|
||||
into. A <code>NULL</code> value is returned if Expat can't allocate enough memory for
|
||||
this buffer. A <code>NULL</code> value may also be returned if <code>len</code> is zero.
|
||||
This has to be called prior to every call to
|
||||
<code><a href= "#XML_ParseBuffer" >XML_ParseBuffer</a></code>. A
|
||||
typical use would look like this:
|
||||
@@ -1275,7 +1348,7 @@ typedef struct {
|
||||
<p>Returns status of parser with respect to being initialized,
|
||||
parsing, finished, or suspended, and whether the final buffer is being
|
||||
processed. The <code>status</code> parameter <em>must not</em> be
|
||||
NULL.</p>
|
||||
<code>NULL</code>.</p>
|
||||
|
||||
<p>New in Expat 1.95.8.</p>
|
||||
</div>
|
||||
@@ -1290,7 +1363,7 @@ to ignore all text not descended from a <code>para</code> element. One
|
||||
way it could do this is to set the character handler when a para start tag
|
||||
is seen, and unset it for the corresponding end tag.</p>
|
||||
|
||||
<p>A handler may be <em>unset</em> by providing a NULL pointer to the
|
||||
<p>A handler may be <em>unset</em> by providing a <code>NULL</code> pointer to the
|
||||
appropriate handler setter. None of the handler setting functions have
|
||||
a return value.</p>
|
||||
|
||||
@@ -1318,7 +1391,7 @@ typedef void
|
||||
handler as a pointer to a vector of char pointers. Each attribute seen in
|
||||
a start (or empty) tag occupies 2 consecutive places in this vector: the
|
||||
attribute name followed by the attribute value. These pairs are terminated
|
||||
by a null pointer.</p>
|
||||
by a <code>NULL</code> pointer.</p>
|
||||
<p>Note that an empty tag generates a call to both start and end handlers
|
||||
(in that order).</p>
|
||||
</div>
|
||||
@@ -1368,7 +1441,7 @@ is <em>NOT null-terminated</em>. You have to use the length argument
|
||||
to deal with the end of the string. A single block of contiguous text
|
||||
free of markup may still result in a sequence of calls to this handler.
|
||||
In other words, if you're searching for a pattern in the text, it may
|
||||
be split across calls to this handler. Note: Setting this handler to NULL
|
||||
be split across calls to this handler. Note: Setting this handler to <code>NULL</code>
|
||||
may <em>NOT immediately</em> terminate call-backs if the parser is currently
|
||||
processing such a single block of contiguous markup-free text, as the parser
|
||||
will continue calling back until the end of the block is reached.</p>
|
||||
@@ -1526,16 +1599,16 @@ the format expected by the <code>context</code> argument to <code><a
|
||||
href="#XML_ExternalEntityParserCreate"
|
||||
>XML_ExternalEntityParserCreate</a></code>. <code>code</code> is
|
||||
valid only until the handler returns, so if the referenced entity is
|
||||
to be parsed later, it must be copied. <code>context</code> is NULL
|
||||
to be parsed later, it must be copied. <code>context</code> is <code>NULL</code>
|
||||
only when the entity is a parameter entity, which is how one can
|
||||
differentiate between general and parameter entities.</p>
|
||||
|
||||
<p>The <code>base</code> parameter is the base to use for relative
|
||||
system identifiers. It is set by <code><a
|
||||
href="#XML_SetBase">XML_SetBase</a></code> and may be NULL. The
|
||||
href="#XML_SetBase">XML_SetBase</a></code> and may be <code>NULL</code>. The
|
||||
<code>publicId</code> parameter is the public id given in the entity
|
||||
declaration and may be NULL. <code>systemId</code> is the system
|
||||
identifier specified in the entity declaration and is never NULL.</p>
|
||||
declaration and may be <code>NULL</code>. <code>systemId</code> is the system
|
||||
identifier specified in the entity declaration and is never <code>NULL</code>.</p>
|
||||
|
||||
<p>There are a couple of ways in which this handler differs from
|
||||
others. First, this handler returns a status indicator (an
|
||||
@@ -1564,10 +1637,10 @@ XML_SetExternalEntityRefHandlerArg(XML_Parser p,
|
||||
</pre>
|
||||
<div class="fcndef">
|
||||
<p>Set the argument passed to the ExternalEntityRefHandler. If
|
||||
<code>arg</code> is not NULL, it is the new value passed to the
|
||||
<code>arg</code> is not <code>NULL</code>, it is the new value passed to the
|
||||
handler set using <code><a href="#XML_SetExternalEntityRefHandler"
|
||||
>XML_SetExternalEntityRefHandler</a></code>; if <code>arg</code> is
|
||||
NULL, the argument passed to the handler function will be the parser
|
||||
<code>NULL</code>, the argument passed to the handler function will be the parser
|
||||
object itself.</p>
|
||||
|
||||
<p><strong>Note:</strong>
|
||||
@@ -1650,14 +1723,14 @@ value is -1, then that byte is invalid as the initial byte in a sequence.
|
||||
If the value is -n, where n is an integer > 1, then n is the number of
|
||||
bytes in the sequence and the actual conversion is accomplished by a
|
||||
call to the function pointed at by convert. This function may return -1
|
||||
if the sequence itself is invalid. The convert pointer may be null if
|
||||
if the sequence itself is invalid. The convert pointer may be <code>NULL</code> if
|
||||
there are only single byte codes. The data parameter passed to the convert
|
||||
function is the data pointer from <code>XML_Encoding</code>. The
|
||||
string s is <em>NOT</em> null-terminated and points at the sequence of
|
||||
bytes to be converted.</p>
|
||||
|
||||
<p>The function pointed at by <code>release</code> is called by the
|
||||
parser when it is finished with the encoding. It may be NULL.</p>
|
||||
parser when it is finished with the encoding. It may be <code>NULL</code>.</p>
|
||||
</div>
|
||||
|
||||
<div class="handler">
|
||||
@@ -1724,8 +1797,8 @@ typedef void
|
||||
</pre>
|
||||
<p>Sets a handler that is called for XML declarations and also for
|
||||
text declarations discovered in external entities. The way to
|
||||
distinguish is that the <code>version</code> parameter will be NULL
|
||||
for text declarations. The <code>encoding</code> parameter may be NULL
|
||||
distinguish is that the <code>version</code> parameter will be <code>NULL</code>
|
||||
for text declarations. The <code>encoding</code> parameter may be <code>NULL</code>
|
||||
for an XML declaration. The <code>standalone</code> argument will
|
||||
contain -1, 0, or 1 indicating respectively that there was no
|
||||
standalone parameter in the declaration, that it was given as no, or
|
||||
@@ -1749,7 +1822,7 @@ typedef void
|
||||
</pre>
|
||||
<p>Set a handler that is called at the start of a DOCTYPE declaration,
|
||||
before any external or internal subset is parsed. Both <code>sysid</code>
|
||||
and <code>pubid</code> may be NULL. The <code>has_internal_subset</code>
|
||||
and <code>pubid</code> may be <code>NULL</code>. The <code>has_internal_subset</code>
|
||||
will be non-zero if the DOCTYPE declaration has an internal subset.</p>
|
||||
</div>
|
||||
|
||||
@@ -1831,7 +1904,7 @@ around and freed at a later stage.</p>
|
||||
<code>XML_Content</code> nodes. If <code>type</code> equals
|
||||
<code>XML_CTYPE_EMPTY</code> or <code>XML_CTYPE_ANY</code>, then
|
||||
<code>quant</code> will be <code>XML_CQUANT_NONE</code>, and the other
|
||||
fields will be zero or NULL. If <code>type</code> is
|
||||
fields will be zero or <code>NULL</code>. If <code>type</code> is
|
||||
<code>XML_CTYPE_MIXED</code>, then <code>quant</code> will be
|
||||
<code>XML_CQUANT_NONE</code> or <code>XML_CQUANT_REP</code> and
|
||||
<code>numchildren</code> will contain the number of elements that are
|
||||
@@ -1843,7 +1916,7 @@ XML_CTYPE_NAME with no quantification. Only the root node can be type
|
||||
|
||||
<p>For type <code>XML_CTYPE_NAME</code>, the <code>name</code> field
|
||||
points to the name and the <code>numchildren</code> and
|
||||
<code>children</code> fields will be zero and NULL. The
|
||||
<code>children</code> fields will be zero and <code>NULL</code>. The
|
||||
<code>quant</code> field will indicate any quantifiers placed on the
|
||||
name.</p>
|
||||
|
||||
@@ -1879,11 +1952,11 @@ is in the <code>attname</code> parameter. The attribute type is in the
|
||||
type in the declaration with whitespace removed.</p>
|
||||
|
||||
<p>The <code>dflt</code> parameter holds the default value. It will be
|
||||
NULL in the case of "#IMPLIED" or "#REQUIRED" attributes. You can
|
||||
<code>NULL</code> in the case of "#IMPLIED" or "#REQUIRED" attributes. You can
|
||||
distinguish these two cases by checking the <code>isrequired</code>
|
||||
parameter, which will be true in the case of "#REQUIRED" attributes.
|
||||
Attributes which are "#FIXED" will have also have a true
|
||||
<code>isrequired</code>, but they will have the non-NULL fixed value
|
||||
<code>isrequired</code>, but they will have the non-<code>NULL</code> fixed value
|
||||
in the <code>dflt</code> parameter.</p>
|
||||
</div>
|
||||
|
||||
@@ -1911,14 +1984,14 @@ The <code>is_parameter_entity</code> argument will be non-zero in the
|
||||
case of parameter entities and zero otherwise.</p>
|
||||
|
||||
<p>For internal entities (<code><!ENTITY foo "bar"></code>),
|
||||
<code>value</code> will be non-NULL and <code>systemId</code>,
|
||||
<code>publicId</code>, and <code>notationName</code> will all be NULL.
|
||||
The value string is <em>not</em> NULL terminated; the length is
|
||||
<code>value</code> will be non-<code>NULL</code> and <code>systemId</code>,
|
||||
<code>publicId</code>, and <code>notationName</code> will all be <code>NULL</code>.
|
||||
The value string is <em>not</em> null-terminated; the length is
|
||||
provided in the <code>value_length</code> parameter. Do not use
|
||||
<code>value_length</code> to test for internal entities, since it is
|
||||
legal to have zero-length values. Instead check for whether or not
|
||||
<code>value</code> is NULL.</p> <p>The <code>notationName</code>
|
||||
argument will have a non-NULL value only for unparsed entity
|
||||
<code>value</code> is <code>NULL</code>.</p> <p>The <code>notationName</code>
|
||||
argument will have a non-<code>NULL</code> value only for unparsed entity
|
||||
declarations.</p>
|
||||
</div>
|
||||
|
||||
@@ -2092,15 +2165,11 @@ untranslated bytes of the input.</p>
|
||||
triggering a call spans over a very large amount of input, the actual
|
||||
parse position may be before the beginning of the buffer.</p>
|
||||
|
||||
<p>If <code>XML_CONTEXT_BYTES</code> is not defined, this will always
|
||||
return NULL.</p>
|
||||
<p>If <code>XML_CONTEXT_BYTES</code> is zero, this will always
|
||||
return <code>NULL</code>.</p>
|
||||
</div>
|
||||
|
||||
<h3><a name="billion-laughs">Billion Laughs Attack Protection</a></h3>
|
||||
|
||||
<p>The functions in this section configure the built-in
|
||||
protection against various forms of
|
||||
<a href="https://en.wikipedia.org/wiki/Billion_laughs_attack">billion laughs attacks</a>.</p>
|
||||
<h3><a name="attack-protection">Attack Protection</a><a name="billion-laughs"></a></h3>
|
||||
|
||||
<h4 id="XML_SetBillionLaughsAttackProtectionMaximumAmplification">XML_SetBillionLaughsAttackProtectionMaximumAmplification</h4>
|
||||
<pre class="fcndec">
|
||||
@@ -2188,6 +2257,27 @@ XML_SetBillionLaughsAttackProtectionActivationThreshold(XML_Parser p,
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<h4 id="XML_SetReparseDeferralEnabled">XML_SetReparseDeferralEnabled</h4>
|
||||
<pre class="fcndec">
|
||||
/* Added in Expat 2.6.0. */
|
||||
XML_Bool XMLCALL
|
||||
XML_SetReparseDeferralEnabled(XML_Parser parser, XML_Bool enabled);
|
||||
</pre>
|
||||
<div class="fcndef">
|
||||
<p>
|
||||
Large tokens may require many parse calls before enough data is available for Expat to parse it in full.
|
||||
If Expat retried parsing the token on every parse call, parsing could take quadratic time.
|
||||
To avoid this, Expat only retries once a significant amount of new data is available.
|
||||
This function allows disabling this behavior.
|
||||
</p>
|
||||
<p>
|
||||
The <code>enabled</code> argument should be <code>XML_TRUE</code> or <code>XML_FALSE</code>.
|
||||
</p>
|
||||
<p>
|
||||
Returns <code>XML_TRUE</code> on success, and <code>XML_FALSE</code> on error.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<h3><a name="miscellaneous">Miscellaneous functions</a></h3>
|
||||
|
||||
<p>The functions in this section either obtain state information from
|
||||
@@ -2313,7 +2403,7 @@ XML_SetEncoding(XML_Parser p,
|
||||
</pre>
|
||||
<div class="fcndef">
|
||||
Set the encoding to be used by the parser. It is equivalent to
|
||||
passing a non-null encoding argument to the parser creation functions.
|
||||
passing a non-<code>NULL</code> encoding argument to the parser creation functions.
|
||||
It must not be called after <code><a href= "#XML_Parse"
|
||||
>XML_Parse</a></code> or <code><a href= "#XML_ParseBuffer"
|
||||
>XML_ParseBuffer</a></code> have been called on the given parser.
|
||||
@@ -2385,7 +2475,7 @@ called. The setting of parameter entity parsing, controlled using
|
||||
external entity reference handler set via <code><a href=
|
||||
"#XML_SetExternalEntityRefHandler"
|
||||
>XML_SetExternalEntityRefHandler</a></code> with both
|
||||
<code>publicId</code> and <code>systemId</code> set to NULL.</p>
|
||||
<code>publicId</code> and <code>systemId</code> set to <code>NULL</code>.</p>
|
||||
|
||||
<p>If this function is called after parsing has begun, it returns
|
||||
<code>XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING</code> and ignores
|
||||
@@ -2506,7 +2596,7 @@ check these features to do so at runtime.</p>
|
||||
|
||||
<p>The return value is an array of <code>XML_Feature</code>,
|
||||
terminated by a record with a <code>feature</code> of
|
||||
<code>XML_FEATURE_END</code> and <code>name</code> of NULL,
|
||||
<code>XML_FEATURE_END</code> and <code>name</code> of <code>NULL</code>,
|
||||
identifying the feature-test macros Expat was compiled with. Since an
|
||||
application that requires this kind of information needs to determine
|
||||
the type of character the <code>name</code> points to, records for the
|
||||
@@ -2562,7 +2652,7 @@ XML_MemMalloc(XML_Parser parser, size_t size);
|
||||
<div class="fcndef">
|
||||
Allocate <code>size</code> bytes of memory using the allocator the
|
||||
<code>parser</code> object has been configured to use. Returns a
|
||||
pointer to the memory or NULL on failure. Memory allocated in this
|
||||
pointer to the memory or <code>NULL</code> on failure. Memory allocated in this
|
||||
way must be freed using <code><a href="#XML_MemFree"
|
||||
>XML_MemFree</a></code>.
|
||||
</div>
|
||||
@@ -2577,9 +2667,9 @@ Allocate <code>size</code> bytes of memory using the allocator the
|
||||
<code>parser</code> object has been configured to use.
|
||||
<code>ptr</code> must point to a block of memory allocated by <code><a
|
||||
href="#XML_MemMalloc" >XML_MemMalloc</a></code> or
|
||||
<code>XML_MemRealloc</code>, or be NULL. This function tries to
|
||||
<code>XML_MemRealloc</code>, or be <code>NULL</code>. This function tries to
|
||||
expand the block pointed to by <code>ptr</code> if possible. Returns
|
||||
a pointer to the memory or NULL on failure. On success, the original
|
||||
a pointer to the memory or <code>NULL</code> on failure. On success, the original
|
||||
block has either been expanded or freed. On failure, the original
|
||||
block has not been freed; the caller is responsible for freeing the
|
||||
original block. Memory allocated in this way must be freed using
|
||||
@@ -2595,7 +2685,7 @@ XML_MemFree(XML_Parser parser, void *ptr);
|
||||
<div class="fcndef">
|
||||
Free a block of memory pointed to by <code>ptr</code>. The block must
|
||||
have been allocated by <code><a href="#XML_MemMalloc"
|
||||
>XML_MemMalloc</a></code> or <code>XML_MemRealloc</code>, or be NULL.
|
||||
>XML_MemMalloc</a></code> or <code>XML_MemRealloc</code>, or be <code>NULL</code>.
|
||||
</div>
|
||||
|
||||
<hr />
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
\\$2 \(la\\$1\(ra\\$3
|
||||
..
|
||||
.if \n(.g .mso www.tmac
|
||||
.TH XMLWF 1 "October 25, 2022" "" ""
|
||||
.TH XMLWF 1 "February 6, 2024" "" ""
|
||||
.SH NAME
|
||||
xmlwf \- Determines if an XML document is well-formed
|
||||
.SH SYNOPSIS
|
||||
@@ -25,7 +25,7 @@ xmlwf \- Determines if an XML document is well-formed
|
||||
\fBxmlwf\fR \kx
|
||||
.if (\nx>(\n(.l/2)) .nr x (\n(.l/5)
|
||||
'in \n(.iu+\nxu
|
||||
\fB-h\fR
|
||||
\fB-h\fR | \fB--help\fR
|
||||
'in \n(.iu-\nxu
|
||||
.ad b
|
||||
'hy
|
||||
@@ -35,7 +35,7 @@ xmlwf \- Determines if an XML document is well-formed
|
||||
\fBxmlwf\fR \kx
|
||||
.if (\nx>(\n(.l/2)) .nr x (\n(.l/5)
|
||||
'in \n(.iu+\nxu
|
||||
\fB-v\fR
|
||||
\fB-v\fR | \fB--version\fR
|
||||
'in \n(.iu-\nxu
|
||||
.ad b
|
||||
'hy
|
||||
@@ -158,6 +158,16 @@ supports four built-in encodings:
|
||||
\*(T<ISO\-8859\-1\*(T>.
|
||||
Also see the \*(T<\fB\-w\fR\*(T> option.
|
||||
.TP
|
||||
\*(T<\fB\-g\fR\*(T> \fIbytes\fR
|
||||
Sets the buffer size to request per call pair to
|
||||
\*(T<\fBXML_GetBuffer\fR\*(T> and \*(T<\fBread\fR\*(T>
|
||||
(default: 8 KiB).
|
||||
.TP
|
||||
\*(T<\fB\-h\fR\*(T>, \*(T<\fB\-\-help\fR\*(T>
|
||||
Prints short usage information on command \fBxmlwf\fR,
|
||||
and then exits.
|
||||
Similar to this man page but more concise.
|
||||
.TP
|
||||
\*(T<\fB\-k\fR\*(T>
|
||||
When processing multiple files, \fBxmlwf\fR
|
||||
by default halts after the the first file with an error.
|
||||
@@ -189,6 +199,10 @@ Normally \fBxmlwf\fR never parses parameter
|
||||
entities. \*(T<\fB\-p\fR\*(T> tells it to always parse them.
|
||||
\*(T<\fB\-p\fR\*(T> implies \*(T<\fB\-x\fR\*(T>.
|
||||
.TP
|
||||
\*(T<\fB\-q\fR\*(T>
|
||||
Disable reparse deferral, and allow quadratic parse runtime
|
||||
on large tokens (default: reparse deferral enabled).
|
||||
.TP
|
||||
\*(T<\fB\-r\fR\*(T>
|
||||
Normally \fBxmlwf\fR memory-maps the XML file
|
||||
before parsing; this can result in faster parsing on many
|
||||
@@ -217,7 +231,7 @@ without client overhead.
|
||||
\*(T<\fB\-t\fR\*(T> turns off most of the output options
|
||||
(\*(T<\fB\-d\fR\*(T>, \*(T<\fB\-m\fR\*(T>, \*(T<\fB\-c\fR\*(T>, ...).
|
||||
.TP
|
||||
\*(T<\fB\-v\fR\*(T>
|
||||
\*(T<\fB\-v\fR\*(T>, \*(T<\fB\-\-version\fR\*(T>
|
||||
Prints the version of the Expat library being used, including some
|
||||
information on the compile-time configuration of the library, and
|
||||
then exits.
|
||||
@@ -281,7 +295,7 @@ halts upon encountering a well-formedness or output-file error.
|
||||
If \*(T<\fB\-k\fR\*(T> is provided, \fBxmlwf\fR continues
|
||||
processing the remaining input files, describing problems found with any of them.
|
||||
.SH "EXIT STATUS"
|
||||
For option \*(T<\fB\-v\fR\*(T> or \*(T<\fB\-h\fR\*(T>, \fBxmlwf\fR always exits with status code 0. For other cases, the following exit status codes are returned:
|
||||
For options \*(T<\fB\-v\fR\*(T>|\*(T<\fB\-\-version\fR\*(T> or \*(T<\fB\-h\fR\*(T>|\*(T<\fB\-\-help\fR\*(T>, \fBxmlwf\fR always exits with status code 0. For other cases, the following exit status codes are returned:
|
||||
.TP
|
||||
\*(T<\fB0\fR\*(T>
|
||||
The input files are well-formed and the output (if requested) was written successfully.
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
Copyright (c) 2001 Scott Bronson <[email protected]>
|
||||
Copyright (c) 2002-2003 Fred L. Drake, Jr. <[email protected]>
|
||||
Copyright (c) 2009 Karl Waclawek <[email protected]>
|
||||
Copyright (c) 2016-2022 Sebastian Pipping <[email protected]>
|
||||
Copyright (c) 2016-2024 Sebastian Pipping <[email protected]>
|
||||
Copyright (c) 2016 Ardo van Rangelrooij <[email protected]>
|
||||
Copyright (c) 2017 Rhodri James <[email protected]>
|
||||
Copyright (c) 2020 Joe Orton <[email protected]>
|
||||
@@ -21,7 +21,7 @@
|
||||
"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
|
||||
<!ENTITY dhfirstname "<firstname>Scott</firstname>">
|
||||
<!ENTITY dhsurname "<surname>Bronson</surname>">
|
||||
<!ENTITY dhdate "<date>October 25, 2022</date>">
|
||||
<!ENTITY dhdate "<date>February 6, 2024</date>">
|
||||
<!-- Please adjust this^^ date whenever cutting a new release. -->
|
||||
<!ENTITY dhsection "<manvolnum>1</manvolnum>">
|
||||
<!ENTITY dhemail "<email>[email protected]</email>">
|
||||
@@ -66,11 +66,17 @@
|
||||
</cmdsynopsis>
|
||||
<cmdsynopsis>
|
||||
<command>&dhpackage;</command>
|
||||
<arg choice="plain"><option>-h</option></arg>
|
||||
<group choice="plain">
|
||||
<arg><option>-h</option></arg>
|
||||
<arg><option>--help</option></arg>
|
||||
</group>
|
||||
</cmdsynopsis>
|
||||
<cmdsynopsis>
|
||||
<command>&dhpackage;</command>
|
||||
<arg choice="plain"><option>-v</option></arg>
|
||||
<group choice="plain">
|
||||
<arg><option>-v</option></arg>
|
||||
<arg><option>--version</option></arg>
|
||||
</group>
|
||||
</cmdsynopsis>
|
||||
</refsynopsisdiv>
|
||||
|
||||
@@ -251,6 +257,29 @@ supports both.
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><option>-g</option> <replaceable>bytes</replaceable></term>
|
||||
<listitem>
|
||||
<para>
|
||||
Sets the buffer size to request per call pair to
|
||||
<function>XML_GetBuffer</function> and <function>read</function>
|
||||
(default: 8 KiB).
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><option>-h</option></term>
|
||||
<term><option>--help</option></term>
|
||||
<listitem>
|
||||
<para>
|
||||
Prints short usage information on command <command>&dhpackage;</command>,
|
||||
and then exits.
|
||||
Similar to this man page but more concise.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><option>-k</option></term>
|
||||
<listitem>
|
||||
@@ -313,6 +342,16 @@ supports both.
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><option>-q</option></term>
|
||||
<listitem>
|
||||
<para>
|
||||
Disable reparse deferral, and allow quadratic parse runtime
|
||||
on large tokens (default: reparse deferral enabled).
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><option>-r</option></term>
|
||||
<listitem>
|
||||
@@ -362,6 +401,7 @@ supports both.
|
||||
|
||||
<varlistentry>
|
||||
<term><option>-v</option></term>
|
||||
<term><option>--version</option></term>
|
||||
<listitem>
|
||||
<para>
|
||||
Prints the version of the Expat library being used, including some
|
||||
@@ -461,7 +501,7 @@ supports both.
|
||||
|
||||
<refsect1>
|
||||
<title>EXIT STATUS</title>
|
||||
<para>For option <option>-v</option> or <option>-h</option>, <command>&dhpackage;</command> always exits with status code 0. For other cases, the following exit status codes are returned:
|
||||
<para>For options <option>-v</option>|<option>--version</option> or <option>-h</option>|<option>--help</option>, <command>&dhpackage;</command> always exits with status code 0. For other cases, the following exit status codes are returned:
|
||||
<variablelist>
|
||||
<varlistentry>
|
||||
<term><option>0</option></term>
|
||||
|
||||
@@ -6,8 +6,8 @@
|
||||
# \___/_/\_\ .__/ \__,_|\__|
|
||||
# |_| XML parser
|
||||
#
|
||||
# Copyright (c) 2017 Sebastian Pipping <[email protected]>
|
||||
# Copyright (c) 2020 Jeffrey Walton <[email protected]>
|
||||
# Copyright (c) 2017-2022 Sebastian Pipping <[email protected]>
|
||||
# Copyright (c) 2020 Jeffrey Walton <[email protected]>
|
||||
# Licensed under the MIT license:
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
@@ -31,7 +31,10 @@
|
||||
|
||||
AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(srcdir)/../lib
|
||||
|
||||
noinst_PROGRAMS = elements outline
|
||||
noinst_PROGRAMS = element_declarations elements outline
|
||||
|
||||
element_declarations_SOURCES = element_declarations.c
|
||||
element_declarations_LDADD = ../lib/libexpat.la
|
||||
|
||||
elements_SOURCES = elements.c
|
||||
elements_LDADD = ../lib/libexpat.la
|
||||
|
||||
@@ -22,8 +22,8 @@
|
||||
# \___/_/\_\ .__/ \__,_|\__|
|
||||
# |_| XML parser
|
||||
#
|
||||
# Copyright (c) 2017 Sebastian Pipping <[email protected]>
|
||||
# Copyright (c) 2020 Jeffrey Walton <[email protected]>
|
||||
# Copyright (c) 2017-2022 Sebastian Pipping <[email protected]>
|
||||
# Copyright (c) 2020 Jeffrey Walton <[email protected]>
|
||||
# Licensed under the MIT license:
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
@@ -119,7 +119,8 @@ PRE_UNINSTALL = :
|
||||
POST_UNINSTALL = :
|
||||
build_triplet = @build@
|
||||
host_triplet = @host@
|
||||
noinst_PROGRAMS = elements$(EXEEXT) outline$(EXEEXT)
|
||||
noinst_PROGRAMS = element_declarations$(EXEEXT) elements$(EXEEXT) \
|
||||
outline$(EXEEXT)
|
||||
subdir = examples
|
||||
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
||||
am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
|
||||
@@ -133,6 +134,8 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
|
||||
$(top_srcdir)/conftools/ax-append-compile-flags.m4 \
|
||||
$(top_srcdir)/conftools/ax-append-link-flags.m4 \
|
||||
$(top_srcdir)/conftools/expatcfg-compiler-supports-visibility.m4 \
|
||||
$(top_srcdir)/conftools/ax-cxx-compile-stdcxx.m4 \
|
||||
$(top_srcdir)/conftools/ax-cxx-compile-stdcxx-11.m4 \
|
||||
$(top_srcdir)/configure.ac
|
||||
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
||||
$(ACLOCAL_M4)
|
||||
@@ -142,13 +145,16 @@ CONFIG_HEADER = $(top_builddir)/expat_config.h
|
||||
CONFIG_CLEAN_FILES =
|
||||
CONFIG_CLEAN_VPATH_FILES =
|
||||
PROGRAMS = $(noinst_PROGRAMS)
|
||||
am_elements_OBJECTS = elements.$(OBJEXT)
|
||||
elements_OBJECTS = $(am_elements_OBJECTS)
|
||||
elements_DEPENDENCIES = ../lib/libexpat.la
|
||||
am_element_declarations_OBJECTS = element_declarations.$(OBJEXT)
|
||||
element_declarations_OBJECTS = $(am_element_declarations_OBJECTS)
|
||||
element_declarations_DEPENDENCIES = ../lib/libexpat.la
|
||||
AM_V_lt = $(am__v_lt_@AM_V@)
|
||||
am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
|
||||
am__v_lt_0 = --silent
|
||||
am__v_lt_1 =
|
||||
am_elements_OBJECTS = elements.$(OBJEXT)
|
||||
elements_OBJECTS = $(am_elements_OBJECTS)
|
||||
elements_DEPENDENCIES = ../lib/libexpat.la
|
||||
am_outline_OBJECTS = outline.$(OBJEXT)
|
||||
outline_OBJECTS = $(am_outline_OBJECTS)
|
||||
outline_DEPENDENCIES = ../lib/libexpat.la
|
||||
@@ -167,7 +173,8 @@ am__v_at_1 =
|
||||
DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
|
||||
depcomp = $(SHELL) $(top_srcdir)/conftools/depcomp
|
||||
am__maybe_remake_depfiles = depfiles
|
||||
am__depfiles_remade = ./$(DEPDIR)/elements.Po ./$(DEPDIR)/outline.Po
|
||||
am__depfiles_remade = ./$(DEPDIR)/element_declarations.Po \
|
||||
./$(DEPDIR)/elements.Po ./$(DEPDIR)/outline.Po
|
||||
am__mv = mv -f
|
||||
COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
|
||||
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
|
||||
@@ -187,8 +194,10 @@ AM_V_CCLD = $(am__v_CCLD_@AM_V@)
|
||||
am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
|
||||
am__v_CCLD_0 = @echo " CCLD " $@;
|
||||
am__v_CCLD_1 =
|
||||
SOURCES = $(elements_SOURCES) $(outline_SOURCES)
|
||||
DIST_SOURCES = $(elements_SOURCES) $(outline_SOURCES)
|
||||
SOURCES = $(element_declarations_SOURCES) $(elements_SOURCES) \
|
||||
$(outline_SOURCES)
|
||||
DIST_SOURCES = $(element_declarations_SOURCES) $(elements_SOURCES) \
|
||||
$(outline_SOURCES)
|
||||
am__can_run_installinfo = \
|
||||
case $$AM_UPDATE_INFO_DIR in \
|
||||
n|no|NO) false;; \
|
||||
@@ -262,6 +271,7 @@ FGREP = @FGREP@
|
||||
FILECMD = @FILECMD@
|
||||
FILEMAP = @FILEMAP@
|
||||
GREP = @GREP@
|
||||
HAVE_CXX11 = @HAVE_CXX11@
|
||||
INSTALL = @INSTALL@
|
||||
INSTALL_DATA = @INSTALL_DATA@
|
||||
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
||||
@@ -281,6 +291,7 @@ LIPO = @LIPO@
|
||||
LN_S = @LN_S@
|
||||
LTLIBOBJS = @LTLIBOBJS@
|
||||
LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
|
||||
MAINT = @MAINT@
|
||||
MAKEINFO = @MAKEINFO@
|
||||
MANIFEST_TOOL = @MANIFEST_TOOL@
|
||||
MKDIR_P = @MKDIR_P@
|
||||
@@ -362,6 +373,8 @@ target_alias = @target_alias@
|
||||
top_build_prefix = @top_build_prefix@
|
||||
top_builddir = @top_builddir@
|
||||
top_srcdir = @top_srcdir@
|
||||
element_declarations_SOURCES = element_declarations.c
|
||||
element_declarations_LDADD = ../lib/libexpat.la
|
||||
elements_SOURCES = elements.c
|
||||
elements_LDADD = ../lib/libexpat.la
|
||||
outline_SOURCES = outline.c
|
||||
@@ -370,7 +383,7 @@ all: all-am
|
||||
|
||||
.SUFFIXES:
|
||||
.SUFFIXES: .c .lo .o .obj
|
||||
$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
|
||||
$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
|
||||
@for dep in $?; do \
|
||||
case '$(am__configure_deps)' in \
|
||||
*$$dep*) \
|
||||
@@ -394,9 +407,9 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
||||
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
|
||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||
|
||||
$(top_srcdir)/configure: $(am__configure_deps)
|
||||
$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
|
||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||
$(ACLOCAL_M4): $(am__aclocal_m4_deps)
|
||||
$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
|
||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||
$(am__aclocal_m4_deps):
|
||||
|
||||
@@ -409,6 +422,10 @@ clean-noinstPROGRAMS:
|
||||
echo " rm -f" $$list; \
|
||||
rm -f $$list
|
||||
|
||||
element_declarations$(EXEEXT): $(element_declarations_OBJECTS) $(element_declarations_DEPENDENCIES) $(EXTRA_element_declarations_DEPENDENCIES)
|
||||
@rm -f element_declarations$(EXEEXT)
|
||||
$(AM_V_CCLD)$(LINK) $(element_declarations_OBJECTS) $(element_declarations_LDADD) $(LIBS)
|
||||
|
||||
elements$(EXEEXT): $(elements_OBJECTS) $(elements_DEPENDENCIES) $(EXTRA_elements_DEPENDENCIES)
|
||||
@rm -f elements$(EXEEXT)
|
||||
$(AM_V_CCLD)$(LINK) $(elements_OBJECTS) $(elements_LDADD) $(LIBS)
|
||||
@@ -423,6 +440,7 @@ mostlyclean-compile:
|
||||
distclean-compile:
|
||||
-rm -f *.tab.c
|
||||
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/element_declarations.Po@am__quote@ # am--include-marker
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elements.Po@am__quote@ # am--include-marker
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/outline.Po@am__quote@ # am--include-marker
|
||||
|
||||
@@ -583,7 +601,8 @@ clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \
|
||||
mostlyclean-am
|
||||
|
||||
distclean: distclean-am
|
||||
-rm -f ./$(DEPDIR)/elements.Po
|
||||
-rm -f ./$(DEPDIR)/element_declarations.Po
|
||||
-rm -f ./$(DEPDIR)/elements.Po
|
||||
-rm -f ./$(DEPDIR)/outline.Po
|
||||
-rm -f Makefile
|
||||
distclean-am: clean-am distclean-compile distclean-generic \
|
||||
@@ -630,7 +649,8 @@ install-ps-am:
|
||||
installcheck-am:
|
||||
|
||||
maintainer-clean: maintainer-clean-am
|
||||
-rm -f ./$(DEPDIR)/elements.Po
|
||||
-rm -f ./$(DEPDIR)/element_declarations.Po
|
||||
-rm -f ./$(DEPDIR)/elements.Po
|
||||
-rm -f ./$(DEPDIR)/outline.Po
|
||||
-rm -f Makefile
|
||||
maintainer-clean-am: distclean-am maintainer-clean-generic
|
||||
|
||||
@@ -0,0 +1,234 @@
|
||||
/* Read an XML document from standard input and print
|
||||
element declarations (if any) to standard output.
|
||||
It must be used with Expat compiled for UTF-8 output.
|
||||
__ __ _
|
||||
___\ \/ /_ __ __ _| |_
|
||||
/ _ \\ /| '_ \ / _` | __|
|
||||
| __// \| |_) | (_| | |_
|
||||
\___/_/\_\ .__/ \__,_|\__|
|
||||
|_| XML parser
|
||||
|
||||
Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
|
||||
Copyright (c) 2001-2003 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
|
||||
Copyright (c) 2004-2006 Karl Waclawek <karl@waclawek.net>
|
||||
Copyright (c) 2005-2007 Steven Solie <steven@solie.ca>
|
||||
Copyright (c) 2016-2024 Sebastian Pipping <sebastian@pipping.org>
|
||||
Copyright (c) 2017 Rhodri James <rhodri@wildebeest.org.uk>
|
||||
Copyright (c) 2019 Zhongyuan Zhou <zhouzhongyuan@huawei.com>
|
||||
Licensed under the MIT license:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
persons to whom the Software is furnished to do so, subject to the
|
||||
following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included
|
||||
in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
||||
NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||
USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <expat.h>
|
||||
|
||||
#ifdef XML_LARGE_SIZE
|
||||
# define XML_FMT_INT_MOD "ll"
|
||||
#else
|
||||
# define XML_FMT_INT_MOD "l"
|
||||
#endif
|
||||
|
||||
#ifdef XML_UNICODE_WCHAR_T
|
||||
# define XML_FMT_STR "ls"
|
||||
#else
|
||||
# define XML_FMT_STR "s"
|
||||
#endif
|
||||
|
||||
// While traversing the XML_Content tree, we avoid recursion
|
||||
// to not be vulnerable to a denial of service attack.
|
||||
typedef struct StackStruct {
|
||||
const XML_Content *model;
|
||||
unsigned level;
|
||||
struct StackStruct *prev;
|
||||
} Stack;
|
||||
|
||||
static Stack *
|
||||
stackPushMalloc(Stack *stackTop, const XML_Content *model, unsigned level) {
|
||||
Stack *const newStackTop = malloc(sizeof(Stack));
|
||||
if (! newStackTop) {
|
||||
return NULL;
|
||||
}
|
||||
newStackTop->model = model;
|
||||
newStackTop->level = level;
|
||||
newStackTop->prev = stackTop;
|
||||
return newStackTop;
|
||||
}
|
||||
|
||||
static Stack *
|
||||
stackPopFree(Stack *stackTop) {
|
||||
Stack *const newStackTop = stackTop->prev;
|
||||
free(stackTop);
|
||||
return newStackTop;
|
||||
}
|
||||
|
||||
static char *
|
||||
contentTypeName(enum XML_Content_Type contentType) {
|
||||
switch (contentType) {
|
||||
case XML_CTYPE_EMPTY:
|
||||
return "EMPTY";
|
||||
case XML_CTYPE_ANY:
|
||||
return "ANY";
|
||||
case XML_CTYPE_MIXED:
|
||||
return "MIXED";
|
||||
case XML_CTYPE_NAME:
|
||||
return "NAME";
|
||||
case XML_CTYPE_CHOICE:
|
||||
return "CHOICE";
|
||||
case XML_CTYPE_SEQ:
|
||||
return "SEQ";
|
||||
default:
|
||||
return "???";
|
||||
}
|
||||
}
|
||||
|
||||
static char *
|
||||
contentQuantName(enum XML_Content_Quant contentQuant) {
|
||||
switch (contentQuant) {
|
||||
case XML_CQUANT_NONE:
|
||||
return "NONE";
|
||||
case XML_CQUANT_OPT:
|
||||
return "OPT";
|
||||
case XML_CQUANT_REP:
|
||||
return "REP";
|
||||
case XML_CQUANT_PLUS:
|
||||
return "PLUS";
|
||||
default:
|
||||
return "???";
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
dumpContentModelElement(const XML_Content *model, unsigned level,
|
||||
const XML_Content *root) {
|
||||
// Indent
|
||||
unsigned u = 0;
|
||||
for (; u < level; u++) {
|
||||
printf(" ");
|
||||
}
|
||||
|
||||
// Node
|
||||
printf("[%u] type=%s(%d), quant=%s(%d)", (unsigned)(model - root),
|
||||
contentTypeName(model->type), model->type,
|
||||
contentQuantName(model->quant), model->quant);
|
||||
if (model->name) {
|
||||
printf(", name=\"%" XML_FMT_STR "\"", model->name);
|
||||
} else {
|
||||
printf(", name=NULL");
|
||||
}
|
||||
printf(", numchildren=%d", model->numchildren);
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
static bool
|
||||
dumpContentModel(const XML_Char *name, const XML_Content *root) {
|
||||
printf("Element \"%" XML_FMT_STR "\":\n", name);
|
||||
Stack *stackTop = stackPushMalloc(NULL, root, 1);
|
||||
if (! stackTop) {
|
||||
return false;
|
||||
}
|
||||
|
||||
while (stackTop) {
|
||||
const XML_Content *const model = stackTop->model;
|
||||
const unsigned level = stackTop->level;
|
||||
|
||||
dumpContentModelElement(model, level, root);
|
||||
|
||||
stackTop = stackPopFree(stackTop);
|
||||
|
||||
for (size_t u = model->numchildren; u >= 1; u--) {
|
||||
Stack *const newStackTop
|
||||
= stackPushMalloc(stackTop, model->children + (u - 1), level + 1);
|
||||
if (! newStackTop) {
|
||||
// We ran out of memory, so let's free all memory allocated
|
||||
// earlier in this function, to be leak-clean:
|
||||
while (stackTop != NULL) {
|
||||
stackTop = stackPopFree(stackTop);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
stackTop = newStackTop;
|
||||
}
|
||||
}
|
||||
|
||||
printf("\n");
|
||||
return true;
|
||||
}
|
||||
|
||||
static void XMLCALL
|
||||
handleElementDeclaration(void *userData, const XML_Char *name,
|
||||
XML_Content *model) {
|
||||
XML_Parser parser = (XML_Parser)userData;
|
||||
const bool success = dumpContentModel(name, model);
|
||||
XML_FreeContentModel(parser, model);
|
||||
if (! success) {
|
||||
XML_StopParser(parser, /* resumable= */ XML_FALSE);
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
main(void) {
|
||||
XML_Parser parser = XML_ParserCreate(NULL);
|
||||
int done;
|
||||
|
||||
if (! parser) {
|
||||
fprintf(stderr, "Couldn't allocate memory for parser\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
XML_SetUserData(parser, parser);
|
||||
XML_SetElementDeclHandler(parser, handleElementDeclaration);
|
||||
|
||||
do {
|
||||
void *const buf = XML_GetBuffer(parser, BUFSIZ);
|
||||
if (! buf) {
|
||||
fprintf(stderr, "Couldn't allocate memory for buffer\n");
|
||||
XML_ParserFree(parser);
|
||||
return 1;
|
||||
}
|
||||
|
||||
const size_t len = fread(buf, 1, BUFSIZ, stdin);
|
||||
|
||||
if (ferror(stdin)) {
|
||||
fprintf(stderr, "Read error\n");
|
||||
XML_ParserFree(parser);
|
||||
return 1;
|
||||
}
|
||||
|
||||
done = feof(stdin);
|
||||
|
||||
if (XML_ParseBuffer(parser, (int)len, done) == XML_STATUS_ERROR) {
|
||||
enum XML_Error errorCode = XML_GetErrorCode(parser);
|
||||
if (errorCode == XML_ERROR_ABORTED) {
|
||||
errorCode = XML_ERROR_NO_MEMORY;
|
||||
}
|
||||
fprintf(stderr,
|
||||
"Parse error at line %" XML_FMT_INT_MOD "u:\n%" XML_FMT_STR "\n",
|
||||
XML_GetCurrentLineNumber(parser), XML_ErrorString(errorCode));
|
||||
XML_ParserFree(parser);
|
||||
return 1;
|
||||
}
|
||||
} while (! done);
|
||||
|
||||
XML_ParserFree(parser);
|
||||
return 0;
|
||||
}
|
||||
@@ -15,6 +15,9 @@
|
||||
/* Define to 1 if you have the `arc4random_buf' function. */
|
||||
#undef HAVE_ARC4RANDOM_BUF
|
||||
|
||||
/* define if the compiler supports basic C++11 syntax */
|
||||
#undef HAVE_CXX11
|
||||
|
||||
/* Define to 1 if you have the <dlfcn.h> header file. */
|
||||
#undef HAVE_DLFCN_H
|
||||
|
||||
@@ -115,7 +118,7 @@
|
||||
#undef XML_ATTR_INFO
|
||||
|
||||
/* Define to specify how much context to retain around the current parse
|
||||
point. */
|
||||
point, 0 to disable. */
|
||||
#undef XML_CONTEXT_BYTES
|
||||
|
||||
/* Define to include code reading entropy from `/dev/urandom'. */
|
||||
@@ -124,6 +127,9 @@
|
||||
/* Define to make parameter entity parsing functionality available. */
|
||||
#undef XML_DTD
|
||||
|
||||
/* Define as 1/0 to enable/disable support for general entities. */
|
||||
#undef XML_GE
|
||||
|
||||
/* Define to make XML Namespaces functionality available. */
|
||||
#undef XML_NS
|
||||
|
||||
|
||||
@@ -47,18 +47,59 @@ end(void *userData, const XML_Char *name) {
|
||||
(void)name;
|
||||
}
|
||||
|
||||
int
|
||||
LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
|
||||
XML_Parser p = XML_ParserCreate(xstr(ENCODING_FOR_FUZZING));
|
||||
assert(p);
|
||||
static void XMLCALL
|
||||
may_stop_character_handler(void *userData, const XML_Char *s, int len) {
|
||||
XML_Parser parser = (XML_Parser)userData;
|
||||
if (len > 1 && s[0] == 's') {
|
||||
XML_StopParser(parser, s[1] == 'r' ? XML_FALSE : XML_TRUE);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
ParseOneInput(XML_Parser p, const uint8_t *data, size_t size) {
|
||||
// Set the hash salt using siphash to generate a deterministic hash.
|
||||
struct sipkey *key = sip_keyof(hash_key);
|
||||
XML_SetHashSalt(p, (unsigned long)siphash24(data, size, key));
|
||||
(void)sip24_valid;
|
||||
|
||||
XML_SetUserData(p, p);
|
||||
XML_SetElementHandler(p, start, end);
|
||||
XML_SetCharacterDataHandler(p, may_stop_character_handler);
|
||||
XML_Parse(p, (const XML_Char *)data, size, 0);
|
||||
XML_Parse(p, (const XML_Char *)data, size, 1);
|
||||
XML_ParserFree(p);
|
||||
if (XML_Parse(p, (const XML_Char *)data, size, 1) == XML_STATUS_ERROR) {
|
||||
XML_ErrorString(XML_GetErrorCode(p));
|
||||
}
|
||||
XML_GetCurrentLineNumber(p);
|
||||
if (size % 2) {
|
||||
XML_ParserReset(p, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
|
||||
XML_Parser parentParser = XML_ParserCreate(xstr(ENCODING_FOR_FUZZING));
|
||||
assert(parentParser);
|
||||
ParseOneInput(parentParser, data, size);
|
||||
// not freed yet, but used later and freed then
|
||||
|
||||
XML_Parser namespaceParser = XML_ParserCreateNS(NULL, '!');
|
||||
assert(namespaceParser);
|
||||
ParseOneInput(namespaceParser, data, size);
|
||||
XML_ParserFree(namespaceParser);
|
||||
|
||||
XML_Parser externalEntityParser
|
||||
= XML_ExternalEntityParserCreate(parentParser, "e1", NULL);
|
||||
assert(externalEntityParser);
|
||||
ParseOneInput(externalEntityParser, data, size);
|
||||
XML_ParserFree(externalEntityParser);
|
||||
|
||||
XML_Parser externalDtdParser
|
||||
= XML_ExternalEntityParserCreate(parentParser, NULL, NULL);
|
||||
assert(externalDtdParser);
|
||||
ParseOneInput(externalDtdParser, data, size);
|
||||
XML_ParserFree(externalDtdParser);
|
||||
|
||||
// finally frees this parser which served as parent
|
||||
XML_ParserFree(parentParser);
|
||||
return 0;
|
||||
}
|
||||
@@ -48,24 +48,70 @@ end(void *userData, const XML_Char *name) {
|
||||
(void)name;
|
||||
}
|
||||
|
||||
static void XMLCALL
|
||||
may_stop_character_handler(void *userData, const XML_Char *s, int len) {
|
||||
XML_Parser parser = (XML_Parser)userData;
|
||||
if (len > 1 && s[0] == 's') {
|
||||
XML_StopParser(parser, s[1] == 'r' ? XML_FALSE : XML_TRUE);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
ParseOneInput(XML_Parser p, const uint8_t *data, size_t size) {
|
||||
// Set the hash salt using siphash to generate a deterministic hash.
|
||||
struct sipkey *key = sip_keyof(hash_key);
|
||||
XML_SetHashSalt(p, (unsigned long)siphash24(data, size, key));
|
||||
(void)sip24_valid;
|
||||
|
||||
XML_SetUserData(p, p);
|
||||
XML_SetElementHandler(p, start, end);
|
||||
XML_SetCharacterDataHandler(p, may_stop_character_handler);
|
||||
void *buf = XML_GetBuffer(p, size);
|
||||
assert(buf);
|
||||
memcpy(buf, data, size);
|
||||
XML_ParseBuffer(p, size, 0);
|
||||
buf = XML_GetBuffer(p, size);
|
||||
if (buf == NULL) {
|
||||
return;
|
||||
}
|
||||
memcpy(buf, data, size);
|
||||
if (XML_ParseBuffer(p, size, 1) == XML_STATUS_ERROR) {
|
||||
XML_ErrorString(XML_GetErrorCode(p));
|
||||
}
|
||||
XML_GetCurrentLineNumber(p);
|
||||
if (size % 2) {
|
||||
XML_ParserReset(p, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
|
||||
if (size == 0)
|
||||
return 0;
|
||||
|
||||
XML_Parser p = XML_ParserCreate(xstr(ENCODING_FOR_FUZZING));
|
||||
assert(p);
|
||||
XML_SetElementHandler(p, start, end);
|
||||
XML_Parser parentParser = XML_ParserCreate(xstr(ENCODING_FOR_FUZZING));
|
||||
assert(parentParser);
|
||||
ParseOneInput(parentParser, data, size);
|
||||
// not freed yet, but used later and freed then
|
||||
|
||||
// Set the hash salt using siphash to generate a deterministic hash.
|
||||
struct sipkey *key = sip_keyof(hash_key);
|
||||
XML_SetHashSalt(p, (unsigned long)siphash24(data, size, key));
|
||||
XML_Parser namespaceParser = XML_ParserCreateNS(NULL, '!');
|
||||
assert(namespaceParser);
|
||||
ParseOneInput(namespaceParser, data, size);
|
||||
XML_ParserFree(namespaceParser);
|
||||
|
||||
void *buf = XML_GetBuffer(p, size);
|
||||
assert(buf);
|
||||
XML_Parser externalEntityParser
|
||||
= XML_ExternalEntityParserCreate(parentParser, "e1", NULL);
|
||||
assert(externalEntityParser);
|
||||
ParseOneInput(externalEntityParser, data, size);
|
||||
XML_ParserFree(externalEntityParser);
|
||||
|
||||
memcpy(buf, data, size);
|
||||
XML_ParseBuffer(p, size, size == 0);
|
||||
XML_ParserFree(p);
|
||||
XML_Parser externalDtdParser
|
||||
= XML_ExternalEntityParserCreate(parentParser, NULL, NULL);
|
||||
assert(externalDtdParser);
|
||||
ParseOneInput(externalDtdParser, data, size);
|
||||
XML_ParserFree(externalDtdParser);
|
||||
|
||||
// finally frees this parser which served as parent
|
||||
XML_ParserFree(parentParser);
|
||||
return 0;
|
||||
}
|
||||
@@ -135,6 +135,8 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
|
||||
$(top_srcdir)/conftools/ax-append-compile-flags.m4 \
|
||||
$(top_srcdir)/conftools/ax-append-link-flags.m4 \
|
||||
$(top_srcdir)/conftools/expatcfg-compiler-supports-visibility.m4 \
|
||||
$(top_srcdir)/conftools/ax-cxx-compile-stdcxx.m4 \
|
||||
$(top_srcdir)/conftools/ax-cxx-compile-stdcxx-11.m4 \
|
||||
$(top_srcdir)/configure.ac
|
||||
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
||||
$(ACLOCAL_M4)
|
||||
@@ -300,6 +302,7 @@ FGREP = @FGREP@
|
||||
FILECMD = @FILECMD@
|
||||
FILEMAP = @FILEMAP@
|
||||
GREP = @GREP@
|
||||
HAVE_CXX11 = @HAVE_CXX11@
|
||||
INSTALL = @INSTALL@
|
||||
INSTALL_DATA = @INSTALL_DATA@
|
||||
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
||||
@@ -319,6 +322,7 @@ LIPO = @LIPO@
|
||||
LN_S = @LN_S@
|
||||
LTLIBOBJS = @LTLIBOBJS@
|
||||
LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
|
||||
MAINT = @MAINT@
|
||||
MAKEINFO = @MAKEINFO@
|
||||
MANIFEST_TOOL = @MANIFEST_TOOL@
|
||||
MKDIR_P = @MKDIR_P@
|
||||
@@ -451,7 +455,7 @@ all: all-am
|
||||
|
||||
.SUFFIXES:
|
||||
.SUFFIXES: .c .lo .o .obj
|
||||
$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
|
||||
$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
|
||||
@for dep in $?; do \
|
||||
case '$(am__configure_deps)' in \
|
||||
*$$dep*) \
|
||||
@@ -475,9 +479,9 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
||||
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
|
||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||
|
||||
$(top_srcdir)/configure: $(am__configure_deps)
|
||||
$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
|
||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||
$(ACLOCAL_M4): $(am__aclocal_m4_deps)
|
||||
$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
|
||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||
$(am__aclocal_m4_deps):
|
||||
|
||||
|
||||
@@ -11,11 +11,13 @@
|
||||
Copyright (c) 2000-2005 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
|
||||
Copyright (c) 2001-2002 Greg Stein <gstein@users.sourceforge.net>
|
||||
Copyright (c) 2002-2016 Karl Waclawek <karl@waclawek.net>
|
||||
Copyright (c) 2016-2022 Sebastian Pipping <sebastian@pipping.org>
|
||||
Copyright (c) 2016-2024 Sebastian Pipping <sebastian@pipping.org>
|
||||
Copyright (c) 2016 Cristian Rodríguez <crrodriguez@opensuse.org>
|
||||
Copyright (c) 2016 Thomas Beutlich <tc@tbeu.de>
|
||||
Copyright (c) 2017 Rhodri James <rhodri@wildebeest.org.uk>
|
||||
Copyright (c) 2022 Thijs Schreijer <thijs@thijsschreijer.nl>
|
||||
Copyright (c) 2023 Hanno Böck <hanno@gentoo.org>
|
||||
Copyright (c) 2023 Sony Corporation / Snild Dolkow <snild@sony.com>
|
||||
Licensed under the MIT license:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
@@ -269,7 +271,7 @@ XML_ParserCreate_MM(const XML_Char *encoding,
|
||||
const XML_Memory_Handling_Suite *memsuite,
|
||||
const XML_Char *namespaceSeparator);
|
||||
|
||||
/* Prepare a parser object to be re-used. This is particularly
|
||||
/* Prepare a parser object to be reused. This is particularly
|
||||
valuable when memory allocation overhead is disproportionately high,
|
||||
such as when a large number of small documnents need to be parsed.
|
||||
All handlers are cleared from the parser, except for the
|
||||
@@ -951,7 +953,7 @@ XMLPARSEAPI(XML_Index) XML_GetCurrentByteIndex(XML_Parser parser);
|
||||
XMLPARSEAPI(int)
|
||||
XML_GetCurrentByteCount(XML_Parser parser);
|
||||
|
||||
/* If XML_CONTEXT_BYTES is defined, returns the input buffer, sets
|
||||
/* If XML_CONTEXT_BYTES is >=1, returns the input buffer, sets
|
||||
the integer pointed to by offset to the offset within this buffer
|
||||
of the current parse position, and sets the integer pointed to by size
|
||||
to the size of this buffer (the number of input bytes). Otherwise
|
||||
@@ -1025,7 +1027,9 @@ enum XML_FeatureEnum {
|
||||
XML_FEATURE_ATTR_INFO,
|
||||
/* Added in Expat 2.4.0. */
|
||||
XML_FEATURE_BILLION_LAUGHS_ATTACK_PROTECTION_MAXIMUM_AMPLIFICATION_DEFAULT,
|
||||
XML_FEATURE_BILLION_LAUGHS_ATTACK_PROTECTION_ACTIVATION_THRESHOLD_DEFAULT
|
||||
XML_FEATURE_BILLION_LAUGHS_ATTACK_PROTECTION_ACTIVATION_THRESHOLD_DEFAULT,
|
||||
/* Added in Expat 2.6.0. */
|
||||
XML_FEATURE_GE
|
||||
/* Additional features must be added to the end of this enum. */
|
||||
};
|
||||
|
||||
@@ -1038,23 +1042,29 @@ typedef struct {
|
||||
XMLPARSEAPI(const XML_Feature *)
|
||||
XML_GetFeatureList(void);
|
||||
|
||||
#ifdef XML_DTD
|
||||
/* Added in Expat 2.4.0. */
|
||||
#if XML_GE == 1
|
||||
/* Added in Expat 2.4.0 for XML_DTD defined and
|
||||
* added in Expat 2.6.0 for XML_GE == 1. */
|
||||
XMLPARSEAPI(XML_Bool)
|
||||
XML_SetBillionLaughsAttackProtectionMaximumAmplification(
|
||||
XML_Parser parser, float maximumAmplificationFactor);
|
||||
|
||||
/* Added in Expat 2.4.0. */
|
||||
/* Added in Expat 2.4.0 for XML_DTD defined and
|
||||
* added in Expat 2.6.0 for XML_GE == 1. */
|
||||
XMLPARSEAPI(XML_Bool)
|
||||
XML_SetBillionLaughsAttackProtectionActivationThreshold(
|
||||
XML_Parser parser, unsigned long long activationThresholdBytes);
|
||||
#endif
|
||||
|
||||
/* Added in Expat 2.6.0. */
|
||||
XMLPARSEAPI(XML_Bool)
|
||||
XML_SetReparseDeferralEnabled(XML_Parser parser, XML_Bool enabled);
|
||||
|
||||
/* Expat follows the semantic versioning convention.
|
||||
See http://semver.org.
|
||||
See https://semver.org
|
||||
*/
|
||||
#define XML_MAJOR_VERSION 2
|
||||
#define XML_MINOR_VERSION 5
|
||||
#define XML_MINOR_VERSION 6
|
||||
#define XML_MICRO_VERSION 0
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
@@ -28,9 +28,10 @@
|
||||
Copyright (c) 2002-2003 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
|
||||
Copyright (c) 2002-2006 Karl Waclawek <karl@waclawek.net>
|
||||
Copyright (c) 2003 Greg Stein <gstein@users.sourceforge.net>
|
||||
Copyright (c) 2016-2022 Sebastian Pipping <sebastian@pipping.org>
|
||||
Copyright (c) 2016-2023 Sebastian Pipping <sebastian@pipping.org>
|
||||
Copyright (c) 2018 Yury Gribov <tetra2005@gmail.com>
|
||||
Copyright (c) 2019 David Loffredo <loffredo@steptools.com>
|
||||
Copyright (c) 2023 Sony Corporation / Snild Dolkow <snild@sony.com>
|
||||
Licensed under the MIT license:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
@@ -154,12 +155,15 @@ extern "C" {
|
||||
void _INTERNAL_trim_to_complete_utf8_characters(const char *from,
|
||||
const char **fromLimRef);
|
||||
|
||||
#if defined(XML_DTD)
|
||||
#if XML_GE == 1
|
||||
unsigned long long testingAccountingGetCountBytesDirect(XML_Parser parser);
|
||||
unsigned long long testingAccountingGetCountBytesIndirect(XML_Parser parser);
|
||||
const char *unsignedCharToPrintable(unsigned char c);
|
||||
#endif
|
||||
|
||||
extern XML_Bool g_reparseDeferralEnabledDefault; // written ONLY in runtests.c
|
||||
extern unsigned int g_parseAttempts; // used for testing only
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
@@ -106,7 +106,7 @@
|
||||
* if this code is included and compiled as C++; related GCC warning is:
|
||||
* warning: use of C++11 long long integer constant [-Wlong-long]
|
||||
*/
|
||||
#define _SIP_ULL(high, low) ((((uint64_t)high) << 32) | (low))
|
||||
#define SIP_ULL(high, low) ((((uint64_t)high) << 32) | (low))
|
||||
|
||||
#define SIP_ROTL(x, b) (uint64_t)(((x) << (b)) | ((x) >> (64 - (b))))
|
||||
|
||||
@@ -190,10 +190,10 @@ sip_round(struct siphash *H, const int rounds) {
|
||||
|
||||
static struct siphash *
|
||||
sip24_init(struct siphash *H, const struct sipkey *key) {
|
||||
H->v0 = _SIP_ULL(0x736f6d65U, 0x70736575U) ^ key->k[0];
|
||||
H->v1 = _SIP_ULL(0x646f7261U, 0x6e646f6dU) ^ key->k[1];
|
||||
H->v2 = _SIP_ULL(0x6c796765U, 0x6e657261U) ^ key->k[0];
|
||||
H->v3 = _SIP_ULL(0x74656462U, 0x79746573U) ^ key->k[1];
|
||||
H->v0 = SIP_ULL(0x736f6d65U, 0x70736575U) ^ key->k[0];
|
||||
H->v1 = SIP_ULL(0x646f7261U, 0x6e646f6dU) ^ key->k[1];
|
||||
H->v2 = SIP_ULL(0x6c796765U, 0x6e657261U) ^ key->k[0];
|
||||
H->v3 = SIP_ULL(0x74656462U, 0x79746573U) ^ key->k[1];
|
||||
|
||||
H->p = H->buf;
|
||||
H->c = 0;
|
||||
|
||||
+341
-217
File diff suppressed because it is too large.
Load diff
@@ -12,10 +12,10 @@
|
||||
Copyright (c) 2002-2006 Karl Waclawek <karl@waclawek.net>
|
||||
Copyright (c) 2002-2003 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
|
||||
Copyright (c) 2005-2009 Steven Solie <steven@solie.ca>
|
||||
Copyright (c) 2016-2021 Sebastian Pipping <sebastian@pipping.org>
|
||||
Copyright (c) 2016-2023 Sebastian Pipping <sebastian@pipping.org>
|
||||
Copyright (c) 2017 Rhodri James <rhodri@wildebeest.org.uk>
|
||||
Copyright (c) 2019 David Loffredo <loffredo@steptools.com>
|
||||
Copyright (c) 2021 Dong-hee Na <donghee.na@python.org>
|
||||
Copyright (c) 2021 Donghee Na <donghee.na@python.org>
|
||||
Licensed under the MIT license:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
@@ -38,7 +38,7 @@
|
||||
USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <expat_config.h>
|
||||
#include "expat_config.h"
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
Copyright (c) 2000 Clark Cooper <coopercc@users.sourceforge.net>
|
||||
Copyright (c) 2002 Karl Waclawek <karl@waclawek.net>
|
||||
Copyright (c) 2002 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
|
||||
Copyright (c) 2017 Sebastian Pipping <sebastian@pipping.org>
|
||||
Copyright (c) 2017-2024 Sebastian Pipping <sebastian@pipping.org>
|
||||
Licensed under the MIT license:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
@@ -127,9 +127,9 @@ typedef struct prolog_state {
|
||||
#endif /* XML_DTD */
|
||||
} PROLOG_STATE;
|
||||
|
||||
void XmlPrologStateInit(PROLOG_STATE *);
|
||||
void XmlPrologStateInit(PROLOG_STATE *state);
|
||||
#ifdef XML_DTD
|
||||
void XmlPrologStateInitExternalEntity(PROLOG_STATE *);
|
||||
void XmlPrologStateInitExternalEntity(PROLOG_STATE *state);
|
||||
#endif /* XML_DTD */
|
||||
|
||||
#define XmlTokenRole(state, tok, ptr, end, enc) \
|
||||
|
||||
+12
-17
@@ -12,7 +12,7 @@
|
||||
Copyright (c) 2002 Greg Stein <gstein@users.sourceforge.net>
|
||||
Copyright (c) 2002-2016 Karl Waclawek <karl@waclawek.net>
|
||||
Copyright (c) 2005-2009 Steven Solie <steven@solie.ca>
|
||||
Copyright (c) 2016-2022 Sebastian Pipping <sebastian@pipping.org>
|
||||
Copyright (c) 2016-2024 Sebastian Pipping <sebastian@pipping.org>
|
||||
Copyright (c) 2016 Pascal Cuoq <cuoq@trust-in-soft.com>
|
||||
Copyright (c) 2016 Don Lewis <truckman@apache.org>
|
||||
Copyright (c) 2017 Rhodri James <rhodri@wildebeest.org.uk>
|
||||
@@ -20,8 +20,10 @@
|
||||
Copyright (c) 2017 Benbuck Nason <bnason@netflix.com>
|
||||
Copyright (c) 2017 José Gutiérrez de la Concha <jose@zeroc.com>
|
||||
Copyright (c) 2019 David Loffredo <loffredo@steptools.com>
|
||||
Copyright (c) 2021 Dong-hee Na <donghee.na@python.org>
|
||||
Copyright (c) 2021 Donghee Na <donghee.na@python.org>
|
||||
Copyright (c) 2022 Martin Ettl <ettl.martin78@googlemail.com>
|
||||
Copyright (c) 2022 Sean McBride <sean@rogue-research.com>
|
||||
Copyright (c) 2023 Hanno Böck <hanno@gentoo.org>
|
||||
Licensed under the MIT license:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
@@ -44,7 +46,7 @@
|
||||
USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <expat_config.h>
|
||||
#include "expat_config.h"
|
||||
|
||||
#include <stddef.h>
|
||||
#include <string.h> /* memcpy */
|
||||
@@ -76,7 +78,7 @@
|
||||
#define VTABLE VTABLE1, PREFIX(toUtf8), PREFIX(toUtf16)
|
||||
|
||||
#define UCS2_GET_NAMING(pages, hi, lo) \
|
||||
(namingBitmap[(pages[hi] << 3) + ((lo) >> 5)] & (1u << ((lo)&0x1F)))
|
||||
(namingBitmap[(pages[hi] << 3) + ((lo) >> 5)] & (1u << ((lo) & 0x1F)))
|
||||
|
||||
/* A 2 byte UTF-8 representation splits the characters 11 bits between
|
||||
the bottom 5 and 6 bits of the bytes. We need 8 bits to index into
|
||||
@@ -100,7 +102,7 @@
|
||||
& (1u << (((byte)[2]) & 0x1F)))
|
||||
|
||||
/* Detection of invalid UTF-8 sequences is based on Table 3.1B
|
||||
of Unicode 3.2: http://www.unicode.org/unicode/reports/tr28/
|
||||
of Unicode 3.2: https://www.unicode.org/unicode/reports/tr28/
|
||||
with the additional restriction of not allowing the Unicode
|
||||
code points 0xFFFF and 0xFFFE (sequences EF,BF,BF and EF,BF,BE).
|
||||
Implementation details:
|
||||
@@ -225,7 +227,7 @@ struct normal_encoding {
|
||||
/* isNmstrt2 */ NULL, /* isNmstrt3 */ NULL, /* isNmstrt4 */ NULL, \
|
||||
/* isInvalid2 */ NULL, /* isInvalid3 */ NULL, /* isInvalid4 */ NULL
|
||||
|
||||
static int FASTCALL checkCharRefNumber(int);
|
||||
static int FASTCALL checkCharRefNumber(int result);
|
||||
|
||||
#include "xmltok_impl.h"
|
||||
#include "ascii.h"
|
||||
@@ -243,7 +245,7 @@ static int FASTCALL checkCharRefNumber(int);
|
||||
#endif
|
||||
|
||||
#define SB_BYTE_TYPE(enc, p) \
|
||||
(((struct normal_encoding *)(enc))->type[(unsigned char)*(p)])
|
||||
(((const struct normal_encoding *)(enc))->type[(unsigned char)*(p)])
|
||||
|
||||
#ifdef XML_MIN_SIZE
|
||||
static int PTRFASTCALL
|
||||
@@ -407,7 +409,7 @@ utf8_toUtf16(const ENCODING *enc, const char **fromP, const char *fromLim,
|
||||
unsigned short *to = *toP;
|
||||
const char *from = *fromP;
|
||||
while (from < fromLim && to < toLim) {
|
||||
switch (((struct normal_encoding *)enc)->type[(unsigned char)*from]) {
|
||||
switch (SB_BYTE_TYPE(enc, from)) {
|
||||
case BT_LEAD2:
|
||||
if (fromLim - from < 2) {
|
||||
res = XML_CONVERT_INPUT_INCOMPLETE;
|
||||
@@ -715,31 +717,26 @@ unicode_byte_type(char hi, char lo) {
|
||||
return res; \
|
||||
}
|
||||
|
||||
#define SET2(ptr, ch) (((ptr)[0] = ((ch)&0xff)), ((ptr)[1] = ((ch) >> 8)))
|
||||
#define GET_LO(ptr) ((unsigned char)(ptr)[0])
|
||||
#define GET_HI(ptr) ((unsigned char)(ptr)[1])
|
||||
|
||||
DEFINE_UTF16_TO_UTF8(little2_)
|
||||
DEFINE_UTF16_TO_UTF16(little2_)
|
||||
|
||||
#undef SET2
|
||||
#undef GET_LO
|
||||
#undef GET_HI
|
||||
|
||||
#define SET2(ptr, ch) (((ptr)[0] = ((ch) >> 8)), ((ptr)[1] = ((ch)&0xFF)))
|
||||
#define GET_LO(ptr) ((unsigned char)(ptr)[1])
|
||||
#define GET_HI(ptr) ((unsigned char)(ptr)[0])
|
||||
|
||||
DEFINE_UTF16_TO_UTF8(big2_)
|
||||
DEFINE_UTF16_TO_UTF16(big2_)
|
||||
|
||||
#undef SET2
|
||||
#undef GET_LO
|
||||
#undef GET_HI
|
||||
|
||||
#define LITTLE2_BYTE_TYPE(enc, p) \
|
||||
((p)[1] == 0 ? ((struct normal_encoding *)(enc))->type[(unsigned char)*(p)] \
|
||||
: unicode_byte_type((p)[1], (p)[0]))
|
||||
((p)[1] == 0 ? SB_BYTE_TYPE(enc, p) : unicode_byte_type((p)[1], (p)[0]))
|
||||
#define LITTLE2_BYTE_TO_ASCII(p) ((p)[1] == 0 ? (p)[0] : -1)
|
||||
#define LITTLE2_CHAR_MATCHES(p, c) ((p)[1] == 0 && (p)[0] == (c))
|
||||
#define LITTLE2_IS_NAME_CHAR_MINBPC(p) \
|
||||
@@ -872,9 +869,7 @@ static const struct normal_encoding internal_little2_encoding
|
||||
#endif
|
||||
|
||||
#define BIG2_BYTE_TYPE(enc, p) \
|
||||
((p)[0] == 0 \
|
||||
? ((struct normal_encoding *)(enc))->type[(unsigned char)(p)[1]] \
|
||||
: unicode_byte_type((p)[0], (p)[1]))
|
||||
((p)[0] == 0 ? SB_BYTE_TYPE(enc, p + 1) : unicode_byte_type((p)[0], (p)[1]))
|
||||
#define BIG2_BYTE_TO_ASCII(p) ((p)[0] == 0 ? (p)[1] : -1)
|
||||
#define BIG2_CHAR_MATCHES(p, c) ((p)[0] == 0 && (p)[1] == (c))
|
||||
#define BIG2_IS_NAME_CHAR_MINBPC(p) \
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
Copyright (c) 2000 Clark Cooper <coopercc@users.sourceforge.net>
|
||||
Copyright (c) 2002 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
|
||||
Copyright (c) 2002-2005 Karl Waclawek <karl@waclawek.net>
|
||||
Copyright (c) 2016-2017 Sebastian Pipping <sebastian@pipping.org>
|
||||
Copyright (c) 2016-2024 Sebastian Pipping <sebastian@pipping.org>
|
||||
Copyright (c) 2017 Rhodri James <rhodri@wildebeest.org.uk>
|
||||
Licensed under the MIT license:
|
||||
|
||||
@@ -289,7 +289,8 @@ int XmlParseXmlDecl(int isGeneralTextEntity, const ENCODING *enc,
|
||||
const char **encodingNamePtr,
|
||||
const ENCODING **namedEncodingPtr, int *standalonePtr);
|
||||
|
||||
int XmlInitEncoding(INIT_ENCODING *, const ENCODING **, const char *name);
|
||||
int XmlInitEncoding(INIT_ENCODING *p, const ENCODING **encPtr,
|
||||
const char *name);
|
||||
const ENCODING *XmlGetUtf8InternalEncoding(void);
|
||||
const ENCODING *XmlGetUtf16InternalEncoding(void);
|
||||
int FASTCALL XmlUtf8Encode(int charNumber, char *buf);
|
||||
@@ -307,7 +308,8 @@ int XmlParseXmlDeclNS(int isGeneralTextEntity, const ENCODING *enc,
|
||||
const char **encodingNamePtr,
|
||||
const ENCODING **namedEncodingPtr, int *standalonePtr);
|
||||
|
||||
int XmlInitEncodingNS(INIT_ENCODING *, const ENCODING **, const char *name);
|
||||
int XmlInitEncodingNS(INIT_ENCODING *p, const ENCODING **encPtr,
|
||||
const char *name);
|
||||
const ENCODING *XmlGetUtf8InternalEncodingNS(void);
|
||||
const ENCODING *XmlGetUtf16InternalEncodingNS(void);
|
||||
ENCODING *XmlInitUnknownEncodingNS(void *mem, int *table, CONVERTER convert,
|
||||
|
||||
@@ -126,7 +126,7 @@
|
||||
# endif
|
||||
|
||||
# define HAS_CHARS(enc, ptr, end, count) \
|
||||
((end) - (ptr) >= ((count)*MINBPC(enc)))
|
||||
((end) - (ptr) >= ((count) * MINBPC(enc)))
|
||||
|
||||
# define HAS_CHAR(enc, ptr, end) HAS_CHARS(enc, ptr, end, 1)
|
||||
|
||||
|
||||
@@ -6,8 +6,8 @@
|
||||
# \___/_/\_\ .__/ \__,_|\__|
|
||||
# |_| XML parser
|
||||
#
|
||||
# Copyright (c) 2017-2021 Sebastian Pipping <[email protected]>
|
||||
# Copyright (c) 2017 Rhodri James <[email protected]>
|
||||
# Copyright (c) 2017-2023 Sebastian Pipping <[email protected]>
|
||||
# Copyright (c) 2017-2022 Rhodri James <[email protected]>
|
||||
# Copyright (c) 2020 Jeffrey Walton <[email protected]>
|
||||
# Licensed under the MIT license:
|
||||
#
|
||||
@@ -34,34 +34,61 @@ SUBDIRS = . benchmark
|
||||
|
||||
AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(srcdir)/../lib
|
||||
|
||||
noinst_LIBRARIES = libruntests.a
|
||||
|
||||
check_PROGRAMS = runtests runtestspp
|
||||
TESTS = runtests runtestspp
|
||||
check_PROGRAMS = runtests runtests_cxx
|
||||
TESTS = runtests runtests_cxx
|
||||
|
||||
# To support MinGW and Non-MinGW at the same time:
|
||||
LOG_DRIVER = $(srcdir)/../test-driver-wrapper.sh
|
||||
|
||||
libruntests_a_SOURCES = \
|
||||
chardata.c \
|
||||
structdata.c \
|
||||
memcheck.c \
|
||||
minicheck.c
|
||||
|
||||
runtests_SOURCES = \
|
||||
runtests.c
|
||||
acc_tests.c \
|
||||
alloc_tests.c \
|
||||
basic_tests.c \
|
||||
chardata.c \
|
||||
common.c \
|
||||
dummy.c \
|
||||
handlers.c \
|
||||
memcheck.c \
|
||||
minicheck.c \
|
||||
misc_tests.c \
|
||||
ns_tests.c \
|
||||
nsalloc_tests.c \
|
||||
runtests.c \
|
||||
structdata.c
|
||||
|
||||
runtestspp_SOURCES = \
|
||||
runtestspp.cpp
|
||||
runtests_cxx_SOURCES = \
|
||||
acc_tests_cxx.cpp \
|
||||
alloc_tests_cxx.cpp \
|
||||
basic_tests_cxx.cpp \
|
||||
chardata_cxx.cpp \
|
||||
common_cxx.cpp \
|
||||
dummy_cxx.cpp \
|
||||
handlers_cxx.cpp \
|
||||
memcheck_cxx.cpp \
|
||||
minicheck_cxx.cpp \
|
||||
misc_tests_cxx.cpp \
|
||||
nsalloc_tests_cxx.cpp \
|
||||
ns_tests_cxx.cpp \
|
||||
runtests_cxx.cpp \
|
||||
structdata_cxx.cpp
|
||||
|
||||
runtests_LDADD = libruntests.a ../lib/libexpatinternal.la
|
||||
runtestspp_LDADD = libruntests.a ../lib/libexpatinternal.la
|
||||
runtests_LDADD = ../lib/libexpatinternal.la
|
||||
runtests_cxx_LDADD = ../lib/libexpatinternal.la
|
||||
|
||||
runtests_LDFLAGS = @AM_LDFLAGS@ @LIBM@
|
||||
runtestspp_LDFLAGS = @AM_LDFLAGS@ @LIBM@
|
||||
runtests_cxx_LDFLAGS = @AM_LDFLAGS@ @LIBM@
|
||||
|
||||
EXTRA_DIST = \
|
||||
acc_tests.h \
|
||||
alloc_tests.h \
|
||||
basic_tests.h \
|
||||
chardata.h \
|
||||
common.h \
|
||||
dummy.h \
|
||||
handlers.h \
|
||||
misc_tests.h \
|
||||
ns_tests.h \
|
||||
nsalloc_tests.h \
|
||||
structdata.h \
|
||||
minicheck.h \
|
||||
memcheck.h \
|
||||
|
||||
+179
-80
@@ -22,8 +22,8 @@
|
||||
# \___/_/\_\ .__/ \__,_|\__|
|
||||
# |_| XML parser
|
||||
#
|
||||
# Copyright (c) 2017-2021 Sebastian Pipping <[email protected]>
|
||||
# Copyright (c) 2017 Rhodri James <[email protected]>
|
||||
# Copyright (c) 2017-2023 Sebastian Pipping <[email protected]>
|
||||
# Copyright (c) 2017-2022 Rhodri James <[email protected]>
|
||||
# Copyright (c) 2020 Jeffrey Walton <[email protected]>
|
||||
# Licensed under the MIT license:
|
||||
#
|
||||
@@ -45,7 +45,6 @@
|
||||
# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
# OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||
# USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
VPATH = @srcdir@
|
||||
am__is_gnu_make = { \
|
||||
if test -z '$(MAKELEVEL)'; then \
|
||||
@@ -120,8 +119,8 @@ PRE_UNINSTALL = :
|
||||
POST_UNINSTALL = :
|
||||
build_triplet = @build@
|
||||
host_triplet = @host@
|
||||
check_PROGRAMS = runtests$(EXEEXT) runtestspp$(EXEEXT)
|
||||
TESTS = runtests$(EXEEXT) runtestspp$(EXEEXT)
|
||||
check_PROGRAMS = runtests$(EXEEXT) runtests_cxx$(EXEEXT)
|
||||
TESTS = runtests$(EXEEXT) runtests_cxx$(EXEEXT)
|
||||
subdir = tests
|
||||
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
||||
am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
|
||||
@@ -135,6 +134,8 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
|
||||
$(top_srcdir)/conftools/ax-append-compile-flags.m4 \
|
||||
$(top_srcdir)/conftools/ax-append-link-flags.m4 \
|
||||
$(top_srcdir)/conftools/expatcfg-compiler-supports-visibility.m4 \
|
||||
$(top_srcdir)/conftools/ax-cxx-compile-stdcxx.m4 \
|
||||
$(top_srcdir)/conftools/ax-cxx-compile-stdcxx-11.m4 \
|
||||
$(top_srcdir)/configure.ac
|
||||
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
||||
$(ACLOCAL_M4)
|
||||
@@ -143,20 +144,14 @@ mkinstalldirs = $(install_sh) -d
|
||||
CONFIG_HEADER = $(top_builddir)/expat_config.h
|
||||
CONFIG_CLEAN_FILES =
|
||||
CONFIG_CLEAN_VPATH_FILES =
|
||||
LIBRARIES = $(noinst_LIBRARIES)
|
||||
ARFLAGS = cru
|
||||
AM_V_AR = $(am__v_AR_@AM_V@)
|
||||
am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@)
|
||||
am__v_AR_0 = @echo " AR " $@;
|
||||
am__v_AR_1 =
|
||||
libruntests_a_AR = $(AR) $(ARFLAGS)
|
||||
libruntests_a_LIBADD =
|
||||
am_libruntests_a_OBJECTS = chardata.$(OBJEXT) structdata.$(OBJEXT) \
|
||||
memcheck.$(OBJEXT) minicheck.$(OBJEXT)
|
||||
libruntests_a_OBJECTS = $(am_libruntests_a_OBJECTS)
|
||||
am_runtests_OBJECTS = runtests.$(OBJEXT)
|
||||
am_runtests_OBJECTS = acc_tests.$(OBJEXT) alloc_tests.$(OBJEXT) \
|
||||
basic_tests.$(OBJEXT) chardata.$(OBJEXT) common.$(OBJEXT) \
|
||||
dummy.$(OBJEXT) handlers.$(OBJEXT) memcheck.$(OBJEXT) \
|
||||
minicheck.$(OBJEXT) misc_tests.$(OBJEXT) ns_tests.$(OBJEXT) \
|
||||
nsalloc_tests.$(OBJEXT) runtests.$(OBJEXT) \
|
||||
structdata.$(OBJEXT)
|
||||
runtests_OBJECTS = $(am_runtests_OBJECTS)
|
||||
runtests_DEPENDENCIES = libruntests.a ../lib/libexpatinternal.la
|
||||
runtests_DEPENDENCIES = ../lib/libexpatinternal.la
|
||||
AM_V_lt = $(am__v_lt_@AM_V@)
|
||||
am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
|
||||
am__v_lt_0 = --silent
|
||||
@@ -164,12 +159,19 @@ am__v_lt_1 =
|
||||
runtests_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
|
||||
$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
|
||||
$(runtests_LDFLAGS) $(LDFLAGS) -o $@
|
||||
am_runtestspp_OBJECTS = runtestspp.$(OBJEXT)
|
||||
runtestspp_OBJECTS = $(am_runtestspp_OBJECTS)
|
||||
runtestspp_DEPENDENCIES = libruntests.a ../lib/libexpatinternal.la
|
||||
runtestspp_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
|
||||
am_runtests_cxx_OBJECTS = acc_tests_cxx.$(OBJEXT) \
|
||||
alloc_tests_cxx.$(OBJEXT) basic_tests_cxx.$(OBJEXT) \
|
||||
chardata_cxx.$(OBJEXT) common_cxx.$(OBJEXT) \
|
||||
dummy_cxx.$(OBJEXT) handlers_cxx.$(OBJEXT) \
|
||||
memcheck_cxx.$(OBJEXT) minicheck_cxx.$(OBJEXT) \
|
||||
misc_tests_cxx.$(OBJEXT) nsalloc_tests_cxx.$(OBJEXT) \
|
||||
ns_tests_cxx.$(OBJEXT) runtests_cxx.$(OBJEXT) \
|
||||
structdata_cxx.$(OBJEXT)
|
||||
runtests_cxx_OBJECTS = $(am_runtests_cxx_OBJECTS)
|
||||
runtests_cxx_DEPENDENCIES = ../lib/libexpatinternal.la
|
||||
runtests_cxx_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
|
||||
$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
|
||||
$(CXXFLAGS) $(runtestspp_LDFLAGS) $(LDFLAGS) -o $@
|
||||
$(CXXFLAGS) $(runtests_cxx_LDFLAGS) $(LDFLAGS) -o $@
|
||||
AM_V_P = $(am__v_P_@AM_V@)
|
||||
am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
|
||||
am__v_P_0 = false
|
||||
@@ -185,9 +187,21 @@ am__v_at_1 =
|
||||
DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
|
||||
depcomp = $(SHELL) $(top_srcdir)/conftools/depcomp
|
||||
am__maybe_remake_depfiles = depfiles
|
||||
am__depfiles_remade = ./$(DEPDIR)/chardata.Po ./$(DEPDIR)/memcheck.Po \
|
||||
./$(DEPDIR)/minicheck.Po ./$(DEPDIR)/runtests.Po \
|
||||
./$(DEPDIR)/runtestspp.Po ./$(DEPDIR)/structdata.Po
|
||||
am__depfiles_remade = ./$(DEPDIR)/acc_tests.Po \
|
||||
./$(DEPDIR)/acc_tests_cxx.Po ./$(DEPDIR)/alloc_tests.Po \
|
||||
./$(DEPDIR)/alloc_tests_cxx.Po ./$(DEPDIR)/basic_tests.Po \
|
||||
./$(DEPDIR)/basic_tests_cxx.Po ./$(DEPDIR)/chardata.Po \
|
||||
./$(DEPDIR)/chardata_cxx.Po ./$(DEPDIR)/common.Po \
|
||||
./$(DEPDIR)/common_cxx.Po ./$(DEPDIR)/dummy.Po \
|
||||
./$(DEPDIR)/dummy_cxx.Po ./$(DEPDIR)/handlers.Po \
|
||||
./$(DEPDIR)/handlers_cxx.Po ./$(DEPDIR)/memcheck.Po \
|
||||
./$(DEPDIR)/memcheck_cxx.Po ./$(DEPDIR)/minicheck.Po \
|
||||
./$(DEPDIR)/minicheck_cxx.Po ./$(DEPDIR)/misc_tests.Po \
|
||||
./$(DEPDIR)/misc_tests_cxx.Po ./$(DEPDIR)/ns_tests.Po \
|
||||
./$(DEPDIR)/ns_tests_cxx.Po ./$(DEPDIR)/nsalloc_tests.Po \
|
||||
./$(DEPDIR)/nsalloc_tests_cxx.Po ./$(DEPDIR)/runtests.Po \
|
||||
./$(DEPDIR)/runtests_cxx.Po ./$(DEPDIR)/structdata.Po \
|
||||
./$(DEPDIR)/structdata_cxx.Po
|
||||
am__mv = mv -f
|
||||
COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
|
||||
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
|
||||
@@ -225,10 +239,8 @@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@)
|
||||
am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
|
||||
am__v_CXXLD_0 = @echo " CXXLD " $@;
|
||||
am__v_CXXLD_1 =
|
||||
SOURCES = $(libruntests_a_SOURCES) $(runtests_SOURCES) \
|
||||
$(runtestspp_SOURCES)
|
||||
DIST_SOURCES = $(libruntests_a_SOURCES) $(runtests_SOURCES) \
|
||||
$(runtestspp_SOURCES)
|
||||
SOURCES = $(runtests_SOURCES) $(runtests_cxx_SOURCES)
|
||||
DIST_SOURCES = $(runtests_SOURCES) $(runtests_cxx_SOURCES)
|
||||
RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
|
||||
ctags-recursive dvi-recursive html-recursive info-recursive \
|
||||
install-data-recursive install-dvi-recursive \
|
||||
@@ -548,6 +560,7 @@ FGREP = @FGREP@
|
||||
FILECMD = @FILECMD@
|
||||
FILEMAP = @FILEMAP@
|
||||
GREP = @GREP@
|
||||
HAVE_CXX11 = @HAVE_CXX11@
|
||||
INSTALL = @INSTALL@
|
||||
INSTALL_DATA = @INSTALL_DATA@
|
||||
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
||||
@@ -567,6 +580,7 @@ LIPO = @LIPO@
|
||||
LN_S = @LN_S@
|
||||
LTLIBOBJS = @LTLIBOBJS@
|
||||
LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
|
||||
MAINT = @MAINT@
|
||||
MAKEINFO = @MAKEINFO@
|
||||
MANIFEST_TOOL = @MANIFEST_TOOL@
|
||||
MKDIR_P = @MKDIR_P@
|
||||
@@ -649,28 +663,56 @@ top_build_prefix = @top_build_prefix@
|
||||
top_builddir = @top_builddir@
|
||||
top_srcdir = @top_srcdir@
|
||||
SUBDIRS = . benchmark
|
||||
noinst_LIBRARIES = libruntests.a
|
||||
|
||||
# To support MinGW and Non-MinGW at the same time:
|
||||
LOG_DRIVER = $(srcdir)/../test-driver-wrapper.sh
|
||||
libruntests_a_SOURCES = \
|
||||
chardata.c \
|
||||
structdata.c \
|
||||
memcheck.c \
|
||||
minicheck.c
|
||||
|
||||
runtests_SOURCES = \
|
||||
runtests.c
|
||||
acc_tests.c \
|
||||
alloc_tests.c \
|
||||
basic_tests.c \
|
||||
chardata.c \
|
||||
common.c \
|
||||
dummy.c \
|
||||
handlers.c \
|
||||
memcheck.c \
|
||||
minicheck.c \
|
||||
misc_tests.c \
|
||||
ns_tests.c \
|
||||
nsalloc_tests.c \
|
||||
runtests.c \
|
||||
structdata.c
|
||||
|
||||
runtestspp_SOURCES = \
|
||||
runtestspp.cpp
|
||||
runtests_cxx_SOURCES = \
|
||||
acc_tests_cxx.cpp \
|
||||
alloc_tests_cxx.cpp \
|
||||
basic_tests_cxx.cpp \
|
||||
chardata_cxx.cpp \
|
||||
common_cxx.cpp \
|
||||
dummy_cxx.cpp \
|
||||
handlers_cxx.cpp \
|
||||
memcheck_cxx.cpp \
|
||||
minicheck_cxx.cpp \
|
||||
misc_tests_cxx.cpp \
|
||||
nsalloc_tests_cxx.cpp \
|
||||
ns_tests_cxx.cpp \
|
||||
runtests_cxx.cpp \
|
||||
structdata_cxx.cpp
|
||||
|
||||
runtests_LDADD = libruntests.a ../lib/libexpatinternal.la
|
||||
runtestspp_LDADD = libruntests.a ../lib/libexpatinternal.la
|
||||
runtests_LDADD = ../lib/libexpatinternal.la
|
||||
runtests_cxx_LDADD = ../lib/libexpatinternal.la
|
||||
runtests_LDFLAGS = @AM_LDFLAGS@ @LIBM@
|
||||
runtestspp_LDFLAGS = @AM_LDFLAGS@ @LIBM@
|
||||
runtests_cxx_LDFLAGS = @AM_LDFLAGS@ @LIBM@
|
||||
EXTRA_DIST = \
|
||||
acc_tests.h \
|
||||
alloc_tests.h \
|
||||
basic_tests.h \
|
||||
chardata.h \
|
||||
common.h \
|
||||
dummy.h \
|
||||
handlers.h \
|
||||
misc_tests.h \
|
||||
ns_tests.h \
|
||||
nsalloc_tests.h \
|
||||
structdata.h \
|
||||
minicheck.h \
|
||||
memcheck.h \
|
||||
@@ -683,7 +725,7 @@ all: all-recursive
|
||||
|
||||
.SUFFIXES:
|
||||
.SUFFIXES: .c .cpp .lo .log .o .obj .test .test$(EXEEXT) .trs
|
||||
$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
|
||||
$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
|
||||
@for dep in $?; do \
|
||||
case '$(am__configure_deps)' in \
|
||||
*$$dep*) \
|
||||
@@ -707,9 +749,9 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
||||
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
|
||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||
|
||||
$(top_srcdir)/configure: $(am__configure_deps)
|
||||
$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
|
||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||
$(ACLOCAL_M4): $(am__aclocal_m4_deps)
|
||||
$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
|
||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||
$(am__aclocal_m4_deps):
|
||||
|
||||
@@ -722,21 +764,13 @@ clean-checkPROGRAMS:
|
||||
echo " rm -f" $$list; \
|
||||
rm -f $$list
|
||||
|
||||
clean-noinstLIBRARIES:
|
||||
-test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
|
||||
|
||||
libruntests.a: $(libruntests_a_OBJECTS) $(libruntests_a_DEPENDENCIES) $(EXTRA_libruntests_a_DEPENDENCIES)
|
||||
$(AM_V_at)-rm -f libruntests.a
|
||||
$(AM_V_AR)$(libruntests_a_AR) libruntests.a $(libruntests_a_OBJECTS) $(libruntests_a_LIBADD)
|
||||
$(AM_V_at)$(RANLIB) libruntests.a
|
||||
|
||||
runtests$(EXEEXT): $(runtests_OBJECTS) $(runtests_DEPENDENCIES) $(EXTRA_runtests_DEPENDENCIES)
|
||||
@rm -f runtests$(EXEEXT)
|
||||
$(AM_V_CCLD)$(runtests_LINK) $(runtests_OBJECTS) $(runtests_LDADD) $(LIBS)
|
||||
|
||||
runtestspp$(EXEEXT): $(runtestspp_OBJECTS) $(runtestspp_DEPENDENCIES) $(EXTRA_runtestspp_DEPENDENCIES)
|
||||
@rm -f runtestspp$(EXEEXT)
|
||||
$(AM_V_CXXLD)$(runtestspp_LINK) $(runtestspp_OBJECTS) $(runtestspp_LDADD) $(LIBS)
|
||||
runtests_cxx$(EXEEXT): $(runtests_cxx_OBJECTS) $(runtests_cxx_DEPENDENCIES) $(EXTRA_runtests_cxx_DEPENDENCIES)
|
||||
@rm -f runtests_cxx$(EXEEXT)
|
||||
$(AM_V_CXXLD)$(runtests_cxx_LINK) $(runtests_cxx_OBJECTS) $(runtests_cxx_LDADD) $(LIBS)
|
||||
|
||||
mostlyclean-compile:
|
||||
-rm -f *.$(OBJEXT)
|
||||
@@ -744,12 +778,34 @@ mostlyclean-compile:
|
||||
distclean-compile:
|
||||
-rm -f *.tab.c
|
||||
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/acc_tests.Po@am__quote@ # am--include-marker
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/acc_tests_cxx.Po@am__quote@ # am--include-marker
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/alloc_tests.Po@am__quote@ # am--include-marker
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/alloc_tests_cxx.Po@am__quote@ # am--include-marker
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/basic_tests.Po@am__quote@ # am--include-marker
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/basic_tests_cxx.Po@am__quote@ # am--include-marker
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chardata.Po@am__quote@ # am--include-marker
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chardata_cxx.Po@am__quote@ # am--include-marker
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/common.Po@am__quote@ # am--include-marker
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/common_cxx.Po@am__quote@ # am--include-marker
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dummy.Po@am__quote@ # am--include-marker
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dummy_cxx.Po@am__quote@ # am--include-marker
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/handlers.Po@am__quote@ # am--include-marker
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/handlers_cxx.Po@am__quote@ # am--include-marker
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/memcheck.Po@am__quote@ # am--include-marker
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/memcheck_cxx.Po@am__quote@ # am--include-marker
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/minicheck.Po@am__quote@ # am--include-marker
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/minicheck_cxx.Po@am__quote@ # am--include-marker
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/misc_tests.Po@am__quote@ # am--include-marker
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/misc_tests_cxx.Po@am__quote@ # am--include-marker
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ns_tests.Po@am__quote@ # am--include-marker
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ns_tests_cxx.Po@am__quote@ # am--include-marker
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nsalloc_tests.Po@am__quote@ # am--include-marker
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nsalloc_tests_cxx.Po@am__quote@ # am--include-marker
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/runtests.Po@am__quote@ # am--include-marker
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/runtestspp.Po@am__quote@ # am--include-marker
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/runtests_cxx.Po@am__quote@ # am--include-marker
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/structdata.Po@am__quote@ # am--include-marker
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/structdata_cxx.Po@am__quote@ # am--include-marker
|
||||
|
||||
$(am__depfiles_remade):
|
||||
@$(MKDIR_P) $(@D)
|
||||
@@ -1052,9 +1108,9 @@ runtests.log: runtests$(EXEEXT)
|
||||
--log-file $$b.log --trs-file $$b.trs \
|
||||
$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
|
||||
"$$tst" $(AM_TESTS_FD_REDIRECT)
|
||||
runtestspp.log: runtestspp$(EXEEXT)
|
||||
@p='runtestspp$(EXEEXT)'; \
|
||||
b='runtestspp'; \
|
||||
runtests_cxx.log: runtests_cxx$(EXEEXT)
|
||||
@p='runtests_cxx$(EXEEXT)'; \
|
||||
b='runtests_cxx'; \
|
||||
$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
|
||||
--log-file $$b.log --trs-file $$b.trs \
|
||||
$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
|
||||
@@ -1135,7 +1191,7 @@ check-am: all-am
|
||||
$(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
|
||||
$(MAKE) $(AM_MAKEFLAGS) check-TESTS
|
||||
check: check-recursive
|
||||
all-am: Makefile $(LIBRARIES)
|
||||
all-am: Makefile
|
||||
installdirs: installdirs-recursive
|
||||
installdirs-am:
|
||||
install: install-recursive
|
||||
@@ -1174,15 +1230,37 @@ maintainer-clean-generic:
|
||||
clean: clean-recursive
|
||||
|
||||
clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
|
||||
clean-noinstLIBRARIES mostlyclean-am
|
||||
mostlyclean-am
|
||||
|
||||
distclean: distclean-recursive
|
||||
-rm -f ./$(DEPDIR)/chardata.Po
|
||||
-rm -f ./$(DEPDIR)/acc_tests.Po
|
||||
-rm -f ./$(DEPDIR)/acc_tests_cxx.Po
|
||||
-rm -f ./$(DEPDIR)/alloc_tests.Po
|
||||
-rm -f ./$(DEPDIR)/alloc_tests_cxx.Po
|
||||
-rm -f ./$(DEPDIR)/basic_tests.Po
|
||||
-rm -f ./$(DEPDIR)/basic_tests_cxx.Po
|
||||
-rm -f ./$(DEPDIR)/chardata.Po
|
||||
-rm -f ./$(DEPDIR)/chardata_cxx.Po
|
||||
-rm -f ./$(DEPDIR)/common.Po
|
||||
-rm -f ./$(DEPDIR)/common_cxx.Po
|
||||
-rm -f ./$(DEPDIR)/dummy.Po
|
||||
-rm -f ./$(DEPDIR)/dummy_cxx.Po
|
||||
-rm -f ./$(DEPDIR)/handlers.Po
|
||||
-rm -f ./$(DEPDIR)/handlers_cxx.Po
|
||||
-rm -f ./$(DEPDIR)/memcheck.Po
|
||||
-rm -f ./$(DEPDIR)/memcheck_cxx.Po
|
||||
-rm -f ./$(DEPDIR)/minicheck.Po
|
||||
-rm -f ./$(DEPDIR)/minicheck_cxx.Po
|
||||
-rm -f ./$(DEPDIR)/misc_tests.Po
|
||||
-rm -f ./$(DEPDIR)/misc_tests_cxx.Po
|
||||
-rm -f ./$(DEPDIR)/ns_tests.Po
|
||||
-rm -f ./$(DEPDIR)/ns_tests_cxx.Po
|
||||
-rm -f ./$(DEPDIR)/nsalloc_tests.Po
|
||||
-rm -f ./$(DEPDIR)/nsalloc_tests_cxx.Po
|
||||
-rm -f ./$(DEPDIR)/runtests.Po
|
||||
-rm -f ./$(DEPDIR)/runtestspp.Po
|
||||
-rm -f ./$(DEPDIR)/runtests_cxx.Po
|
||||
-rm -f ./$(DEPDIR)/structdata.Po
|
||||
-rm -f ./$(DEPDIR)/structdata_cxx.Po
|
||||
-rm -f Makefile
|
||||
distclean-am: clean-am distclean-compile distclean-generic \
|
||||
distclean-tags
|
||||
@@ -1228,12 +1306,34 @@ install-ps-am:
|
||||
installcheck-am:
|
||||
|
||||
maintainer-clean: maintainer-clean-recursive
|
||||
-rm -f ./$(DEPDIR)/chardata.Po
|
||||
-rm -f ./$(DEPDIR)/acc_tests.Po
|
||||
-rm -f ./$(DEPDIR)/acc_tests_cxx.Po
|
||||
-rm -f ./$(DEPDIR)/alloc_tests.Po
|
||||
-rm -f ./$(DEPDIR)/alloc_tests_cxx.Po
|
||||
-rm -f ./$(DEPDIR)/basic_tests.Po
|
||||
-rm -f ./$(DEPDIR)/basic_tests_cxx.Po
|
||||
-rm -f ./$(DEPDIR)/chardata.Po
|
||||
-rm -f ./$(DEPDIR)/chardata_cxx.Po
|
||||
-rm -f ./$(DEPDIR)/common.Po
|
||||
-rm -f ./$(DEPDIR)/common_cxx.Po
|
||||
-rm -f ./$(DEPDIR)/dummy.Po
|
||||
-rm -f ./$(DEPDIR)/dummy_cxx.Po
|
||||
-rm -f ./$(DEPDIR)/handlers.Po
|
||||
-rm -f ./$(DEPDIR)/handlers_cxx.Po
|
||||
-rm -f ./$(DEPDIR)/memcheck.Po
|
||||
-rm -f ./$(DEPDIR)/memcheck_cxx.Po
|
||||
-rm -f ./$(DEPDIR)/minicheck.Po
|
||||
-rm -f ./$(DEPDIR)/minicheck_cxx.Po
|
||||
-rm -f ./$(DEPDIR)/misc_tests.Po
|
||||
-rm -f ./$(DEPDIR)/misc_tests_cxx.Po
|
||||
-rm -f ./$(DEPDIR)/ns_tests.Po
|
||||
-rm -f ./$(DEPDIR)/ns_tests_cxx.Po
|
||||
-rm -f ./$(DEPDIR)/nsalloc_tests.Po
|
||||
-rm -f ./$(DEPDIR)/nsalloc_tests_cxx.Po
|
||||
-rm -f ./$(DEPDIR)/runtests.Po
|
||||
-rm -f ./$(DEPDIR)/runtestspp.Po
|
||||
-rm -f ./$(DEPDIR)/runtests_cxx.Po
|
||||
-rm -f ./$(DEPDIR)/structdata.Po
|
||||
-rm -f ./$(DEPDIR)/structdata_cxx.Po
|
||||
-rm -f Makefile
|
||||
maintainer-clean-am: distclean-am maintainer-clean-generic
|
||||
|
||||
@@ -1256,19 +1356,18 @@ uninstall-am:
|
||||
|
||||
.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \
|
||||
am--depfiles check check-TESTS check-am clean \
|
||||
clean-checkPROGRAMS clean-generic clean-libtool \
|
||||
clean-noinstLIBRARIES cscopelist-am ctags ctags-am distclean \
|
||||
distclean-compile distclean-generic distclean-libtool \
|
||||
distclean-tags distdir dvi dvi-am html html-am info info-am \
|
||||
install install-am install-data install-data-am install-dvi \
|
||||
install-dvi-am install-exec install-exec-am install-html \
|
||||
install-html-am install-info install-info-am install-man \
|
||||
install-pdf install-pdf-am install-ps install-ps-am \
|
||||
install-strip installcheck installcheck-am installdirs \
|
||||
installdirs-am maintainer-clean maintainer-clean-generic \
|
||||
mostlyclean mostlyclean-compile mostlyclean-generic \
|
||||
mostlyclean-libtool pdf pdf-am ps ps-am recheck tags tags-am \
|
||||
uninstall uninstall-am
|
||||
clean-checkPROGRAMS clean-generic clean-libtool cscopelist-am \
|
||||
ctags ctags-am distclean distclean-compile distclean-generic \
|
||||
distclean-libtool distclean-tags distdir dvi dvi-am html \
|
||||
html-am info info-am install install-am install-data \
|
||||
install-data-am install-dvi install-dvi-am install-exec \
|
||||
install-exec-am install-html install-html-am install-info \
|
||||
install-info-am install-man install-pdf install-pdf-am \
|
||||
install-ps install-ps-am install-strip installcheck \
|
||||
installcheck-am installdirs installdirs-am maintainer-clean \
|
||||
maintainer-clean-generic mostlyclean mostlyclean-compile \
|
||||
mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
|
||||
recheck tags tags-am uninstall uninstall-am
|
||||
|
||||
.PRECIOUS: Makefile
|
||||
|
||||
|
||||
@@ -0,0 +1,396 @@
|
||||
/* Tests in the "accounting" test case for the Expat test suite
|
||||
__ __ _
|
||||
___\ \/ /_ __ __ _| |_
|
||||
/ _ \\ /| '_ \ / _` | __|
|
||||
| __// \| |_) | (_| | |_
|
||||
\___/_/\_\ .__/ \__,_|\__|
|
||||
|_| XML parser
|
||||
|
||||
Copyright (c) 2001-2006 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
|
||||
Copyright (c) 2003 Greg Stein <gstein@users.sourceforge.net>
|
||||
Copyright (c) 2005-2007 Steven Solie <steven@solie.ca>
|
||||
Copyright (c) 2005-2012 Karl Waclawek <karl@waclawek.net>
|
||||
Copyright (c) 2016-2024 Sebastian Pipping <sebastian@pipping.org>
|
||||
Copyright (c) 2017-2022 Rhodri James <rhodri@wildebeest.org.uk>
|
||||
Copyright (c) 2017 Joe Orton <jorton@redhat.com>
|
||||
Copyright (c) 2017 José Gutiérrez de la Concha <jose@zeroc.com>
|
||||
Copyright (c) 2018 Marco Maggi <marco.maggi-ipsu@poste.it>
|
||||
Copyright (c) 2019 David Loffredo <loffredo@steptools.com>
|
||||
Copyright (c) 2020 Tim Gates <tim.gates@iress.com>
|
||||
Copyright (c) 2021 Donghee Na <donghee.na@python.org>
|
||||
Copyright (c) 2023 Sony Corporation / Snild Dolkow <snild@sony.com>
|
||||
Licensed under the MIT license:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
persons to whom the Software is furnished to do so, subject to the
|
||||
following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included
|
||||
in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
||||
NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||
USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <math.h> /* NAN, INFINITY */
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "expat_config.h"
|
||||
|
||||
#include "expat.h"
|
||||
#include "internal.h"
|
||||
#include "common.h"
|
||||
#include "minicheck.h"
|
||||
#include "chardata.h"
|
||||
#include "handlers.h"
|
||||
#include "acc_tests.h"
|
||||
|
||||
#if XML_GE == 1
|
||||
START_TEST(test_accounting_precision) {
|
||||
struct AccountingTestCase cases[] = {
|
||||
{"<e/>", NULL, NULL, 0},
|
||||
{"<e></e>", NULL, NULL, 0},
|
||||
|
||||
/* Attributes */
|
||||
{"<e k1=\"v2\" k2=\"v2\"/>", NULL, NULL, 0},
|
||||
{"<e k1=\"v2\" k2=\"v2\"></e>", NULL, NULL, 0},
|
||||
{"<p:e xmlns:p=\"https://domain.invalid/\" />", NULL, NULL, 0},
|
||||
{"<e k=\"&'><"\" />", NULL, NULL,
|
||||
sizeof(XML_Char) * 5 /* number of predefined entities */},
|
||||
{"<e1 xmlns='https://example.org/'>\n"
|
||||
" <e2 xmlns=''/>\n"
|
||||
"</e1>",
|
||||
NULL, NULL, 0},
|
||||
|
||||
/* Text */
|
||||
{"<e>text</e>", NULL, NULL, 0},
|
||||
{"<e1><e2>text1<e3/>text2</e2></e1>", NULL, NULL, 0},
|
||||
{"<e>&'><"</e>", NULL, NULL,
|
||||
sizeof(XML_Char) * 5 /* number of predefined entities */},
|
||||
{"<e>A)</e>", NULL, NULL, 0},
|
||||
|
||||
/* Prolog */
|
||||
{"<?xml version=\"1.0\"?><root/>", NULL, NULL, 0},
|
||||
|
||||
/* Whitespace */
|
||||
{" <e1> <e2> </e2> </e1> ", NULL, NULL, 0},
|
||||
{"<e1 ><e2 /></e1 >", NULL, NULL, 0},
|
||||
{"<e1><e2 k = \"v\"/><e3 k = 'v'/></e1>", NULL, NULL, 0},
|
||||
|
||||
/* Comments */
|
||||
{"<!-- Comment --><e><!-- Comment --></e>", NULL, NULL, 0},
|
||||
|
||||
/* Processing instructions */
|
||||
{"<?xml-stylesheet type=\"text/xsl\" href=\"https://domain.invalid/\" media=\"all\"?><e/>",
|
||||
NULL, NULL, 0},
|
||||
{"<?pi0?><?pi1 ?><?pi2 ?><r/><?pi4?>", NULL, NULL, 0},
|
||||
# ifdef XML_DTD
|
||||
{"<?pi0?><?pi1 ?><?pi2 ?><!DOCTYPE r SYSTEM 'first.ent'><r/>",
|
||||
"<?pi3?><!ENTITY % e1 SYSTEM 'second.ent'><?pi4?>%e1;<?pi5?>", "<?pi6?>",
|
||||
0},
|
||||
# endif /* XML_DTD */
|
||||
|
||||
/* CDATA */
|
||||
{"<e><![CDATA[one two three]]></e>", NULL, NULL, 0},
|
||||
/* The following is the essence of this OSS-Fuzz finding:
|
||||
https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=34302
|
||||
https://oss-fuzz.com/testcase-detail/4860575394955264
|
||||
*/
|
||||
{"<!DOCTYPE r [\n"
|
||||
"<!ENTITY e \"111<![CDATA[2 <= 2]]>333\">\n"
|
||||
"]>\n"
|
||||
"<r>&e;</r>\n",
|
||||
NULL, NULL, sizeof(XML_Char) * strlen("111<![CDATA[2 <= 2]]>333")},
|
||||
|
||||
# ifdef XML_DTD
|
||||
/* Conditional sections */
|
||||
{"<!DOCTYPE r [\n"
|
||||
"<!ENTITY % draft 'INCLUDE'>\n"
|
||||
"<!ENTITY % final 'IGNORE'>\n"
|
||||
"<!ENTITY % import SYSTEM \"first.ent\">\n"
|
||||
"%import;\n"
|
||||
"]>\n"
|
||||
"<r/>\n",
|
||||
"<![%draft;[<!--1-->]]>\n"
|
||||
"<![%final;[<!--22-->]]>",
|
||||
NULL, sizeof(XML_Char) * (strlen("INCLUDE") + strlen("IGNORE"))},
|
||||
# endif /* XML_DTD */
|
||||
|
||||
/* General entities */
|
||||
{"<!DOCTYPE root [\n"
|
||||
"<!ENTITY nine \"123456789\">\n"
|
||||
"]>\n"
|
||||
"<root>&nine;</root>",
|
||||
NULL, NULL, sizeof(XML_Char) * strlen("123456789")},
|
||||
{"<!DOCTYPE root [\n"
|
||||
"<!ENTITY nine \"123456789\">\n"
|
||||
"]>\n"
|
||||
"<root k1=\"&nine;\"/>",
|
||||
NULL, NULL, sizeof(XML_Char) * strlen("123456789")},
|
||||
{"<!DOCTYPE root [\n"
|
||||
"<!ENTITY nine \"123456789\">\n"
|
||||
"<!ENTITY nine2 \"&nine;&nine;\">\n"
|
||||
"]>\n"
|
||||
"<root>&nine2;&nine2;&nine2;</root>",
|
||||
NULL, NULL,
|
||||
sizeof(XML_Char) * 3 /* calls to &nine2; */ * 2 /* calls to &nine; */
|
||||
* (strlen("&nine;") + strlen("123456789"))},
|
||||
{"<!DOCTYPE r [\n"
|
||||
" <!ENTITY five SYSTEM 'first.ent'>\n"
|
||||
"]>\n"
|
||||
"<r>&five;</r>",
|
||||
"12345", NULL, 0},
|
||||
{"<!DOCTYPE r [\n"
|
||||
" <!ENTITY five SYSTEM 'first.ent'>\n"
|
||||
"]>\n"
|
||||
"<r>&five;</r>",
|
||||
"\xEF\xBB\xBF" /* UTF-8 BOM */, NULL, 0},
|
||||
|
||||
# ifdef XML_DTD
|
||||
/* Parameter entities */
|
||||
{"<!DOCTYPE r [\n"
|
||||
"<!ENTITY % comment \"<!---->\">\n"
|
||||
"%comment;\n"
|
||||
"]>\n"
|
||||
"<r/>",
|
||||
NULL, NULL, sizeof(XML_Char) * strlen("<!---->")},
|
||||
{"<!DOCTYPE r [\n"
|
||||
"<!ENTITY % ninedef \"<!ENTITY nine "123456789">\">\n"
|
||||
"%ninedef;\n"
|
||||
"]>\n"
|
||||
"<r>&nine;</r>",
|
||||
NULL, NULL,
|
||||
sizeof(XML_Char)
|
||||
* (strlen("<!ENTITY nine \"123456789\">") + strlen("123456789"))},
|
||||
{"<!DOCTYPE r [\n"
|
||||
"<!ENTITY % comment \"<!--1-->\">\n"
|
||||
"<!ENTITY % comment2 \"%comment;<!--22-->%comment;\">\n"
|
||||
"%comment2;\n"
|
||||
"]>\n"
|
||||
"<r/>\n",
|
||||
NULL, NULL,
|
||||
sizeof(XML_Char)
|
||||
* (strlen("%comment;<!--22-->%comment;") + 2 * strlen("<!--1-->"))},
|
||||
{"<!DOCTYPE r [\n"
|
||||
" <!ENTITY % five \"12345\">\n"
|
||||
" <!ENTITY % five2def \"<!ENTITY five2 "[%five;][%five;]]]]">\">\n"
|
||||
" %five2def;\n"
|
||||
"]>\n"
|
||||
"<r>&five2;</r>",
|
||||
NULL, NULL, /* from "%five2def;": */
|
||||
sizeof(XML_Char)
|
||||
* (strlen("<!ENTITY five2 \"[%five;][%five;]]]]\">")
|
||||
+ 2 /* calls to "%five;" */ * strlen("12345")
|
||||
+ /* from "&five2;": */ strlen("[12345][12345]]]]"))},
|
||||
{"<!DOCTYPE r SYSTEM \"first.ent\">\n"
|
||||
"<r/>",
|
||||
"<!ENTITY % comment '<!--1-->'>\n"
|
||||
"<!ENTITY % comment2 '<!--22-->%comment;<!--22-->%comment;<!--22-->'>\n"
|
||||
"%comment2;",
|
||||
NULL,
|
||||
sizeof(XML_Char)
|
||||
* (strlen("<!--22-->%comment;<!--22-->%comment;<!--22-->")
|
||||
+ 2 /* calls to "%comment;" */ * strlen("<!---->"))},
|
||||
{"<!DOCTYPE r SYSTEM 'first.ent'>\n"
|
||||
"<r/>",
|
||||
"<!ENTITY % e1 PUBLIC 'foo' 'second.ent'>\n"
|
||||
"<!ENTITY % e2 '<!--22-->%e1;<!--22-->'>\n"
|
||||
"%e2;\n",
|
||||
"<!--1-->", sizeof(XML_Char) * strlen("<!--22--><!--1--><!--22-->")},
|
||||
{
|
||||
"<!DOCTYPE r SYSTEM 'first.ent'>\n"
|
||||
"<r/>",
|
||||
"<!ENTITY % e1 SYSTEM 'second.ent'>\n"
|
||||
"<!ENTITY % e2 '%e1;'>",
|
||||
"<?xml version='1.0' encoding='utf-8'?>\n"
|
||||
"hello\n"
|
||||
"xml" /* without trailing newline! */,
|
||||
0,
|
||||
},
|
||||
{
|
||||
"<!DOCTYPE r SYSTEM 'first.ent'>\n"
|
||||
"<r/>",
|
||||
"<!ENTITY % e1 SYSTEM 'second.ent'>\n"
|
||||
"<!ENTITY % e2 '%e1;'>",
|
||||
"<?xml version='1.0' encoding='utf-8'?>\n"
|
||||
"hello\n"
|
||||
"xml\n" /* with trailing newline! */,
|
||||
0,
|
||||
},
|
||||
{"<!DOCTYPE doc SYSTEM 'first.ent'>\n"
|
||||
"<doc></doc>\n",
|
||||
"<!ELEMENT doc EMPTY>\n"
|
||||
"<!ENTITY % e1 SYSTEM 'second.ent'>\n"
|
||||
"<!ENTITY % e2 '%e1;'>\n"
|
||||
"%e1;\n",
|
||||
"\xEF\xBB\xBF<!ATTLIST doc a1 CDATA 'value'>" /* UTF-8 BOM */,
|
||||
strlen("\xEF\xBB\xBF<!ATTLIST doc a1 CDATA 'value'>")},
|
||||
# endif /* XML_DTD */
|
||||
};
|
||||
|
||||
const size_t countCases = sizeof(cases) / sizeof(cases[0]);
|
||||
size_t u = 0;
|
||||
for (; u < countCases; u++) {
|
||||
const unsigned long long expectedCountBytesDirect
|
||||
= strlen(cases[u].primaryText);
|
||||
const unsigned long long expectedCountBytesIndirect
|
||||
= (cases[u].firstExternalText ? strlen(cases[u].firstExternalText) : 0)
|
||||
+ (cases[u].secondExternalText ? strlen(cases[u].secondExternalText)
|
||||
: 0)
|
||||
+ cases[u].expectedCountBytesIndirectExtra;
|
||||
|
||||
XML_Parser parser = XML_ParserCreate(NULL);
|
||||
XML_SetParamEntityParsing(parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
|
||||
if (cases[u].firstExternalText) {
|
||||
XML_SetExternalEntityRefHandler(parser,
|
||||
accounting_external_entity_ref_handler);
|
||||
XML_SetUserData(parser, (void *)&cases[u]);
|
||||
}
|
||||
|
||||
enum XML_Status status
|
||||
= _XML_Parse_SINGLE_BYTES(parser, cases[u].primaryText,
|
||||
(int)strlen(cases[u].primaryText), XML_TRUE);
|
||||
if (status != XML_STATUS_OK) {
|
||||
_xml_failure(parser, __FILE__, __LINE__);
|
||||
}
|
||||
|
||||
const unsigned long long actualCountBytesDirect
|
||||
= testingAccountingGetCountBytesDirect(parser);
|
||||
const unsigned long long actualCountBytesIndirect
|
||||
= testingAccountingGetCountBytesIndirect(parser);
|
||||
|
||||
XML_ParserFree(parser);
|
||||
|
||||
if (actualCountBytesDirect != expectedCountBytesDirect) {
|
||||
fprintf(
|
||||
stderr,
|
||||
"Document " EXPAT_FMT_SIZE_T("") " of " EXPAT_FMT_SIZE_T("") ": Expected " EXPAT_FMT_ULL(
|
||||
"") " count direct bytes, got " EXPAT_FMT_ULL("") " instead.\n",
|
||||
u + 1, countCases, expectedCountBytesDirect, actualCountBytesDirect);
|
||||
fail("Count of direct bytes is off");
|
||||
}
|
||||
|
||||
if (actualCountBytesIndirect != expectedCountBytesIndirect) {
|
||||
fprintf(
|
||||
stderr,
|
||||
"Document " EXPAT_FMT_SIZE_T("") " of " EXPAT_FMT_SIZE_T("") ": Expected " EXPAT_FMT_ULL(
|
||||
"") " count indirect bytes, got " EXPAT_FMT_ULL("") " instead.\n",
|
||||
u + 1, countCases, expectedCountBytesIndirect,
|
||||
actualCountBytesIndirect);
|
||||
fail("Count of indirect bytes is off");
|
||||
}
|
||||
}
|
||||
}
|
||||
END_TEST
|
||||
|
||||
START_TEST(test_billion_laughs_attack_protection_api) {
|
||||
XML_Parser parserWithoutParent = XML_ParserCreate(NULL);
|
||||
XML_Parser parserWithParent = XML_ExternalEntityParserCreate(
|
||||
parserWithoutParent, XCS("entity123"), NULL);
|
||||
if (parserWithoutParent == NULL)
|
||||
fail("parserWithoutParent is NULL");
|
||||
if (parserWithParent == NULL)
|
||||
fail("parserWithParent is NULL");
|
||||
|
||||
// XML_SetBillionLaughsAttackProtectionMaximumAmplification, error cases
|
||||
if (XML_SetBillionLaughsAttackProtectionMaximumAmplification(NULL, 123.0f)
|
||||
== XML_TRUE)
|
||||
fail("Call with NULL parser is NOT supposed to succeed");
|
||||
if (XML_SetBillionLaughsAttackProtectionMaximumAmplification(parserWithParent,
|
||||
123.0f)
|
||||
== XML_TRUE)
|
||||
fail("Call with non-root parser is NOT supposed to succeed");
|
||||
if (XML_SetBillionLaughsAttackProtectionMaximumAmplification(
|
||||
parserWithoutParent, NAN)
|
||||
== XML_TRUE)
|
||||
fail("Call with NaN limit is NOT supposed to succeed");
|
||||
if (XML_SetBillionLaughsAttackProtectionMaximumAmplification(
|
||||
parserWithoutParent, -1.0f)
|
||||
== XML_TRUE)
|
||||
fail("Call with negative limit is NOT supposed to succeed");
|
||||
if (XML_SetBillionLaughsAttackProtectionMaximumAmplification(
|
||||
parserWithoutParent, 0.9f)
|
||||
== XML_TRUE)
|
||||
fail("Call with positive limit <1.0 is NOT supposed to succeed");
|
||||
|
||||
// XML_SetBillionLaughsAttackProtectionMaximumAmplification, success cases
|
||||
if (XML_SetBillionLaughsAttackProtectionMaximumAmplification(
|
||||
parserWithoutParent, 1.0f)
|
||||
== XML_FALSE)
|
||||
fail("Call with positive limit >=1.0 is supposed to succeed");
|
||||
if (XML_SetBillionLaughsAttackProtectionMaximumAmplification(
|
||||
parserWithoutParent, 123456.789f)
|
||||
== XML_FALSE)
|
||||
fail("Call with positive limit >=1.0 is supposed to succeed");
|
||||
if (XML_SetBillionLaughsAttackProtectionMaximumAmplification(
|
||||
parserWithoutParent, INFINITY)
|
||||
== XML_FALSE)
|
||||
fail("Call with positive limit >=1.0 is supposed to succeed");
|
||||
|
||||
// XML_SetBillionLaughsAttackProtectionActivationThreshold, error cases
|
||||
if (XML_SetBillionLaughsAttackProtectionActivationThreshold(NULL, 123)
|
||||
== XML_TRUE)
|
||||
fail("Call with NULL parser is NOT supposed to succeed");
|
||||
if (XML_SetBillionLaughsAttackProtectionActivationThreshold(parserWithParent,
|
||||
123)
|
||||
== XML_TRUE)
|
||||
fail("Call with non-root parser is NOT supposed to succeed");
|
||||
|
||||
// XML_SetBillionLaughsAttackProtectionActivationThreshold, success cases
|
||||
if (XML_SetBillionLaughsAttackProtectionActivationThreshold(
|
||||
parserWithoutParent, 123)
|
||||
== XML_FALSE)
|
||||
fail("Call with non-NULL parentless parser is supposed to succeed");
|
||||
|
||||
XML_ParserFree(parserWithParent);
|
||||
XML_ParserFree(parserWithoutParent);
|
||||
}
|
||||
END_TEST
|
||||
|
||||
START_TEST(test_helper_unsigned_char_to_printable) {
|
||||
// Smoke test
|
||||
unsigned char uc = 0;
|
||||
for (; uc < (unsigned char)-1; uc++) {
|
||||
set_subtest("char %u", (unsigned)uc);
|
||||
const char *const printable = unsignedCharToPrintable(uc);
|
||||
if (printable == NULL)
|
||||
fail("unsignedCharToPrintable returned NULL");
|
||||
else if (strlen(printable) < (size_t)1)
|
||||
fail("unsignedCharToPrintable returned empty string");
|
||||
}
|
||||
|
||||
// Two concrete samples
|
||||
set_subtest("char 'A'");
|
||||
if (strcmp(unsignedCharToPrintable('A'), "A") != 0)
|
||||
fail("unsignedCharToPrintable result mistaken");
|
||||
set_subtest("char '\\'");
|
||||
if (strcmp(unsignedCharToPrintable('\\'), "\\\\") != 0)
|
||||
fail("unsignedCharToPrintable result mistaken");
|
||||
}
|
||||
END_TEST
|
||||
#endif // XML_GE == 1
|
||||
|
||||
void
|
||||
make_accounting_test_case(Suite *s) {
|
||||
#if XML_GE == 1
|
||||
TCase *tc_accounting = tcase_create("accounting tests");
|
||||
|
||||
suite_add_tcase(s, tc_accounting);
|
||||
|
||||
tcase_add_test(tc_accounting, test_accounting_precision);
|
||||
tcase_add_test(tc_accounting, test_billion_laughs_attack_protection_api);
|
||||
tcase_add_test(tc_accounting, test_helper_unsigned_char_to_printable);
|
||||
#else
|
||||
UNUSED_P(s);
|
||||
#endif /* XML_GE == 1 */
|
||||
}
|
||||
@@ -0,0 +1,56 @@
|
||||
/* Tests in the "accounting" test case for the Expat test suite
|
||||
__ __ _
|
||||
___\ \/ /_ __ __ _| |_
|
||||
/ _ \\ /| '_ \ / _` | __|
|
||||
| __// \| |_) | (_| | |_
|
||||
\___/_/\_\ .__/ \__,_|\__|
|
||||
|_| XML parser
|
||||
|
||||
Copyright (c) 2001-2006 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
|
||||
Copyright (c) 2003 Greg Stein <gstein@users.sourceforge.net>
|
||||
Copyright (c) 2005-2007 Steven Solie <steven@solie.ca>
|
||||
Copyright (c) 2005-2012 Karl Waclawek <karl@waclawek.net>
|
||||
Copyright (c) 2016-2022 Sebastian Pipping <sebastian@pipping.org>
|
||||
Copyright (c) 2017-2022 Rhodri James <rhodri@wildebeest.org.uk>
|
||||
Copyright (c) 2017 Joe Orton <jorton@redhat.com>
|
||||
Copyright (c) 2017 José Gutiérrez de la Concha <jose@zeroc.com>
|
||||
Copyright (c) 2018 Marco Maggi <marco.maggi-ipsu@poste.it>
|
||||
Copyright (c) 2019 David Loffredo <loffredo@steptools.com>
|
||||
Copyright (c) 2020 Tim Gates <tim.gates@iress.com>
|
||||
Copyright (c) 2021 Donghee Na <donghee.na@python.org>
|
||||
Licensed under the MIT license:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
persons to whom the Software is furnished to do so, subject to the
|
||||
following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included
|
||||
in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
||||
NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||
USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#ifndef XML_ACC_TESTS_H
|
||||
# define XML_ACC_TESTS_H
|
||||
|
||||
extern void make_accounting_test_case(Suite *s);
|
||||
|
||||
#endif /* XML_ACC_TESTS_H */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
@@ -0,0 +1,32 @@
|
||||
/* C++ compilation harness for the test suite.
|
||||
__ __ _
|
||||
___\ \/ /_ __ __ _| |_
|
||||
/ _ \\ /| '_ \ / _` | __|
|
||||
| __// \| |_) | (_| | |_
|
||||
\___/_/\_\ .__/ \__,_|\__|
|
||||
|_| XML parser
|
||||
|
||||
Copyright (c) 2023 Sebastian Pipping <sebastian@pipping.org>
|
||||
Licensed under the MIT license:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
persons to whom the Software is furnished to do so, subject to the
|
||||
following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included
|
||||
in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
||||
NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||
USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include "acc_tests.c"
|
||||
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,56 @@
|
||||
/* Tests in the "allocation" test case for the Expat test suite
|
||||
__ __ _
|
||||
___\ \/ /_ __ __ _| |_
|
||||
/ _ \\ /| '_ \ / _` | __|
|
||||
| __// \| |_) | (_| | |_
|
||||
\___/_/\_\ .__/ \__,_|\__|
|
||||
|_| XML parser
|
||||
|
||||
Copyright (c) 2001-2006 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
|
||||
Copyright (c) 2003 Greg Stein <gstein@users.sourceforge.net>
|
||||
Copyright (c) 2005-2007 Steven Solie <steven@solie.ca>
|
||||
Copyright (c) 2005-2012 Karl Waclawek <karl@waclawek.net>
|
||||
Copyright (c) 2016-2022 Sebastian Pipping <sebastian@pipping.org>
|
||||
Copyright (c) 2017-2022 Rhodri James <rhodri@wildebeest.org.uk>
|
||||
Copyright (c) 2017 Joe Orton <jorton@redhat.com>
|
||||
Copyright (c) 2017 José Gutiérrez de la Concha <jose@zeroc.com>
|
||||
Copyright (c) 2018 Marco Maggi <marco.maggi-ipsu@poste.it>
|
||||
Copyright (c) 2019 David Loffredo <loffredo@steptools.com>
|
||||
Copyright (c) 2020 Tim Gates <tim.gates@iress.com>
|
||||
Copyright (c) 2021 Donghee Na <donghee.na@python.org>
|
||||
Licensed under the MIT license:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
persons to whom the Software is furnished to do so, subject to the
|
||||
following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included
|
||||
in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
||||
NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||
USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#ifndef XML_ALLOC_TESTS_H
|
||||
# define XML_ALLOC_TESTS_H
|
||||
|
||||
extern void make_alloc_test_case(Suite *s);
|
||||
|
||||
#endif /* XML_ALLOC_TESTS_H */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
@@ -0,0 +1,32 @@
|
||||
/* C++ compilation harness for the test suite.
|
||||
__ __ _
|
||||
___\ \/ /_ __ __ _| |_
|
||||
/ _ \\ /| '_ \ / _` | __|
|
||||
| __// \| |_) | (_| | |_
|
||||
\___/_/\_\ .__/ \__,_|\__|
|
||||
|_| XML parser
|
||||
|
||||
Copyright (c) 2023 Sebastian Pipping <sebastian@pipping.org>
|
||||
Licensed under the MIT license:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
persons to whom the Software is furnished to do so, subject to the
|
||||
following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included
|
||||
in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
||||
NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||
USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include "alloc_tests.c"
|
||||
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,56 @@
|
||||
/* Tests in the "basic" test case for the Expat test suite
|
||||
__ __ _
|
||||
___\ \/ /_ __ __ _| |_
|
||||
/ _ \\ /| '_ \ / _` | __|
|
||||
| __// \| |_) | (_| | |_
|
||||
\___/_/\_\ .__/ \__,_|\__|
|
||||
|_| XML parser
|
||||
|
||||
Copyright (c) 2001-2006 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
|
||||
Copyright (c) 2003 Greg Stein <gstein@users.sourceforge.net>
|
||||
Copyright (c) 2005-2007 Steven Solie <steven@solie.ca>
|
||||
Copyright (c) 2005-2012 Karl Waclawek <karl@waclawek.net>
|
||||
Copyright (c) 2016-2022 Sebastian Pipping <sebastian@pipping.org>
|
||||
Copyright (c) 2017-2022 Rhodri James <rhodri@wildebeest.org.uk>
|
||||
Copyright (c) 2017 Joe Orton <jorton@redhat.com>
|
||||
Copyright (c) 2017 José Gutiérrez de la Concha <jose@zeroc.com>
|
||||
Copyright (c) 2018 Marco Maggi <marco.maggi-ipsu@poste.it>
|
||||
Copyright (c) 2019 David Loffredo <loffredo@steptools.com>
|
||||
Copyright (c) 2020 Tim Gates <tim.gates@iress.com>
|
||||
Copyright (c) 2021 Donghee Na <donghee.na@python.org>
|
||||
Licensed under the MIT license:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
persons to whom the Software is furnished to do so, subject to the
|
||||
following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included
|
||||
in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
||||
NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||
USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#ifndef XML_BASIC_TESTS_H
|
||||
# define XML_BASIC_TESTS_H
|
||||
|
||||
extern void make_basic_test_case(Suite *s);
|
||||
|
||||
#endif /* XML_BASIC_TESTS_H */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
@@ -0,0 +1,32 @@
|
||||
/* C++ compilation harness for the test suite.
|
||||
__ __ _
|
||||
___\ \/ /_ __ __ _| |_
|
||||
/ _ \\ /| '_ \ / _` | __|
|
||||
| __// \| |_) | (_| | |_
|
||||
\___/_/\_\ .__/ \__,_|\__|
|
||||
|_| XML parser
|
||||
|
||||
Copyright (c) 2023 Sebastian Pipping <sebastian@pipping.org>
|
||||
Licensed under the MIT license:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
persons to whom the Software is furnished to do so, subject to the
|
||||
following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included
|
||||
in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
||||
NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||
USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include "basic_tests.c"
|
||||
@@ -133,6 +133,8 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
|
||||
$(top_srcdir)/conftools/ax-append-compile-flags.m4 \
|
||||
$(top_srcdir)/conftools/ax-append-link-flags.m4 \
|
||||
$(top_srcdir)/conftools/expatcfg-compiler-supports-visibility.m4 \
|
||||
$(top_srcdir)/conftools/ax-cxx-compile-stdcxx.m4 \
|
||||
$(top_srcdir)/conftools/ax-cxx-compile-stdcxx-11.m4 \
|
||||
$(top_srcdir)/configure.ac
|
||||
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
||||
$(ACLOCAL_M4)
|
||||
@@ -259,6 +261,7 @@ FGREP = @FGREP@
|
||||
FILECMD = @FILECMD@
|
||||
FILEMAP = @FILEMAP@
|
||||
GREP = @GREP@
|
||||
HAVE_CXX11 = @HAVE_CXX11@
|
||||
INSTALL = @INSTALL@
|
||||
INSTALL_DATA = @INSTALL_DATA@
|
||||
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
||||
@@ -278,6 +281,7 @@ LIPO = @LIPO@
|
||||
LN_S = @LN_S@
|
||||
LTLIBOBJS = @LTLIBOBJS@
|
||||
LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
|
||||
MAINT = @MAINT@
|
||||
MAKEINFO = @MAKEINFO@
|
||||
MANIFEST_TOOL = @MANIFEST_TOOL@
|
||||
MKDIR_P = @MKDIR_P@
|
||||
@@ -368,7 +372,7 @@ all: all-am
|
||||
|
||||
.SUFFIXES:
|
||||
.SUFFIXES: .c .lo .o .obj
|
||||
$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
|
||||
$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
|
||||
@for dep in $?; do \
|
||||
case '$(am__configure_deps)' in \
|
||||
*$$dep*) \
|
||||
@@ -392,9 +396,9 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
||||
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
|
||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||
|
||||
$(top_srcdir)/configure: $(am__configure_deps)
|
||||
$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
|
||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||
$(ACLOCAL_M4): $(am__aclocal_m4_deps)
|
||||
$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
|
||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||
$(am__aclocal_m4_deps):
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
|
||||
Copyright (c) 2003-2006 Karl Waclawek <karl@waclawek.net>
|
||||
Copyright (c) 2005-2007 Steven Solie <steven@solie.ca>
|
||||
Copyright (c) 2017 Sebastian Pipping <sebastian@pipping.org>
|
||||
Copyright (c) 2017-2023 Sebastian Pipping <sebastian@pipping.org>
|
||||
Copyright (c) 2017 Rhodri James <rhodri@wildebeest.org.uk>
|
||||
Licensed under the MIT license:
|
||||
|
||||
@@ -33,6 +33,8 @@
|
||||
*/
|
||||
|
||||
#include <sys/stat.h>
|
||||
#include <assert.h>
|
||||
#include <stddef.h> // ptrdiff_t
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <time.h>
|
||||
@@ -62,7 +64,8 @@ main(int argc, char *argv[]) {
|
||||
char *XMLBuf, *XMLBufEnd, *XMLBufPtr;
|
||||
FILE *fd;
|
||||
struct stat fileAttr;
|
||||
int nrOfLoops, bufferSize, fileSize, i, isFinal;
|
||||
int nrOfLoops, bufferSize, i, isFinal;
|
||||
size_t fileSize;
|
||||
int j = 0, ns = 0;
|
||||
clock_t tstart, tend;
|
||||
double cpuTime = 0.0;
|
||||
@@ -114,12 +117,13 @@ main(int argc, char *argv[]) {
|
||||
isFinal = 0;
|
||||
tstart = clock();
|
||||
do {
|
||||
int parseBufferSize = XMLBufEnd - XMLBufPtr;
|
||||
if (parseBufferSize <= bufferSize)
|
||||
ptrdiff_t parseBufferSize = XMLBufEnd - XMLBufPtr;
|
||||
if (parseBufferSize <= (ptrdiff_t)bufferSize)
|
||||
isFinal = 1;
|
||||
else
|
||||
parseBufferSize = bufferSize;
|
||||
if (! XML_Parse(parser, XMLBufPtr, parseBufferSize, isFinal)) {
|
||||
assert(parseBufferSize <= (ptrdiff_t)bufferSize);
|
||||
if (! XML_Parse(parser, XMLBufPtr, (int)parseBufferSize, isFinal)) {
|
||||
fprintf(stderr,
|
||||
"error '%" XML_FMT_STR "' at line %" XML_FMT_INT_MOD
|
||||
"u character %" XML_FMT_INT_MOD "u\n",
|
||||
|
||||
@@ -9,9 +9,10 @@
|
||||
Copyright (c) 2002-2004 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
|
||||
Copyright (c) 2003 Greg Stein <gstein@users.sourceforge.net>
|
||||
Copyright (c) 2016 Gilles Espinasse <g.esp@free.fr>
|
||||
Copyright (c) 2016-2021 Sebastian Pipping <sebastian@pipping.org>
|
||||
Copyright (c) 2016-2023 Sebastian Pipping <sebastian@pipping.org>
|
||||
Copyright (c) 2017 Joe Orton <jorton@redhat.com>
|
||||
Copyright (c) 2017 Rhodri James <rhodri@wildebeest.org.uk>
|
||||
Copyright (c) 2022 Sean McBride <sean@rogue-research.com>
|
||||
Licensed under the MIT license:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
@@ -34,7 +35,11 @@
|
||||
USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <expat_config.h>
|
||||
#if defined(NDEBUG)
|
||||
# undef NDEBUG /* because test suite relies on assert(...) at the moment */
|
||||
#endif
|
||||
|
||||
#include "expat_config.h"
|
||||
#include "minicheck.h"
|
||||
|
||||
#include <assert.h>
|
||||
@@ -80,15 +85,16 @@ CharData_AppendXMLChars(CharData *storage, const XML_Char *s, int len) {
|
||||
|
||||
int
|
||||
CharData_CheckXMLChars(CharData *storage, const XML_Char *expected) {
|
||||
char buffer[1024];
|
||||
int len = xmlstrlen(expected);
|
||||
int count;
|
||||
|
||||
assert(storage != NULL);
|
||||
count = (storage->count < 0) ? 0 : storage->count;
|
||||
if (len != count) {
|
||||
sprintf(buffer, "wrong number of data characters: got %d, expected %d",
|
||||
count, len);
|
||||
char buffer[1024];
|
||||
snprintf(buffer, sizeof(buffer),
|
||||
"wrong number of data characters: got %d, expected %d", count,
|
||||
len);
|
||||
fail(buffer);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
/* C++ compilation harness for the test suite.
|
||||
__ __ _
|
||||
___\ \/ /_ __ __ _| |_
|
||||
/ _ \\ /| '_ \ / _` | __|
|
||||
| __// \| |_) | (_| | |_
|
||||
\___/_/\_\ .__/ \__,_|\__|
|
||||
|_| XML parser
|
||||
|
||||
Copyright (c) 2023 Sebastian Pipping <sebastian@pipping.org>
|
||||
Licensed under the MIT license:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
persons to whom the Software is furnished to do so, subject to the
|
||||
following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included
|
||||
in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
||||
NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||
USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include "chardata.c"
|
||||
@@ -0,0 +1,325 @@
|
||||
/* Commonly used functions for the Expat test suite
|
||||
__ __ _
|
||||
___\ \/ /_ __ __ _| |_
|
||||
/ _ \\ /| '_ \ / _` | __|
|
||||
| __// \| |_) | (_| | |_
|
||||
\___/_/\_\ .__/ \__,_|\__|
|
||||
|_| XML parser
|
||||
|
||||
Copyright (c) 2001-2006 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
|
||||
Copyright (c) 2003 Greg Stein <gstein@users.sourceforge.net>
|
||||
Copyright (c) 2005-2007 Steven Solie <steven@solie.ca>
|
||||
Copyright (c) 2005-2012 Karl Waclawek <karl@waclawek.net>
|
||||
Copyright (c) 2016-2023 Sebastian Pipping <sebastian@pipping.org>
|
||||
Copyright (c) 2017-2022 Rhodri James <rhodri@wildebeest.org.uk>
|
||||
Copyright (c) 2017 Joe Orton <jorton@redhat.com>
|
||||
Copyright (c) 2017 José Gutiérrez de la Concha <jose@zeroc.com>
|
||||
Copyright (c) 2018 Marco Maggi <marco.maggi-ipsu@poste.it>
|
||||
Copyright (c) 2019 David Loffredo <loffredo@steptools.com>
|
||||
Copyright (c) 2020 Tim Gates <tim.gates@iress.com>
|
||||
Copyright (c) 2021 Donghee Na <donghee.na@python.org>
|
||||
Copyright (c) 2023-2024 Sony Corporation / Snild Dolkow <snild@sony.com>
|
||||
Licensed under the MIT license:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
persons to whom the Software is furnished to do so, subject to the
|
||||
following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included
|
||||
in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
||||
NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||
USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "expat_config.h"
|
||||
#include "expat.h"
|
||||
#include "internal.h"
|
||||
#include "chardata.h"
|
||||
#include "minicheck.h"
|
||||
#include "common.h"
|
||||
|
||||
/* Common test data */
|
||||
|
||||
const char *long_character_data_text
|
||||
= "<?xml version='1.0' encoding='iso-8859-1'?><s>"
|
||||
"012345678901234567890123456789012345678901234567890123456789"
|
||||
"012345678901234567890123456789012345678901234567890123456789"
|
||||
"012345678901234567890123456789012345678901234567890123456789"
|
||||
"012345678901234567890123456789012345678901234567890123456789"
|
||||
"012345678901234567890123456789012345678901234567890123456789"
|
||||
"012345678901234567890123456789012345678901234567890123456789"
|
||||
"012345678901234567890123456789012345678901234567890123456789"
|
||||
"012345678901234567890123456789012345678901234567890123456789"
|
||||
"012345678901234567890123456789012345678901234567890123456789"
|
||||
"012345678901234567890123456789012345678901234567890123456789"
|
||||
"012345678901234567890123456789012345678901234567890123456789"
|
||||
"012345678901234567890123456789012345678901234567890123456789"
|
||||
"012345678901234567890123456789012345678901234567890123456789"
|
||||
"012345678901234567890123456789012345678901234567890123456789"
|
||||
"012345678901234567890123456789012345678901234567890123456789"
|
||||
"012345678901234567890123456789012345678901234567890123456789"
|
||||
"012345678901234567890123456789012345678901234567890123456789"
|
||||
"012345678901234567890123456789012345678901234567890123456789"
|
||||
"012345678901234567890123456789012345678901234567890123456789"
|
||||
"012345678901234567890123456789012345678901234567890123456789"
|
||||
"</s>";
|
||||
|
||||
const char *long_cdata_text
|
||||
= "<s><![CDATA["
|
||||
"012345678901234567890123456789012345678901234567890123456789"
|
||||
"012345678901234567890123456789012345678901234567890123456789"
|
||||
"012345678901234567890123456789012345678901234567890123456789"
|
||||
"012345678901234567890123456789012345678901234567890123456789"
|
||||
"012345678901234567890123456789012345678901234567890123456789"
|
||||
"012345678901234567890123456789012345678901234567890123456789"
|
||||
"012345678901234567890123456789012345678901234567890123456789"
|
||||
"012345678901234567890123456789012345678901234567890123456789"
|
||||
"012345678901234567890123456789012345678901234567890123456789"
|
||||
"012345678901234567890123456789012345678901234567890123456789"
|
||||
"012345678901234567890123456789012345678901234567890123456789"
|
||||
"012345678901234567890123456789012345678901234567890123456789"
|
||||
"012345678901234567890123456789012345678901234567890123456789"
|
||||
"012345678901234567890123456789012345678901234567890123456789"
|
||||
"012345678901234567890123456789012345678901234567890123456789"
|
||||
"012345678901234567890123456789012345678901234567890123456789"
|
||||
"012345678901234567890123456789012345678901234567890123456789"
|
||||
"012345678901234567890123456789012345678901234567890123456789"
|
||||
"012345678901234567890123456789012345678901234567890123456789"
|
||||
"012345678901234567890123456789012345678901234567890123456789"
|
||||
"]]></s>";
|
||||
|
||||
/* Having an element name longer than 1024 characters exercises some
|
||||
* of the pool allocation code in the parser that otherwise does not
|
||||
* get executed. The count at the end of the line is the number of
|
||||
* characters (bytes) in the element name by that point.x
|
||||
*/
|
||||
const char *get_buffer_test_text
|
||||
= "<documentwitharidiculouslylongelementnametotease" /* 0x030 */
|
||||
"aparticularcorneroftheallocationinXML_GetBuffers" /* 0x060 */
|
||||
"othatwecanimprovethecoverageyetagain012345678901" /* 0x090 */
|
||||
"123456789abcdef0123456789abcdef0123456789abcdef0" /* 0x0c0 */
|
||||
"123456789abcdef0123456789abcdef0123456789abcdef0" /* 0x0f0 */
|
||||
"123456789abcdef0123456789abcdef0123456789abcdef0" /* 0x120 */
|
||||
"123456789abcdef0123456789abcdef0123456789abcdef0" /* 0x150 */
|
||||
"123456789abcdef0123456789abcdef0123456789abcdef0" /* 0x180 */
|
||||
"123456789abcdef0123456789abcdef0123456789abcdef0" /* 0x1b0 */
|
||||
"123456789abcdef0123456789abcdef0123456789abcdef0" /* 0x1e0 */
|
||||
"123456789abcdef0123456789abcdef0123456789abcdef0" /* 0x210 */
|
||||
"123456789abcdef0123456789abcdef0123456789abcdef0" /* 0x240 */
|
||||
"123456789abcdef0123456789abcdef0123456789abcdef0" /* 0x270 */
|
||||
"123456789abcdef0123456789abcdef0123456789abcdef0" /* 0x2a0 */
|
||||
"123456789abcdef0123456789abcdef0123456789abcdef0" /* 0x2d0 */
|
||||
"123456789abcdef0123456789abcdef0123456789abcdef0" /* 0x300 */
|
||||
"123456789abcdef0123456789abcdef0123456789abcdef0" /* 0x330 */
|
||||
"123456789abcdef0123456789abcdef0123456789abcdef0" /* 0x360 */
|
||||
"123456789abcdef0123456789abcdef0123456789abcdef0" /* 0x390 */
|
||||
"123456789abcdef0123456789abcdef0123456789abcdef0" /* 0x3c0 */
|
||||
"123456789abcdef0123456789abcdef0123456789abcdef0" /* 0x3f0 */
|
||||
"123456789abcdef0123456789abcdef0123456789>\n<ef0"; /* 0x420 */
|
||||
|
||||
/* Test control globals */
|
||||
|
||||
/* Used as the "resumable" parameter to XML_StopParser by some tests */
|
||||
XML_Bool g_resumable = XML_FALSE;
|
||||
|
||||
/* Used to control abort checks in some tests */
|
||||
XML_Bool g_abortable = XML_FALSE;
|
||||
|
||||
/* Used to control _XML_Parse_SINGLE_BYTES() chunk size */
|
||||
int g_chunkSize = 1;
|
||||
|
||||
/* Common test functions */
|
||||
|
||||
void
|
||||
tcase_add_test__ifdef_xml_dtd(TCase *tc, tcase_test_function test) {
|
||||
#ifdef XML_DTD
|
||||
tcase_add_test(tc, test);
|
||||
#else
|
||||
UNUSED_P(tc);
|
||||
UNUSED_P(test);
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
tcase_add_test__if_xml_ge(TCase *tc, tcase_test_function test) {
|
||||
#if XML_GE == 1
|
||||
tcase_add_test(tc, test);
|
||||
#else
|
||||
UNUSED_P(tc);
|
||||
UNUSED_P(test);
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
basic_teardown(void) {
|
||||
if (g_parser != NULL) {
|
||||
XML_ParserFree(g_parser);
|
||||
g_parser = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
/* Generate a failure using the parser state to create an error message;
|
||||
this should be used when the parser reports an error we weren't
|
||||
expecting.
|
||||
*/
|
||||
void
|
||||
_xml_failure(XML_Parser parser, const char *file, int line) {
|
||||
char buffer[1024];
|
||||
enum XML_Error err = XML_GetErrorCode(parser);
|
||||
snprintf(buffer, sizeof(buffer),
|
||||
" %d: %" XML_FMT_STR " (line %" XML_FMT_INT_MOD
|
||||
"u, offset %" XML_FMT_INT_MOD "u)\n reported from %s, line %d\n",
|
||||
err, XML_ErrorString(err), XML_GetCurrentLineNumber(parser),
|
||||
XML_GetCurrentColumnNumber(parser), file, line);
|
||||
_fail(file, line, buffer);
|
||||
}
|
||||
|
||||
enum XML_Status
|
||||
_XML_Parse_SINGLE_BYTES(XML_Parser parser, const char *s, int len,
|
||||
int isFinal) {
|
||||
// This ensures that tests have to run pathological parse cases
|
||||
// (e.g. when `s` is NULL) against plain XML_Parse rather than
|
||||
// chunking _XML_Parse_SINGLE_BYTES.
|
||||
assert((parser != NULL) && (s != NULL) && (len >= 0));
|
||||
const int chunksize = g_chunkSize;
|
||||
if (chunksize > 0) {
|
||||
// parse in chunks of `chunksize` bytes as long as not exhausting
|
||||
for (; len > chunksize; len -= chunksize, s += chunksize) {
|
||||
enum XML_Status res = XML_Parse(parser, s, chunksize, XML_FALSE);
|
||||
if (res != XML_STATUS_OK) {
|
||||
return res;
|
||||
}
|
||||
}
|
||||
}
|
||||
// parse the final chunk, the size of which will be <= chunksize
|
||||
return XML_Parse(parser, s, len, isFinal);
|
||||
}
|
||||
|
||||
void
|
||||
_expect_failure(const char *text, enum XML_Error errorCode,
|
||||
const char *errorMessage, const char *file, int lineno) {
|
||||
if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
|
||||
== XML_STATUS_OK)
|
||||
/* Hackish use of _fail() macro, but lets us report
|
||||
the right filename and line number. */
|
||||
_fail(file, lineno, errorMessage);
|
||||
if (XML_GetErrorCode(g_parser) != errorCode)
|
||||
_xml_failure(g_parser, file, lineno);
|
||||
}
|
||||
|
||||
/* Character data support for handlers, built on top of the code in
|
||||
* chardata.c
|
||||
*/
|
||||
void XMLCALL
|
||||
accumulate_characters(void *userData, const XML_Char *s, int len) {
|
||||
CharData_AppendXMLChars((CharData *)userData, s, len);
|
||||
}
|
||||
|
||||
void XMLCALL
|
||||
accumulate_attribute(void *userData, const XML_Char *name,
|
||||
const XML_Char **atts) {
|
||||
CharData *storage = (CharData *)userData;
|
||||
UNUSED_P(name);
|
||||
/* Check there are attributes to deal with */
|
||||
if (atts == NULL)
|
||||
return;
|
||||
|
||||
while (storage->count < 0 && atts[0] != NULL) {
|
||||
/* "accumulate" the value of the first attribute we see */
|
||||
CharData_AppendXMLChars(storage, atts[1], -1);
|
||||
atts += 2;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
_run_character_check(const char *text, const XML_Char *expected,
|
||||
const char *file, int line) {
|
||||
CharData storage;
|
||||
|
||||
CharData_Init(&storage);
|
||||
XML_SetUserData(g_parser, &storage);
|
||||
XML_SetCharacterDataHandler(g_parser, accumulate_characters);
|
||||
if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
|
||||
== XML_STATUS_ERROR)
|
||||
_xml_failure(g_parser, file, line);
|
||||
CharData_CheckXMLChars(&storage, expected);
|
||||
}
|
||||
|
||||
void
|
||||
_run_attribute_check(const char *text, const XML_Char *expected,
|
||||
const char *file, int line) {
|
||||
CharData storage;
|
||||
|
||||
CharData_Init(&storage);
|
||||
XML_SetUserData(g_parser, &storage);
|
||||
XML_SetStartElementHandler(g_parser, accumulate_attribute);
|
||||
if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
|
||||
== XML_STATUS_ERROR)
|
||||
_xml_failure(g_parser, file, line);
|
||||
CharData_CheckXMLChars(&storage, expected);
|
||||
}
|
||||
|
||||
void XMLCALL
|
||||
ext_accumulate_characters(void *userData, const XML_Char *s, int len) {
|
||||
ExtTest *test_data = (ExtTest *)userData;
|
||||
accumulate_characters(test_data->storage, s, len);
|
||||
}
|
||||
|
||||
void
|
||||
_run_ext_character_check(const char *text, ExtTest *test_data,
|
||||
const XML_Char *expected, const char *file, int line) {
|
||||
CharData *const storage = (CharData *)malloc(sizeof(CharData));
|
||||
|
||||
CharData_Init(storage);
|
||||
test_data->storage = storage;
|
||||
XML_SetUserData(g_parser, test_data);
|
||||
XML_SetCharacterDataHandler(g_parser, ext_accumulate_characters);
|
||||
if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
|
||||
== XML_STATUS_ERROR)
|
||||
_xml_failure(g_parser, file, line);
|
||||
CharData_CheckXMLChars(storage, expected);
|
||||
|
||||
free(storage);
|
||||
}
|
||||
|
||||
/* Control variable; the number of times duff_allocator() will successfully
|
||||
* allocate */
|
||||
#define ALLOC_ALWAYS_SUCCEED (-1)
|
||||
#define REALLOC_ALWAYS_SUCCEED (-1)
|
||||
|
||||
int g_allocation_count = ALLOC_ALWAYS_SUCCEED;
|
||||
int g_reallocation_count = REALLOC_ALWAYS_SUCCEED;
|
||||
|
||||
/* Crocked allocator for allocation failure tests */
|
||||
void *
|
||||
duff_allocator(size_t size) {
|
||||
if (g_allocation_count == 0)
|
||||
return NULL;
|
||||
if (g_allocation_count != ALLOC_ALWAYS_SUCCEED)
|
||||
g_allocation_count--;
|
||||
return malloc(size);
|
||||
}
|
||||
|
||||
/* Crocked reallocator for allocation failure tests */
|
||||
void *
|
||||
duff_reallocator(void *ptr, size_t size) {
|
||||
if (g_reallocation_count == 0)
|
||||
return NULL;
|
||||
if (g_reallocation_count != REALLOC_ALWAYS_SUCCEED)
|
||||
g_reallocation_count--;
|
||||
return realloc(ptr, size);
|
||||
}
|
||||
@@ -0,0 +1,162 @@
|
||||
/* Commonly used functions for the Expat test suite
|
||||
__ __ _
|
||||
___\ \/ /_ __ __ _| |_
|
||||
/ _ \\ /| '_ \ / _` | __|
|
||||
| __// \| |_) | (_| | |_
|
||||
\___/_/\_\ .__/ \__,_|\__|
|
||||
|_| XML parser
|
||||
|
||||
Copyright (c) 2001-2006 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
|
||||
Copyright (c) 2003 Greg Stein <gstein@users.sourceforge.net>
|
||||
Copyright (c) 2005-2007 Steven Solie <steven@solie.ca>
|
||||
Copyright (c) 2005-2012 Karl Waclawek <karl@waclawek.net>
|
||||
Copyright (c) 2016-2023 Sebastian Pipping <sebastian@pipping.org>
|
||||
Copyright (c) 2017-2022 Rhodri James <rhodri@wildebeest.org.uk>
|
||||
Copyright (c) 2017 Joe Orton <jorton@redhat.com>
|
||||
Copyright (c) 2017 José Gutiérrez de la Concha <jose@zeroc.com>
|
||||
Copyright (c) 2018 Marco Maggi <marco.maggi-ipsu@poste.it>
|
||||
Copyright (c) 2019 David Loffredo <loffredo@steptools.com>
|
||||
Copyright (c) 2020 Tim Gates <tim.gates@iress.com>
|
||||
Copyright (c) 2021 Donghee Na <donghee.na@python.org>
|
||||
Copyright (c) 2023 Sony Corporation / Snild Dolkow <snild@sony.com>
|
||||
Licensed under the MIT license:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
persons to whom the Software is furnished to do so, subject to the
|
||||
following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included
|
||||
in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
||||
NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||
USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#ifndef XML_COMMON_H
|
||||
# define XML_COMMON_H
|
||||
|
||||
# include "expat_config.h"
|
||||
# include "minicheck.h"
|
||||
# include "chardata.h"
|
||||
|
||||
# ifdef XML_LARGE_SIZE
|
||||
# define XML_FMT_INT_MOD "ll"
|
||||
# else
|
||||
# define XML_FMT_INT_MOD "l"
|
||||
# endif
|
||||
|
||||
# ifdef XML_UNICODE_WCHAR_T
|
||||
# define XML_FMT_STR "ls"
|
||||
# include <wchar.h>
|
||||
# define xcstrlen(s) wcslen(s)
|
||||
# define xcstrcmp(s, t) wcscmp((s), (t))
|
||||
# define xcstrncmp(s, t, n) wcsncmp((s), (t), (n))
|
||||
# define XCS(s) _XCS(s)
|
||||
# define _XCS(s) L##s
|
||||
# else
|
||||
# ifdef XML_UNICODE
|
||||
# error "No support for UTF-16 character without wchar_t in tests"
|
||||
# else
|
||||
# define XML_FMT_STR "s"
|
||||
# define xcstrlen(s) strlen(s)
|
||||
# define xcstrcmp(s, t) strcmp((s), (t))
|
||||
# define xcstrncmp(s, t, n) strncmp((s), (t), (n))
|
||||
# define XCS(s) s
|
||||
# endif /* XML_UNICODE */
|
||||
# endif /* XML_UNICODE_WCHAR_T */
|
||||
|
||||
extern XML_Parser g_parser;
|
||||
|
||||
extern XML_Bool g_resumable;
|
||||
extern XML_Bool g_abortable;
|
||||
|
||||
extern int g_chunkSize;
|
||||
|
||||
extern const char *long_character_data_text;
|
||||
extern const char *long_cdata_text;
|
||||
extern const char *get_buffer_test_text;
|
||||
|
||||
extern void tcase_add_test__ifdef_xml_dtd(TCase *tc, tcase_test_function test);
|
||||
extern void tcase_add_test__if_xml_ge(TCase *tc, tcase_test_function test);
|
||||
|
||||
extern void basic_teardown(void);
|
||||
|
||||
extern void _xml_failure(XML_Parser parser, const char *file, int line);
|
||||
|
||||
# define xml_failure(parser) _xml_failure((parser), __FILE__, __LINE__)
|
||||
|
||||
extern enum XML_Status _XML_Parse_SINGLE_BYTES(XML_Parser parser, const char *s,
|
||||
int len, int isFinal);
|
||||
|
||||
extern void _expect_failure(const char *text, enum XML_Error errorCode,
|
||||
const char *errorMessage, const char *file,
|
||||
int lineno);
|
||||
|
||||
# define expect_failure(text, errorCode, errorMessage) \
|
||||
_expect_failure((text), (errorCode), (errorMessage), __FILE__, __LINE__)
|
||||
|
||||
/* Support functions for handlers to collect up character and attribute data.
|
||||
*/
|
||||
|
||||
extern void XMLCALL accumulate_characters(void *userData, const XML_Char *s,
|
||||
int len);
|
||||
|
||||
extern void XMLCALL accumulate_attribute(void *userData, const XML_Char *name,
|
||||
const XML_Char **atts);
|
||||
|
||||
extern void _run_character_check(const char *text, const XML_Char *expected,
|
||||
const char *file, int line);
|
||||
|
||||
# define run_character_check(text, expected) \
|
||||
_run_character_check(text, expected, __FILE__, __LINE__)
|
||||
|
||||
extern void _run_attribute_check(const char *text, const XML_Char *expected,
|
||||
const char *file, int line);
|
||||
|
||||
# define run_attribute_check(text, expected) \
|
||||
_run_attribute_check(text, expected, __FILE__, __LINE__)
|
||||
|
||||
typedef struct ExtTest {
|
||||
const char *parse_text;
|
||||
const XML_Char *encoding;
|
||||
CharData *storage;
|
||||
} ExtTest;
|
||||
|
||||
extern void XMLCALL ext_accumulate_characters(void *userData, const XML_Char *s,
|
||||
int len);
|
||||
|
||||
extern void _run_ext_character_check(const char *text, ExtTest *test_data,
|
||||
const XML_Char *expected, const char *file,
|
||||
int line);
|
||||
|
||||
# define run_ext_character_check(text, test_data, expected) \
|
||||
_run_ext_character_check(text, test_data, expected, __FILE__, __LINE__)
|
||||
|
||||
# define ALLOC_ALWAYS_SUCCEED (-1)
|
||||
# define REALLOC_ALWAYS_SUCCEED (-1)
|
||||
|
||||
extern int g_allocation_count;
|
||||
extern int g_reallocation_count;
|
||||
|
||||
extern void *duff_allocator(size_t size);
|
||||
|
||||
extern void *duff_reallocator(void *ptr, size_t size);
|
||||
|
||||
#endif /* XML_COMMON_H */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
@@ -0,0 +1,32 @@
|
||||
/* C++ compilation harness for the test suite.
|
||||
__ __ _
|
||||
___\ \/ /_ __ __ _| |_
|
||||
/ _ \\ /| '_ \ / _` | __|
|
||||
| __// \| |_) | (_| | |_
|
||||
\___/_/\_\ .__/ \__,_|\__|
|
||||
|_| XML parser
|
||||
|
||||
Copyright (c) 2023 Sebastian Pipping <sebastian@pipping.org>
|
||||
Licensed under the MIT license:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
persons to whom the Software is furnished to do so, subject to the
|
||||
following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included
|
||||
in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
||||
NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||
USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include "common.c"
|
||||
@@ -0,0 +1,261 @@
|
||||
/* Dummy handler functions for the Expat test suite
|
||||
__ __ _
|
||||
___\ \/ /_ __ __ _| |_
|
||||
/ _ \\ /| '_ \ / _` | __|
|
||||
| __// \| |_) | (_| | |_
|
||||
\___/_/\_\ .__/ \__,_|\__|
|
||||
|_| XML parser
|
||||
|
||||
Copyright (c) 2001-2006 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
|
||||
Copyright (c) 2003 Greg Stein <gstein@users.sourceforge.net>
|
||||
Copyright (c) 2005-2007 Steven Solie <steven@solie.ca>
|
||||
Copyright (c) 2005-2012 Karl Waclawek <karl@waclawek.net>
|
||||
Copyright (c) 2016-2022 Sebastian Pipping <sebastian@pipping.org>
|
||||
Copyright (c) 2017-2022 Rhodri James <rhodri@wildebeest.org.uk>
|
||||
Copyright (c) 2017 Joe Orton <jorton@redhat.com>
|
||||
Copyright (c) 2017 José Gutiérrez de la Concha <jose@zeroc.com>
|
||||
Copyright (c) 2018 Marco Maggi <marco.maggi-ipsu@poste.it>
|
||||
Copyright (c) 2019 David Loffredo <loffredo@steptools.com>
|
||||
Copyright (c) 2020 Tim Gates <tim.gates@iress.com>
|
||||
Copyright (c) 2021 Donghee Na <donghee.na@python.org>
|
||||
Licensed under the MIT license:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
persons to whom the Software is furnished to do so, subject to the
|
||||
following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included
|
||||
in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
||||
NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||
USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include "expat.h"
|
||||
#include "internal.h"
|
||||
#include "common.h"
|
||||
#include "dummy.h"
|
||||
|
||||
/* Dummy handlers for when we need to set a handler to tickle a bug,
|
||||
but it doesn't need to do anything.
|
||||
*/
|
||||
static unsigned long dummy_handler_flags = 0;
|
||||
|
||||
void
|
||||
init_dummy_handlers(void) {
|
||||
dummy_handler_flags = 0;
|
||||
}
|
||||
|
||||
unsigned long
|
||||
get_dummy_handler_flags(void) {
|
||||
return dummy_handler_flags;
|
||||
}
|
||||
|
||||
void XMLCALL
|
||||
dummy_xdecl_handler(void *userData, const XML_Char *version,
|
||||
const XML_Char *encoding, int standalone) {
|
||||
UNUSED_P(userData);
|
||||
UNUSED_P(version);
|
||||
UNUSED_P(encoding);
|
||||
UNUSED_P(standalone);
|
||||
}
|
||||
|
||||
void XMLCALL
|
||||
dummy_start_doctype_handler(void *userData, const XML_Char *doctypeName,
|
||||
const XML_Char *sysid, const XML_Char *pubid,
|
||||
int has_internal_subset) {
|
||||
UNUSED_P(userData);
|
||||
UNUSED_P(doctypeName);
|
||||
UNUSED_P(sysid);
|
||||
UNUSED_P(pubid);
|
||||
UNUSED_P(has_internal_subset);
|
||||
dummy_handler_flags |= DUMMY_START_DOCTYPE_HANDLER_FLAG;
|
||||
}
|
||||
|
||||
void XMLCALL
|
||||
dummy_end_doctype_handler(void *userData) {
|
||||
UNUSED_P(userData);
|
||||
dummy_handler_flags |= DUMMY_END_DOCTYPE_HANDLER_FLAG;
|
||||
}
|
||||
|
||||
void XMLCALL
|
||||
dummy_entity_decl_handler(void *userData, const XML_Char *entityName,
|
||||
int is_parameter_entity, const XML_Char *value,
|
||||
int value_length, const XML_Char *base,
|
||||
const XML_Char *systemId, const XML_Char *publicId,
|
||||
const XML_Char *notationName) {
|
||||
UNUSED_P(userData);
|
||||
UNUSED_P(entityName);
|
||||
UNUSED_P(is_parameter_entity);
|
||||
UNUSED_P(value);
|
||||
UNUSED_P(value_length);
|
||||
UNUSED_P(base);
|
||||
UNUSED_P(systemId);
|
||||
UNUSED_P(publicId);
|
||||
UNUSED_P(notationName);
|
||||
dummy_handler_flags |= DUMMY_ENTITY_DECL_HANDLER_FLAG;
|
||||
}
|
||||
|
||||
void XMLCALL
|
||||
dummy_notation_decl_handler(void *userData, const XML_Char *notationName,
|
||||
const XML_Char *base, const XML_Char *systemId,
|
||||
const XML_Char *publicId) {
|
||||
UNUSED_P(userData);
|
||||
UNUSED_P(notationName);
|
||||
UNUSED_P(base);
|
||||
UNUSED_P(systemId);
|
||||
UNUSED_P(publicId);
|
||||
dummy_handler_flags |= DUMMY_NOTATION_DECL_HANDLER_FLAG;
|
||||
}
|
||||
|
||||
void XMLCALL
|
||||
dummy_element_decl_handler(void *userData, const XML_Char *name,
|
||||
XML_Content *model) {
|
||||
UNUSED_P(userData);
|
||||
UNUSED_P(name);
|
||||
/* The content model must be freed by the handler. Unfortunately
|
||||
* we cannot pass the parser as the userData because this is used
|
||||
* with other handlers that require other userData.
|
||||
*/
|
||||
XML_FreeContentModel(g_parser, model);
|
||||
dummy_handler_flags |= DUMMY_ELEMENT_DECL_HANDLER_FLAG;
|
||||
}
|
||||
|
||||
void XMLCALL
|
||||
dummy_attlist_decl_handler(void *userData, const XML_Char *elname,
|
||||
const XML_Char *attname, const XML_Char *att_type,
|
||||
const XML_Char *dflt, int isrequired) {
|
||||
UNUSED_P(userData);
|
||||
UNUSED_P(elname);
|
||||
UNUSED_P(attname);
|
||||
UNUSED_P(att_type);
|
||||
UNUSED_P(dflt);
|
||||
UNUSED_P(isrequired);
|
||||
dummy_handler_flags |= DUMMY_ATTLIST_DECL_HANDLER_FLAG;
|
||||
}
|
||||
|
||||
void XMLCALL
|
||||
dummy_comment_handler(void *userData, const XML_Char *data) {
|
||||
UNUSED_P(userData);
|
||||
UNUSED_P(data);
|
||||
dummy_handler_flags |= DUMMY_COMMENT_HANDLER_FLAG;
|
||||
}
|
||||
|
||||
void XMLCALL
|
||||
dummy_pi_handler(void *userData, const XML_Char *target, const XML_Char *data) {
|
||||
UNUSED_P(userData);
|
||||
UNUSED_P(target);
|
||||
UNUSED_P(data);
|
||||
dummy_handler_flags |= DUMMY_PI_HANDLER_FLAG;
|
||||
}
|
||||
|
||||
void XMLCALL
|
||||
dummy_start_element(void *userData, const XML_Char *name,
|
||||
const XML_Char **atts) {
|
||||
UNUSED_P(userData);
|
||||
UNUSED_P(name);
|
||||
UNUSED_P(atts);
|
||||
dummy_handler_flags |= DUMMY_START_ELEMENT_HANDLER_FLAG;
|
||||
}
|
||||
|
||||
void XMLCALL
|
||||
dummy_end_element(void *userData, const XML_Char *name) {
|
||||
UNUSED_P(userData);
|
||||
UNUSED_P(name);
|
||||
}
|
||||
|
||||
void XMLCALL
|
||||
dummy_start_cdata_handler(void *userData) {
|
||||
UNUSED_P(userData);
|
||||
dummy_handler_flags |= DUMMY_START_CDATA_HANDLER_FLAG;
|
||||
}
|
||||
|
||||
void XMLCALL
|
||||
dummy_end_cdata_handler(void *userData) {
|
||||
UNUSED_P(userData);
|
||||
dummy_handler_flags |= DUMMY_END_CDATA_HANDLER_FLAG;
|
||||
}
|
||||
|
||||
void XMLCALL
|
||||
dummy_cdata_handler(void *userData, const XML_Char *s, int len) {
|
||||
UNUSED_P(userData);
|
||||
UNUSED_P(s);
|
||||
UNUSED_P(len);
|
||||
}
|
||||
|
||||
void XMLCALL
|
||||
dummy_start_namespace_decl_handler(void *userData, const XML_Char *prefix,
|
||||
const XML_Char *uri) {
|
||||
UNUSED_P(userData);
|
||||
UNUSED_P(prefix);
|
||||
UNUSED_P(uri);
|
||||
dummy_handler_flags |= DUMMY_START_NS_DECL_HANDLER_FLAG;
|
||||
}
|
||||
|
||||
void XMLCALL
|
||||
dummy_end_namespace_decl_handler(void *userData, const XML_Char *prefix) {
|
||||
UNUSED_P(userData);
|
||||
UNUSED_P(prefix);
|
||||
dummy_handler_flags |= DUMMY_END_NS_DECL_HANDLER_FLAG;
|
||||
}
|
||||
|
||||
/* This handler is obsolete, but while the code exists we should
|
||||
* ensure that dealing with the handler is covered by tests.
|
||||
*/
|
||||
void XMLCALL
|
||||
dummy_unparsed_entity_decl_handler(void *userData, const XML_Char *entityName,
|
||||
const XML_Char *base,
|
||||
const XML_Char *systemId,
|
||||
const XML_Char *publicId,
|
||||
const XML_Char *notationName) {
|
||||
UNUSED_P(userData);
|
||||
UNUSED_P(entityName);
|
||||
UNUSED_P(base);
|
||||
UNUSED_P(systemId);
|
||||
UNUSED_P(publicId);
|
||||
UNUSED_P(notationName);
|
||||
dummy_handler_flags |= DUMMY_UNPARSED_ENTITY_DECL_HANDLER_FLAG;
|
||||
}
|
||||
|
||||
void XMLCALL
|
||||
dummy_default_handler(void *userData, const XML_Char *s, int len) {
|
||||
UNUSED_P(userData);
|
||||
UNUSED_P(s);
|
||||
UNUSED_P(len);
|
||||
}
|
||||
|
||||
void XMLCALL
|
||||
dummy_start_doctype_decl_handler(void *userData, const XML_Char *doctypeName,
|
||||
const XML_Char *sysid, const XML_Char *pubid,
|
||||
int has_internal_subset) {
|
||||
UNUSED_P(userData);
|
||||
UNUSED_P(doctypeName);
|
||||
UNUSED_P(sysid);
|
||||
UNUSED_P(pubid);
|
||||
UNUSED_P(has_internal_subset);
|
||||
dummy_handler_flags |= DUMMY_START_DOCTYPE_DECL_HANDLER_FLAG;
|
||||
}
|
||||
|
||||
void XMLCALL
|
||||
dummy_end_doctype_decl_handler(void *userData) {
|
||||
UNUSED_P(userData);
|
||||
dummy_handler_flags |= DUMMY_END_DOCTYPE_DECL_HANDLER_FLAG;
|
||||
}
|
||||
|
||||
void XMLCALL
|
||||
dummy_skip_handler(void *userData, const XML_Char *entityName,
|
||||
int is_parameter_entity) {
|
||||
UNUSED_P(userData);
|
||||
UNUSED_P(entityName);
|
||||
UNUSED_P(is_parameter_entity);
|
||||
dummy_handler_flags |= DUMMY_SKIP_HANDLER_FLAG;
|
||||
}
|
||||
@@ -0,0 +1,150 @@
|
||||
/* Dummy handler functions for the Expat test suite
|
||||
__ __ _
|
||||
___\ \/ /_ __ __ _| |_
|
||||
/ _ \\ /| '_ \ / _` | __|
|
||||
| __// \| |_) | (_| | |_
|
||||
\___/_/\_\ .__/ \__,_|\__|
|
||||
|_| XML parser
|
||||
|
||||
Copyright (c) 2001-2006 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
|
||||
Copyright (c) 2003 Greg Stein <gstein@users.sourceforge.net>
|
||||
Copyright (c) 2005-2007 Steven Solie <steven@solie.ca>
|
||||
Copyright (c) 2005-2012 Karl Waclawek <karl@waclawek.net>
|
||||
Copyright (c) 2016-2022 Sebastian Pipping <sebastian@pipping.org>
|
||||
Copyright (c) 2017-2022 Rhodri James <rhodri@wildebeest.org.uk>
|
||||
Copyright (c) 2017 Joe Orton <jorton@redhat.com>
|
||||
Copyright (c) 2017 José Gutiérrez de la Concha <jose@zeroc.com>
|
||||
Copyright (c) 2018 Marco Maggi <marco.maggi-ipsu@poste.it>
|
||||
Copyright (c) 2019 David Loffredo <loffredo@steptools.com>
|
||||
Copyright (c) 2020 Tim Gates <tim.gates@iress.com>
|
||||
Copyright (c) 2021 Donghee Na <donghee.na@python.org>
|
||||
Licensed under the MIT license:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
persons to whom the Software is furnished to do so, subject to the
|
||||
following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included
|
||||
in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
||||
NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||
USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#ifndef XML_DUMMY_H
|
||||
# define XML_DUMMY_H
|
||||
|
||||
# define DUMMY_START_DOCTYPE_HANDLER_FLAG (1UL << 0)
|
||||
# define DUMMY_END_DOCTYPE_HANDLER_FLAG (1UL << 1)
|
||||
# define DUMMY_ENTITY_DECL_HANDLER_FLAG (1UL << 2)
|
||||
# define DUMMY_NOTATION_DECL_HANDLER_FLAG (1UL << 3)
|
||||
# define DUMMY_ELEMENT_DECL_HANDLER_FLAG (1UL << 4)
|
||||
# define DUMMY_ATTLIST_DECL_HANDLER_FLAG (1UL << 5)
|
||||
# define DUMMY_COMMENT_HANDLER_FLAG (1UL << 6)
|
||||
# define DUMMY_PI_HANDLER_FLAG (1UL << 7)
|
||||
# define DUMMY_START_ELEMENT_HANDLER_FLAG (1UL << 8)
|
||||
# define DUMMY_START_CDATA_HANDLER_FLAG (1UL << 9)
|
||||
# define DUMMY_END_CDATA_HANDLER_FLAG (1UL << 10)
|
||||
# define DUMMY_UNPARSED_ENTITY_DECL_HANDLER_FLAG (1UL << 11)
|
||||
# define DUMMY_START_NS_DECL_HANDLER_FLAG (1UL << 12)
|
||||
# define DUMMY_END_NS_DECL_HANDLER_FLAG (1UL << 13)
|
||||
# define DUMMY_START_DOCTYPE_DECL_HANDLER_FLAG (1UL << 14)
|
||||
# define DUMMY_END_DOCTYPE_DECL_HANDLER_FLAG (1UL << 15)
|
||||
# define DUMMY_SKIP_HANDLER_FLAG (1UL << 16)
|
||||
# define DUMMY_DEFAULT_HANDLER_FLAG (1UL << 17)
|
||||
|
||||
extern void init_dummy_handlers(void);
|
||||
extern unsigned long get_dummy_handler_flags(void);
|
||||
|
||||
extern void XMLCALL dummy_xdecl_handler(void *userData, const XML_Char *version,
|
||||
const XML_Char *encoding,
|
||||
int standalone);
|
||||
|
||||
extern void XMLCALL dummy_start_doctype_handler(void *userData,
|
||||
const XML_Char *doctypeName,
|
||||
const XML_Char *sysid,
|
||||
const XML_Char *pubid,
|
||||
int has_internal_subset);
|
||||
|
||||
extern void XMLCALL dummy_end_doctype_handler(void *userData);
|
||||
|
||||
extern void XMLCALL dummy_entity_decl_handler(
|
||||
void *userData, const XML_Char *entityName, int is_parameter_entity,
|
||||
const XML_Char *value, int value_length, const XML_Char *base,
|
||||
const XML_Char *systemId, const XML_Char *publicId,
|
||||
const XML_Char *notationName);
|
||||
|
||||
extern void XMLCALL dummy_notation_decl_handler(void *userData,
|
||||
const XML_Char *notationName,
|
||||
const XML_Char *base,
|
||||
const XML_Char *systemId,
|
||||
const XML_Char *publicId);
|
||||
|
||||
extern void XMLCALL dummy_element_decl_handler(void *userData,
|
||||
const XML_Char *name,
|
||||
XML_Content *model);
|
||||
|
||||
extern void XMLCALL dummy_attlist_decl_handler(
|
||||
void *userData, const XML_Char *elname, const XML_Char *attname,
|
||||
const XML_Char *att_type, const XML_Char *dflt, int isrequired);
|
||||
|
||||
extern void XMLCALL dummy_comment_handler(void *userData, const XML_Char *data);
|
||||
|
||||
extern void XMLCALL dummy_pi_handler(void *userData, const XML_Char *target,
|
||||
const XML_Char *data);
|
||||
|
||||
extern void XMLCALL dummy_start_element(void *userData, const XML_Char *name,
|
||||
const XML_Char **atts);
|
||||
|
||||
extern void XMLCALL dummy_end_element(void *userData, const XML_Char *name);
|
||||
|
||||
extern void XMLCALL dummy_start_cdata_handler(void *userData);
|
||||
|
||||
extern void XMLCALL dummy_end_cdata_handler(void *userData);
|
||||
|
||||
extern void XMLCALL dummy_cdata_handler(void *userData, const XML_Char *s,
|
||||
int len);
|
||||
|
||||
extern void XMLCALL dummy_start_namespace_decl_handler(void *userData,
|
||||
const XML_Char *prefix,
|
||||
const XML_Char *uri);
|
||||
|
||||
extern void XMLCALL dummy_end_namespace_decl_handler(void *userData,
|
||||
const XML_Char *prefix);
|
||||
|
||||
extern void XMLCALL dummy_unparsed_entity_decl_handler(
|
||||
void *userData, const XML_Char *entityName, const XML_Char *base,
|
||||
const XML_Char *systemId, const XML_Char *publicId,
|
||||
const XML_Char *notationName);
|
||||
|
||||
extern void XMLCALL dummy_default_handler(void *userData, const XML_Char *s,
|
||||
int len);
|
||||
|
||||
extern void XMLCALL dummy_start_doctype_decl_handler(
|
||||
void *userData, const XML_Char *doctypeName, const XML_Char *sysid,
|
||||
const XML_Char *pubid, int has_internal_subset);
|
||||
|
||||
extern void XMLCALL dummy_end_doctype_decl_handler(void *userData);
|
||||
|
||||
extern void XMLCALL dummy_skip_handler(void *userData,
|
||||
const XML_Char *entityName,
|
||||
int is_parameter_entity);
|
||||
|
||||
#endif /* XML_DUMMY_H */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
@@ -0,0 +1,32 @@
|
||||
/* C++ compilation harness for the test suite.
|
||||
__ __ _
|
||||
___\ \/ /_ __ __ _| |_
|
||||
/ _ \\ /| '_ \ / _` | __|
|
||||
| __// \| |_) | (_| | |_
|
||||
\___/_/\_\ .__/ \__,_|\__|
|
||||
|_| XML parser
|
||||
|
||||
Copyright (c) 2023 Sebastian Pipping <sebastian@pipping.org>
|
||||
Licensed under the MIT license:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
persons to whom the Software is furnished to do so, subject to the
|
||||
following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included
|
||||
in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
||||
NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||
USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include "dummy.c"
|
||||
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,595 @@
|
||||
/* XML handler functions for the Expat test suite
|
||||
__ __ _
|
||||
___\ \/ /_ __ __ _| |_
|
||||
/ _ \\ /| '_ \ / _` | __|
|
||||
| __// \| |_) | (_| | |_
|
||||
\___/_/\_\ .__/ \__,_|\__|
|
||||
|_| XML parser
|
||||
|
||||
Copyright (c) 2001-2006 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
|
||||
Copyright (c) 2003 Greg Stein <gstein@users.sourceforge.net>
|
||||
Copyright (c) 2005-2007 Steven Solie <steven@solie.ca>
|
||||
Copyright (c) 2005-2012 Karl Waclawek <karl@waclawek.net>
|
||||
Copyright (c) 2016-2024 Sebastian Pipping <sebastian@pipping.org>
|
||||
Copyright (c) 2017-2022 Rhodri James <rhodri@wildebeest.org.uk>
|
||||
Copyright (c) 2017 Joe Orton <jorton@redhat.com>
|
||||
Copyright (c) 2017 José Gutiérrez de la Concha <jose@zeroc.com>
|
||||
Copyright (c) 2018 Marco Maggi <marco.maggi-ipsu@poste.it>
|
||||
Copyright (c) 2019 David Loffredo <loffredo@steptools.com>
|
||||
Copyright (c) 2020 Tim Gates <tim.gates@iress.com>
|
||||
Copyright (c) 2021 Donghee Na <donghee.na@python.org>
|
||||
Copyright (c) 2023 Sony Corporation / Snild Dolkow <snild@sony.com>
|
||||
Licensed under the MIT license:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
persons to whom the Software is furnished to do so, subject to the
|
||||
following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included
|
||||
in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
||||
NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||
USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#ifndef XML_HANDLERS_H
|
||||
# define XML_HANDLERS_H
|
||||
|
||||
# include "expat_config.h"
|
||||
|
||||
# include "expat.h"
|
||||
|
||||
/* Variable holding the expected handler userData */
|
||||
extern const void *g_handler_data;
|
||||
/* Count of the number of times the comment handler has been invoked */
|
||||
extern int g_comment_count;
|
||||
/* Count of the number of skipped entities */
|
||||
extern int g_skip_count;
|
||||
/* Count of the number of times the XML declaration handler is invoked */
|
||||
extern int g_xdecl_count;
|
||||
|
||||
/* Start/End Element Handlers */
|
||||
|
||||
extern void XMLCALL start_element_event_handler(void *userData,
|
||||
const XML_Char *name,
|
||||
const XML_Char **atts);
|
||||
|
||||
extern void XMLCALL end_element_event_handler(void *userData,
|
||||
const XML_Char *name);
|
||||
|
||||
# define STRUCT_START_TAG 0
|
||||
# define STRUCT_END_TAG 1
|
||||
|
||||
extern void XMLCALL start_element_event_handler2(void *userData,
|
||||
const XML_Char *name,
|
||||
const XML_Char **attr);
|
||||
|
||||
extern void XMLCALL end_element_event_handler2(void *userData,
|
||||
const XML_Char *name);
|
||||
|
||||
typedef struct attrInfo {
|
||||
const XML_Char *name;
|
||||
const XML_Char *value;
|
||||
} AttrInfo;
|
||||
|
||||
typedef struct elementInfo {
|
||||
const XML_Char *name;
|
||||
int attr_count;
|
||||
const XML_Char *id_name;
|
||||
AttrInfo *attributes;
|
||||
} ElementInfo;
|
||||
|
||||
extern void XMLCALL counting_start_element_handler(void *userData,
|
||||
const XML_Char *name,
|
||||
const XML_Char **atts);
|
||||
|
||||
extern void XMLCALL suspending_end_handler(void *userData, const XML_Char *s);
|
||||
|
||||
extern void XMLCALL start_element_suspender(void *userData,
|
||||
const XML_Char *name,
|
||||
const XML_Char **atts);
|
||||
|
||||
extern int g_triplet_start_flag;
|
||||
extern int g_triplet_end_flag;
|
||||
|
||||
extern void XMLCALL triplet_start_checker(void *userData, const XML_Char *name,
|
||||
const XML_Char **atts);
|
||||
|
||||
extern void XMLCALL triplet_end_checker(void *userData, const XML_Char *name);
|
||||
|
||||
extern void XMLCALL overwrite_start_checker(void *userData,
|
||||
const XML_Char *name,
|
||||
const XML_Char **atts);
|
||||
|
||||
extern void XMLCALL overwrite_end_checker(void *userData, const XML_Char *name);
|
||||
|
||||
extern void XMLCALL start_element_fail(void *userData, const XML_Char *name,
|
||||
const XML_Char **atts);
|
||||
|
||||
extern void XMLCALL start_ns_clearing_start_element(void *userData,
|
||||
const XML_Char *prefix,
|
||||
const XML_Char *uri);
|
||||
|
||||
typedef struct {
|
||||
XML_Parser parser;
|
||||
int deep;
|
||||
} DataIssue240;
|
||||
|
||||
extern void XMLCALL start_element_issue_240(void *userData,
|
||||
const XML_Char *name,
|
||||
const XML_Char **atts);
|
||||
|
||||
extern void XMLCALL end_element_issue_240(void *userData, const XML_Char *name);
|
||||
|
||||
/* Text encoding handlers */
|
||||
|
||||
extern int XMLCALL UnknownEncodingHandler(void *data, const XML_Char *encoding,
|
||||
XML_Encoding *info);
|
||||
|
||||
extern int XMLCALL UnrecognisedEncodingHandler(void *data,
|
||||
const XML_Char *encoding,
|
||||
XML_Encoding *info);
|
||||
|
||||
extern int XMLCALL unknown_released_encoding_handler(void *data,
|
||||
const XML_Char *encoding,
|
||||
XML_Encoding *info);
|
||||
|
||||
extern int XMLCALL MiscEncodingHandler(void *data, const XML_Char *encoding,
|
||||
XML_Encoding *info);
|
||||
|
||||
extern int XMLCALL long_encoding_handler(void *userData,
|
||||
const XML_Char *encoding,
|
||||
XML_Encoding *info);
|
||||
|
||||
/* External Entity Handlers */
|
||||
|
||||
typedef struct ExtOption {
|
||||
const XML_Char *system_id;
|
||||
const char *parse_text;
|
||||
} ExtOption;
|
||||
|
||||
extern int XMLCALL external_entity_optioner(XML_Parser parser,
|
||||
const XML_Char *context,
|
||||
const XML_Char *base,
|
||||
const XML_Char *systemId,
|
||||
const XML_Char *publicId);
|
||||
|
||||
extern int XMLCALL external_entity_loader(XML_Parser parser,
|
||||
const XML_Char *context,
|
||||
const XML_Char *base,
|
||||
const XML_Char *systemId,
|
||||
const XML_Char *publicId);
|
||||
|
||||
typedef struct ext_faults {
|
||||
const char *parse_text;
|
||||
const char *fail_text;
|
||||
const XML_Char *encoding;
|
||||
enum XML_Error error;
|
||||
} ExtFaults;
|
||||
|
||||
extern int XMLCALL external_entity_faulter(XML_Parser parser,
|
||||
const XML_Char *context,
|
||||
const XML_Char *base,
|
||||
const XML_Char *systemId,
|
||||
const XML_Char *publicId);
|
||||
extern int XMLCALL external_entity_failer__if_not_xml_ge(
|
||||
XML_Parser parser, const XML_Char *context, const XML_Char *base,
|
||||
const XML_Char *systemId, const XML_Char *publicId);
|
||||
extern int XMLCALL external_entity_null_loader(XML_Parser parser,
|
||||
const XML_Char *context,
|
||||
const XML_Char *base,
|
||||
const XML_Char *systemId,
|
||||
const XML_Char *publicId);
|
||||
|
||||
extern int XMLCALL external_entity_resetter(XML_Parser parser,
|
||||
const XML_Char *context,
|
||||
const XML_Char *base,
|
||||
const XML_Char *systemId,
|
||||
const XML_Char *publicId);
|
||||
|
||||
extern int XMLCALL external_entity_suspender(XML_Parser parser,
|
||||
const XML_Char *context,
|
||||
const XML_Char *base,
|
||||
const XML_Char *systemId,
|
||||
const XML_Char *publicId);
|
||||
|
||||
extern int XMLCALL external_entity_suspend_xmldecl(XML_Parser parser,
|
||||
const XML_Char *context,
|
||||
const XML_Char *base,
|
||||
const XML_Char *systemId,
|
||||
const XML_Char *publicId);
|
||||
|
||||
extern int XMLCALL external_entity_suspending_faulter(XML_Parser parser,
|
||||
const XML_Char *context,
|
||||
const XML_Char *base,
|
||||
const XML_Char *systemId,
|
||||
const XML_Char *publicId);
|
||||
|
||||
extern int XMLCALL external_entity_cr_catcher(XML_Parser parser,
|
||||
const XML_Char *context,
|
||||
const XML_Char *base,
|
||||
const XML_Char *systemId,
|
||||
const XML_Char *publicId);
|
||||
|
||||
extern int XMLCALL external_entity_bad_cr_catcher(XML_Parser parser,
|
||||
const XML_Char *context,
|
||||
const XML_Char *base,
|
||||
const XML_Char *systemId,
|
||||
const XML_Char *publicId);
|
||||
|
||||
extern int XMLCALL external_entity_rsqb_catcher(XML_Parser parser,
|
||||
const XML_Char *context,
|
||||
const XML_Char *base,
|
||||
const XML_Char *systemId,
|
||||
const XML_Char *publicId);
|
||||
|
||||
extern int XMLCALL external_entity_good_cdata_ascii(XML_Parser parser,
|
||||
const XML_Char *context,
|
||||
const XML_Char *base,
|
||||
const XML_Char *systemId,
|
||||
const XML_Char *publicId);
|
||||
|
||||
/* Entity declaration handlers */
|
||||
|
||||
extern void XMLCALL entity_suspending_decl_handler(void *userData,
|
||||
const XML_Char *name,
|
||||
XML_Content *model);
|
||||
|
||||
extern void XMLCALL entity_suspending_xdecl_handler(void *userData,
|
||||
const XML_Char *version,
|
||||
const XML_Char *encoding,
|
||||
int standalone);
|
||||
|
||||
extern int XMLCALL external_entity_param_checker(XML_Parser parser,
|
||||
const XML_Char *context,
|
||||
const XML_Char *base,
|
||||
const XML_Char *systemId,
|
||||
const XML_Char *publicId);
|
||||
|
||||
extern int XMLCALL external_entity_ref_param_checker(XML_Parser parameter,
|
||||
const XML_Char *context,
|
||||
const XML_Char *base,
|
||||
const XML_Char *systemId,
|
||||
const XML_Char *publicId);
|
||||
|
||||
extern int XMLCALL external_entity_param(XML_Parser parser,
|
||||
const XML_Char *context,
|
||||
const XML_Char *base,
|
||||
const XML_Char *systemId,
|
||||
const XML_Char *publicId);
|
||||
|
||||
extern int XMLCALL external_entity_load_ignore(XML_Parser parser,
|
||||
const XML_Char *context,
|
||||
const XML_Char *base,
|
||||
const XML_Char *systemId,
|
||||
const XML_Char *publicId);
|
||||
|
||||
extern int XMLCALL external_entity_load_ignore_utf16(XML_Parser parser,
|
||||
const XML_Char *context,
|
||||
const XML_Char *base,
|
||||
const XML_Char *systemId,
|
||||
const XML_Char *publicId);
|
||||
|
||||
extern int XMLCALL external_entity_load_ignore_utf16_be(
|
||||
XML_Parser parser, const XML_Char *context, const XML_Char *base,
|
||||
const XML_Char *systemId, const XML_Char *publicId);
|
||||
|
||||
extern int XMLCALL external_entity_valuer(XML_Parser parser,
|
||||
const XML_Char *context,
|
||||
const XML_Char *base,
|
||||
const XML_Char *systemId,
|
||||
const XML_Char *publicId);
|
||||
|
||||
extern int XMLCALL external_entity_not_standalone(XML_Parser parser,
|
||||
const XML_Char *context,
|
||||
const XML_Char *base,
|
||||
const XML_Char *systemId,
|
||||
const XML_Char *publicId);
|
||||
|
||||
extern int XMLCALL external_entity_value_aborter(XML_Parser parser,
|
||||
const XML_Char *context,
|
||||
const XML_Char *base,
|
||||
const XML_Char *systemId,
|
||||
const XML_Char *publicId);
|
||||
|
||||
extern int XMLCALL external_entity_public(XML_Parser parser,
|
||||
const XML_Char *context,
|
||||
const XML_Char *base,
|
||||
const XML_Char *systemId,
|
||||
const XML_Char *publicId);
|
||||
|
||||
extern int XMLCALL external_entity_devaluer(XML_Parser parser,
|
||||
const XML_Char *context,
|
||||
const XML_Char *base,
|
||||
const XML_Char *systemId,
|
||||
const XML_Char *publicId);
|
||||
|
||||
typedef struct ext_hdlr_data {
|
||||
const char *parse_text;
|
||||
XML_ExternalEntityRefHandler handler;
|
||||
} ExtHdlrData;
|
||||
|
||||
extern int XMLCALL external_entity_oneshot_loader(XML_Parser parser,
|
||||
const XML_Char *context,
|
||||
const XML_Char *base,
|
||||
const XML_Char *systemId,
|
||||
const XML_Char *publicId);
|
||||
|
||||
typedef struct ExtTest2 {
|
||||
const char *parse_text;
|
||||
int parse_len;
|
||||
const XML_Char *encoding;
|
||||
CharData *storage;
|
||||
} ExtTest2;
|
||||
|
||||
extern int XMLCALL external_entity_loader2(XML_Parser parser,
|
||||
const XML_Char *context,
|
||||
const XML_Char *base,
|
||||
const XML_Char *systemId,
|
||||
const XML_Char *publicId);
|
||||
|
||||
typedef struct ExtFaults2 {
|
||||
const char *parse_text;
|
||||
int parse_len;
|
||||
const char *fail_text;
|
||||
const XML_Char *encoding;
|
||||
enum XML_Error error;
|
||||
} ExtFaults2;
|
||||
|
||||
extern int XMLCALL external_entity_faulter2(XML_Parser parser,
|
||||
const XML_Char *context,
|
||||
const XML_Char *base,
|
||||
const XML_Char *systemId,
|
||||
const XML_Char *publicId);
|
||||
|
||||
extern int XMLCALL external_entity_unfinished_attlist(XML_Parser parser,
|
||||
const XML_Char *context,
|
||||
const XML_Char *base,
|
||||
const XML_Char *systemId,
|
||||
const XML_Char *publicId);
|
||||
|
||||
extern int XMLCALL external_entity_handler(XML_Parser parser,
|
||||
const XML_Char *context,
|
||||
const XML_Char *base,
|
||||
const XML_Char *systemId,
|
||||
const XML_Char *publicId);
|
||||
|
||||
extern int XMLCALL external_entity_duff_loader(XML_Parser parser,
|
||||
const XML_Char *context,
|
||||
const XML_Char *base,
|
||||
const XML_Char *systemId,
|
||||
const XML_Char *publicId);
|
||||
|
||||
extern int XMLCALL external_entity_dbl_handler(XML_Parser parser,
|
||||
const XML_Char *context,
|
||||
const XML_Char *base,
|
||||
const XML_Char *systemId,
|
||||
const XML_Char *publicId);
|
||||
|
||||
extern int XMLCALL external_entity_dbl_handler_2(XML_Parser parser,
|
||||
const XML_Char *context,
|
||||
const XML_Char *base,
|
||||
const XML_Char *systemId,
|
||||
const XML_Char *publicId);
|
||||
|
||||
extern int XMLCALL external_entity_alloc_set_encoding(XML_Parser parser,
|
||||
const XML_Char *context,
|
||||
const XML_Char *base,
|
||||
const XML_Char *systemId,
|
||||
const XML_Char *publicId);
|
||||
|
||||
extern int XMLCALL external_entity_reallocator(XML_Parser parser,
|
||||
const XML_Char *context,
|
||||
const XML_Char *base,
|
||||
const XML_Char *systemId,
|
||||
const XML_Char *publicId);
|
||||
|
||||
extern int XMLCALL external_entity_alloc(XML_Parser parser,
|
||||
const XML_Char *context,
|
||||
const XML_Char *base,
|
||||
const XML_Char *systemId,
|
||||
const XML_Char *publicId);
|
||||
|
||||
extern int XMLCALL external_entity_parser_create_alloc_fail_handler(
|
||||
XML_Parser parser, const XML_Char *context, const XML_Char *base,
|
||||
const XML_Char *systemId, const XML_Char *publicId);
|
||||
|
||||
struct AccountingTestCase {
|
||||
const char *primaryText;
|
||||
const char *firstExternalText; /* often NULL */
|
||||
const char *secondExternalText; /* often NULL */
|
||||
const unsigned long long expectedCountBytesIndirectExtra;
|
||||
};
|
||||
|
||||
extern int accounting_external_entity_ref_handler(XML_Parser parser,
|
||||
const XML_Char *context,
|
||||
const XML_Char *base,
|
||||
const XML_Char *systemId,
|
||||
const XML_Char *publicId);
|
||||
|
||||
/* NotStandalone handlers */
|
||||
|
||||
extern int XMLCALL reject_not_standalone_handler(void *userData);
|
||||
|
||||
extern int XMLCALL accept_not_standalone_handler(void *userData);
|
||||
|
||||
/* Attribute List handlers */
|
||||
|
||||
typedef struct AttTest {
|
||||
const char *definition;
|
||||
const XML_Char *element_name;
|
||||
const XML_Char *attr_name;
|
||||
const XML_Char *attr_type;
|
||||
const XML_Char *default_value;
|
||||
int is_required;
|
||||
} AttTest;
|
||||
|
||||
extern void XMLCALL verify_attlist_decl_handler(
|
||||
void *userData, const XML_Char *element_name, const XML_Char *attr_name,
|
||||
const XML_Char *attr_type, const XML_Char *default_value, int is_required);
|
||||
|
||||
/* Character data handlers */
|
||||
|
||||
extern void XMLCALL clearing_aborting_character_handler(void *userData,
|
||||
const XML_Char *s,
|
||||
int len);
|
||||
|
||||
extern void XMLCALL parser_stop_character_handler(void *userData,
|
||||
const XML_Char *s, int len);
|
||||
|
||||
extern void XMLCALL cr_cdata_handler(void *userData, const XML_Char *s,
|
||||
int len);
|
||||
|
||||
extern void XMLCALL rsqb_handler(void *userData, const XML_Char *s, int len);
|
||||
|
||||
typedef struct ByteTestData {
|
||||
int start_element_len;
|
||||
int cdata_len;
|
||||
int total_string_len;
|
||||
} ByteTestData;
|
||||
|
||||
extern void XMLCALL byte_character_handler(void *userData, const XML_Char *s,
|
||||
int len);
|
||||
|
||||
extern void XMLCALL ext2_accumulate_characters(void *userData,
|
||||
const XML_Char *s, int len);
|
||||
|
||||
/* Handlers that record their `len` arg and a single identifying character */
|
||||
|
||||
struct handler_record_entry {
|
||||
const char *name;
|
||||
int arg;
|
||||
};
|
||||
struct handler_record_list {
|
||||
int count;
|
||||
struct handler_record_entry entries[50]; // arbitrary big-enough max count
|
||||
};
|
||||
|
||||
extern void XMLCALL record_default_handler(void *userData, const XML_Char *s,
|
||||
int len);
|
||||
|
||||
extern void XMLCALL record_cdata_handler(void *userData, const XML_Char *s,
|
||||
int len);
|
||||
|
||||
extern void XMLCALL record_cdata_nodefault_handler(void *userData,
|
||||
const XML_Char *s, int len);
|
||||
|
||||
extern void XMLCALL record_skip_handler(void *userData,
|
||||
const XML_Char *entityName,
|
||||
int is_parameter_entity);
|
||||
|
||||
extern void XMLCALL record_element_start_handler(void *userData,
|
||||
const XML_Char *name,
|
||||
const XML_Char **atts);
|
||||
|
||||
extern void XMLCALL record_element_end_handler(void *userData,
|
||||
const XML_Char *name);
|
||||
|
||||
extern const struct handler_record_entry *
|
||||
_handler_record_get(const struct handler_record_list *storage, int index,
|
||||
const char *file, int line);
|
||||
|
||||
# define handler_record_get(storage, index) \
|
||||
_handler_record_get((storage), (index), __FILE__, __LINE__)
|
||||
|
||||
# define assert_record_handler_called(storage, index, expected_name, \
|
||||
expected_arg) \
|
||||
do { \
|
||||
const struct handler_record_entry *e \
|
||||
= handler_record_get(storage, index); \
|
||||
assert_true(strcmp(e->name, expected_name) == 0); \
|
||||
assert_true(e->arg == (expected_arg)); \
|
||||
} while (0)
|
||||
|
||||
/* Entity Declaration Handlers */
|
||||
# define ENTITY_MATCH_FAIL (-1)
|
||||
# define ENTITY_MATCH_NOT_FOUND (0)
|
||||
# define ENTITY_MATCH_SUCCESS (1)
|
||||
|
||||
extern void XMLCALL param_entity_match_handler(
|
||||
void *userData, const XML_Char *entityName, int is_parameter_entity,
|
||||
const XML_Char *value, int value_length, const XML_Char *base,
|
||||
const XML_Char *systemId, const XML_Char *publicId,
|
||||
const XML_Char *notationName);
|
||||
|
||||
extern void param_entity_match_init(const XML_Char *name,
|
||||
const XML_Char *value);
|
||||
|
||||
extern int get_param_entity_match_flag(void);
|
||||
|
||||
/* Misc handlers */
|
||||
|
||||
extern void XMLCALL xml_decl_handler(void *userData, const XML_Char *version,
|
||||
const XML_Char *encoding, int standalone);
|
||||
|
||||
extern void XMLCALL param_check_skip_handler(void *userData,
|
||||
const XML_Char *entityName,
|
||||
int is_parameter_entity);
|
||||
|
||||
extern void XMLCALL data_check_comment_handler(void *userData,
|
||||
const XML_Char *data);
|
||||
|
||||
extern void XMLCALL selective_aborting_default_handler(void *userData,
|
||||
const XML_Char *s,
|
||||
int len);
|
||||
|
||||
extern void XMLCALL suspending_comment_handler(void *userData,
|
||||
const XML_Char *data);
|
||||
|
||||
extern void XMLCALL element_decl_suspender(void *userData, const XML_Char *name,
|
||||
XML_Content *model);
|
||||
|
||||
extern void XMLCALL accumulate_pi_characters(void *userData,
|
||||
const XML_Char *target,
|
||||
const XML_Char *data);
|
||||
|
||||
extern void XMLCALL accumulate_comment(void *userData, const XML_Char *data);
|
||||
|
||||
extern void XMLCALL accumulate_entity_decl(
|
||||
void *userData, const XML_Char *entityName, int is_parameter_entity,
|
||||
const XML_Char *value, int value_length, const XML_Char *base,
|
||||
const XML_Char *systemId, const XML_Char *publicId,
|
||||
const XML_Char *notationName);
|
||||
|
||||
extern void XMLCALL accumulate_char_data(void *userData, const XML_Char *s,
|
||||
int len);
|
||||
|
||||
extern void XMLCALL accumulate_start_element(void *userData,
|
||||
const XML_Char *name,
|
||||
const XML_Char **atts);
|
||||
|
||||
typedef struct default_check {
|
||||
const XML_Char *expected;
|
||||
const int expectedLen;
|
||||
XML_Bool seen;
|
||||
} DefaultCheck;
|
||||
|
||||
void XMLCALL checking_default_handler(void *userData, const XML_Char *s,
|
||||
int len);
|
||||
|
||||
typedef struct {
|
||||
XML_Parser parser;
|
||||
CharData *storage;
|
||||
} ParserPlusStorage;
|
||||
|
||||
extern void XMLCALL
|
||||
accumulate_and_suspend_comment_handler(void *userData, const XML_Char *data);
|
||||
|
||||
#endif /* XML_HANDLERS_H */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
@@ -0,0 +1,32 @@
|
||||
/* C++ compilation harness for the test suite.
|
||||
__ __ _
|
||||
___\ \/ /_ __ __ _| |_
|
||||
/ _ \\ /| '_ \ / _` | __|
|
||||
| __// \| |_) | (_| | |_
|
||||
\___/_/\_\ .__/ \__,_|\__|
|
||||
|_| XML parser
|
||||
|
||||
Copyright (c) 2023 Sebastian Pipping <sebastian@pipping.org>
|
||||
Licensed under the MIT license:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
persons to whom the Software is furnished to do so, subject to the
|
||||
following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included
|
||||
in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
||||
NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||
USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include "handlers.c"
|
||||
@@ -6,8 +6,9 @@
|
||||
\___/_/\_\ .__/ \__,_|\__|
|
||||
|_| XML parser
|
||||
|
||||
Copyright (c) 2017 Rhodri James <rhodri@wildebeest.org.uk>
|
||||
Copyright (c) 2017 Sebastian Pipping <sebastian@pipping.org>
|
||||
Copyright (c) 2017 Rhodri James <rhodri@wildebeest.org.uk>
|
||||
Copyright (c) 2017-2023 Sebastian Pipping <sebastian@pipping.org>
|
||||
Copyright (c) 2022 Sean McBride <sean@rogue-research.com>
|
||||
Licensed under the MIT license:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
@@ -49,12 +50,13 @@ typedef struct allocation_entry {
|
||||
static AllocationEntry *alloc_head = NULL;
|
||||
static AllocationEntry *alloc_tail = NULL;
|
||||
|
||||
static AllocationEntry *find_allocation(void *ptr);
|
||||
static AllocationEntry *find_allocation(const void *ptr);
|
||||
|
||||
/* Allocate some memory and keep track of it. */
|
||||
void *
|
||||
tracking_malloc(size_t size) {
|
||||
AllocationEntry *entry = malloc(sizeof(AllocationEntry));
|
||||
AllocationEntry *const entry
|
||||
= (AllocationEntry *)malloc(sizeof(AllocationEntry));
|
||||
|
||||
if (entry == NULL) {
|
||||
printf("Allocator failure\n");
|
||||
@@ -82,7 +84,7 @@ tracking_malloc(size_t size) {
|
||||
}
|
||||
|
||||
static AllocationEntry *
|
||||
find_allocation(void *ptr) {
|
||||
find_allocation(const void *ptr) {
|
||||
AllocationEntry *entry;
|
||||
|
||||
for (entry = alloc_head; entry != NULL; entry = entry->next) {
|
||||
@@ -140,7 +142,7 @@ tracking_realloc(void *ptr, size_t size) {
|
||||
entry = find_allocation(ptr);
|
||||
if (entry == NULL) {
|
||||
printf("Attempting to realloc unallocated memory at %p\n", ptr);
|
||||
entry = malloc(sizeof(AllocationEntry));
|
||||
entry = (AllocationEntry *)malloc(sizeof(AllocationEntry));
|
||||
if (entry == NULL) {
|
||||
printf("Reallocator failure\n");
|
||||
return NULL;
|
||||
@@ -162,12 +164,11 @@ tracking_realloc(void *ptr, size_t size) {
|
||||
alloc_tail = entry;
|
||||
}
|
||||
} else {
|
||||
entry->allocation = realloc(ptr, size);
|
||||
if (entry->allocation == NULL) {
|
||||
/* Realloc semantics say the original is still allocated */
|
||||
entry->allocation = ptr;
|
||||
void *const reallocated = realloc(ptr, size);
|
||||
if (reallocated == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
entry->allocation = reallocated;
|
||||
}
|
||||
|
||||
entry->num_bytes = size;
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
/* C++ compilation harness for the test suite.
|
||||
__ __ _
|
||||
___\ \/ /_ __ __ _| |_
|
||||
/ _ \\ /| '_ \ / _` | __|
|
||||
| __// \| |_) | (_| | |_
|
||||
\___/_/\_\ .__/ \__,_|\__|
|
||||
|_| XML parser
|
||||
|
||||
Copyright (c) 2023 Sebastian Pipping <sebastian@pipping.org>
|
||||
Licensed under the MIT license:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
persons to whom the Software is furnished to do so, subject to the
|
||||
following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included
|
||||
in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
||||
NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||
USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include "memcheck.c"
|
||||
@@ -11,10 +11,11 @@
|
||||
|_| XML parser
|
||||
|
||||
Copyright (c) 2004-2006 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
|
||||
Copyright (c) 2016-2020 Sebastian Pipping <sebastian@pipping.org>
|
||||
Copyright (c) 2016-2023 Sebastian Pipping <sebastian@pipping.org>
|
||||
Copyright (c) 2017 Rhodri James <rhodri@wildebeest.org.uk>
|
||||
Copyright (c) 2018 Marco Maggi <marco.maggi-ipsu@poste.it>
|
||||
Copyright (c) 2019 David Loffredo <loffredo@steptools.com>
|
||||
Copyright (c) 2023-2024 Sony Corporation / Snild Dolkow <snild@sony.com>
|
||||
Licensed under the MIT license:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
@@ -37,6 +38,11 @@
|
||||
USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#if defined(NDEBUG)
|
||||
# undef NDEBUG /* because test suite relies on assert(...) at the moment */
|
||||
#endif
|
||||
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <setjmp.h>
|
||||
@@ -88,7 +94,8 @@ tcase_add_test(TCase *tc, tcase_test_function test) {
|
||||
if (tc->allocated == tc->ntests) {
|
||||
int nalloc = tc->allocated + 100;
|
||||
size_t new_size = sizeof(tcase_test_function) * nalloc;
|
||||
tcase_test_function *new_tests = realloc(tc->tests, new_size);
|
||||
tcase_test_function *const new_tests
|
||||
= (tcase_test_function *)realloc(tc->tests, new_size);
|
||||
assert(new_tests != NULL);
|
||||
tc->tests = new_tests;
|
||||
tc->allocated = nalloc;
|
||||
@@ -123,7 +130,7 @@ suite_free(Suite *suite) {
|
||||
|
||||
SRunner *
|
||||
srunner_create(Suite *suite) {
|
||||
SRunner *runner = calloc(1, sizeof(SRunner));
|
||||
SRunner *const runner = (SRunner *)calloc(1, sizeof(SRunner));
|
||||
if (runner != NULL) {
|
||||
runner->suite = suite;
|
||||
}
|
||||
@@ -132,17 +139,35 @@ srunner_create(Suite *suite) {
|
||||
|
||||
static jmp_buf env;
|
||||
|
||||
#define SUBTEST_LEN (50) // informative, but not too long
|
||||
static char const *_check_current_function = NULL;
|
||||
static char _check_current_subtest[SUBTEST_LEN];
|
||||
static int _check_current_lineno = -1;
|
||||
static char const *_check_current_filename = NULL;
|
||||
|
||||
void
|
||||
_check_set_test_info(char const *function, char const *filename, int lineno) {
|
||||
_check_current_function = function;
|
||||
set_subtest("%s", "");
|
||||
_check_current_lineno = lineno;
|
||||
_check_current_filename = filename;
|
||||
}
|
||||
|
||||
void
|
||||
set_subtest(char const *fmt, ...) {
|
||||
va_list ap;
|
||||
va_start(ap, fmt);
|
||||
vsnprintf(_check_current_subtest, SUBTEST_LEN, fmt, ap);
|
||||
va_end(ap);
|
||||
// replace line feeds with spaces, for nicer error logs
|
||||
for (size_t i = 0; i < SUBTEST_LEN; ++i) {
|
||||
if (_check_current_subtest[i] == '\n') {
|
||||
_check_current_subtest[i] = ' ';
|
||||
}
|
||||
}
|
||||
_check_current_subtest[SUBTEST_LEN - 1] = '\0'; // ensure termination
|
||||
}
|
||||
|
||||
static void
|
||||
handle_success(int verbosity) {
|
||||
if (verbosity >= CK_VERBOSE) {
|
||||
@@ -151,16 +176,20 @@ handle_success(int verbosity) {
|
||||
}
|
||||
|
||||
static void
|
||||
handle_failure(SRunner *runner, int verbosity, const char *phase_info) {
|
||||
handle_failure(SRunner *runner, int verbosity, const char *context,
|
||||
const char *phase_info) {
|
||||
runner->nfailures++;
|
||||
if (verbosity != CK_SILENT) {
|
||||
printf("FAIL: %s (%s at %s:%d)\n", _check_current_function, phase_info,
|
||||
_check_current_filename, _check_current_lineno);
|
||||
if (strlen(_check_current_subtest) != 0) {
|
||||
phase_info = _check_current_subtest;
|
||||
}
|
||||
printf("FAIL [%s]: %s (%s at %s:%d)\n", context, _check_current_function,
|
||||
phase_info, _check_current_filename, _check_current_lineno);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
srunner_run_all(SRunner *runner, int verbosity) {
|
||||
srunner_run_all(SRunner *runner, const char *context, int verbosity) {
|
||||
Suite *suite;
|
||||
TCase *volatile tc;
|
||||
assert(runner != NULL);
|
||||
@@ -170,26 +199,28 @@ srunner_run_all(SRunner *runner, int verbosity) {
|
||||
volatile int i;
|
||||
for (i = 0; i < tc->ntests; ++i) {
|
||||
runner->nchecks++;
|
||||
set_subtest("%s", "");
|
||||
|
||||
if (tc->setup != NULL) {
|
||||
/* setup */
|
||||
if (setjmp(env)) {
|
||||
handle_failure(runner, verbosity, "during setup");
|
||||
handle_failure(runner, verbosity, context, "during setup");
|
||||
continue;
|
||||
}
|
||||
tc->setup();
|
||||
}
|
||||
/* test */
|
||||
if (setjmp(env)) {
|
||||
handle_failure(runner, verbosity, "during actual test");
|
||||
handle_failure(runner, verbosity, context, "during actual test");
|
||||
continue;
|
||||
}
|
||||
(tc->tests[i])();
|
||||
set_subtest("%s", "");
|
||||
|
||||
/* teardown */
|
||||
if (tc->teardown != NULL) {
|
||||
if (setjmp(env)) {
|
||||
handle_failure(runner, verbosity, "during teardown");
|
||||
handle_failure(runner, verbosity, context, "during teardown");
|
||||
continue;
|
||||
}
|
||||
tc->teardown();
|
||||
@@ -199,6 +230,10 @@ srunner_run_all(SRunner *runner, int verbosity) {
|
||||
}
|
||||
tc = tc->next_tcase;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
srunner_summarize(SRunner *runner, int verbosity) {
|
||||
if (verbosity != CK_SILENT) {
|
||||
int passed = runner->nchecks - runner->nfailures;
|
||||
double percentage = ((double)passed) / runner->nchecks;
|
||||
@@ -209,12 +244,11 @@ srunner_run_all(SRunner *runner, int verbosity) {
|
||||
}
|
||||
|
||||
void
|
||||
_fail_unless(int condition, const char *file, int line, const char *msg) {
|
||||
_fail(const char *file, int line, const char *msg) {
|
||||
/* Always print the error message so it isn't lost. In this case,
|
||||
we have a failure, so there's no reason to be quiet about what
|
||||
it is.
|
||||
*/
|
||||
UNUSED_P(condition);
|
||||
_check_current_filename = file;
|
||||
_check_current_lineno = line;
|
||||
if (msg != NULL) {
|
||||
|
||||
@@ -14,7 +14,9 @@
|
||||
|
||||
Copyright (c) 2004-2006 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
|
||||
Copyright (c) 2006-2012 Karl Waclawek <karl@waclawek.net>
|
||||
Copyright (c) 2016-2017 Sebastian Pipping <sebastian@pipping.org>
|
||||
Copyright (c) 2016-2024 Sebastian Pipping <sebastian@pipping.org>
|
||||
Copyright (c) 2022 Rhodri James <rhodri@wildebeest.org.uk>
|
||||
Copyright (c) 2023-2024 Sony Corporation / Snild Dolkow <snild@sony.com>
|
||||
Licensed under the MIT license:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
@@ -41,30 +43,54 @@
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define CK_NOFORK 0
|
||||
#define CK_FORK 1
|
||||
#ifndef XML_MINICHECK_H
|
||||
# define XML_MINICHECK_H
|
||||
|
||||
#define CK_SILENT 0
|
||||
#define CK_NORMAL 1
|
||||
#define CK_VERBOSE 2
|
||||
# define CK_NOFORK 0
|
||||
# define CK_FORK 1
|
||||
|
||||
# define CK_SILENT 0
|
||||
# define CK_NORMAL 1
|
||||
# define CK_VERBOSE 2
|
||||
|
||||
/* Workaround for Microsoft's compiler and Tru64 Unix systems where the
|
||||
C compiler has a working __func__, but the C++ compiler only has a
|
||||
working __FUNCTION__. This could be fixed in configure.in, but it's
|
||||
not worth it right now. */
|
||||
#if defined(_MSC_VER) || (defined(__osf__) && defined(__cplusplus))
|
||||
# define __func__ __FUNCTION__
|
||||
#endif
|
||||
# if defined(_MSC_VER) || (defined(__osf__) && defined(__cplusplus))
|
||||
# define __func__ __FUNCTION__
|
||||
# endif
|
||||
|
||||
#define START_TEST(testname) \
|
||||
static void testname(void) { \
|
||||
_check_set_test_info(__func__, __FILE__, __LINE__); \
|
||||
{
|
||||
#define END_TEST \
|
||||
} \
|
||||
}
|
||||
/* PRINTF_LIKE has two effects:
|
||||
1. Make clang's -Wformat-nonliteral stop warning about non-literal format
|
||||
strings in annotated functions' code.
|
||||
2. Make both clang and gcc's -Wformat-nonliteral warn about *callers* of
|
||||
the annotated function that use a non-literal format string.
|
||||
*/
|
||||
# if defined(__GNUC__)
|
||||
# define PRINTF_LIKE(fmtpos, argspos) \
|
||||
__attribute__((format(printf, fmtpos, argspos)))
|
||||
# else
|
||||
# define PRINTF_LIKE(fmtpos, argspos)
|
||||
# endif
|
||||
|
||||
#define fail(msg) _fail_unless(0, __FILE__, __LINE__, msg)
|
||||
# define START_TEST(testname) \
|
||||
static void testname(void) { \
|
||||
_check_set_test_info(__func__, __FILE__, __LINE__); \
|
||||
{
|
||||
# define END_TEST \
|
||||
} \
|
||||
}
|
||||
|
||||
void PRINTF_LIKE(1, 2) set_subtest(char const *fmt, ...);
|
||||
|
||||
# define fail(msg) _fail(__FILE__, __LINE__, msg)
|
||||
# define assert_true(cond) \
|
||||
do { \
|
||||
if (! (cond)) { \
|
||||
_fail(__FILE__, __LINE__, "check failed: " #cond); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
typedef void (*tcase_setup_function)(void);
|
||||
typedef void (*tcase_teardown_function)(void);
|
||||
@@ -103,18 +129,25 @@ void _check_set_test_info(char const *function, char const *filename,
|
||||
* Prototypes for the actual implementation.
|
||||
*/
|
||||
|
||||
void _fail_unless(int condition, const char *file, int line, const char *msg);
|
||||
# if defined(__GNUC__)
|
||||
__attribute__((noreturn))
|
||||
# endif
|
||||
void
|
||||
_fail(const char *file, int line, const char *msg);
|
||||
Suite *suite_create(const char *name);
|
||||
TCase *tcase_create(const char *name);
|
||||
void suite_add_tcase(Suite *suite, TCase *tc);
|
||||
void tcase_add_checked_fixture(TCase *, tcase_setup_function,
|
||||
tcase_teardown_function);
|
||||
void tcase_add_checked_fixture(TCase *tc, tcase_setup_function setup,
|
||||
tcase_teardown_function teardown);
|
||||
void tcase_add_test(TCase *tc, tcase_test_function test);
|
||||
SRunner *srunner_create(Suite *suite);
|
||||
void srunner_run_all(SRunner *runner, int verbosity);
|
||||
void srunner_run_all(SRunner *runner, const char *context, int verbosity);
|
||||
void srunner_summarize(SRunner *runner, int verbosity);
|
||||
int srunner_ntests_failed(SRunner *runner);
|
||||
void srunner_free(SRunner *runner);
|
||||
|
||||
#endif /* XML_MINICHECK_H */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
@@ -0,0 +1,32 @@
|
||||
/* C++ compilation harness for the test suite.
|
||||
__ __ _
|
||||
___\ \/ /_ __ __ _| |_
|
||||
/ _ \\ /| '_ \ / _` | __|
|
||||
| __// \| |_) | (_| | |_
|
||||
\___/_/\_\ .__/ \__,_|\__|
|
||||
|_| XML parser
|
||||
|
||||
Copyright (c) 2023 Sebastian Pipping <sebastian@pipping.org>
|
||||
Licensed under the MIT license:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
persons to whom the Software is furnished to do so, subject to the
|
||||
following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included
|
||||
in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
||||
NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||
USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include "minicheck.c"
|
||||
@@ -0,0 +1,523 @@
|
||||
/* Tests in the "miscellaneous" test case for the Expat test suite
|
||||
__ __ _
|
||||
___\ \/ /_ __ __ _| |_
|
||||
/ _ \\ /| '_ \ / _` | __|
|
||||
| __// \| |_) | (_| | |_
|
||||
\___/_/\_\ .__/ \__,_|\__|
|
||||
|_| XML parser
|
||||
|
||||
Copyright (c) 2001-2006 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
|
||||
Copyright (c) 2003 Greg Stein <gstein@users.sourceforge.net>
|
||||
Copyright (c) 2005-2007 Steven Solie <steven@solie.ca>
|
||||
Copyright (c) 2005-2012 Karl Waclawek <karl@waclawek.net>
|
||||
Copyright (c) 2016-2024 Sebastian Pipping <sebastian@pipping.org>
|
||||
Copyright (c) 2017-2022 Rhodri James <rhodri@wildebeest.org.uk>
|
||||
Copyright (c) 2017 Joe Orton <jorton@redhat.com>
|
||||
Copyright (c) 2017 José Gutiérrez de la Concha <jose@zeroc.com>
|
||||
Copyright (c) 2018 Marco Maggi <marco.maggi-ipsu@poste.it>
|
||||
Copyright (c) 2019 David Loffredo <loffredo@steptools.com>
|
||||
Copyright (c) 2020 Tim Gates <tim.gates@iress.com>
|
||||
Copyright (c) 2021 Donghee Na <donghee.na@python.org>
|
||||
Copyright (c) 2023 Sony Corporation / Snild Dolkow <snild@sony.com>
|
||||
Licensed under the MIT license:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
persons to whom the Software is furnished to do so, subject to the
|
||||
following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included
|
||||
in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
||||
NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||
USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#if defined(NDEBUG)
|
||||
# undef NDEBUG /* because test suite relies on assert(...) at the moment */
|
||||
#endif
|
||||
|
||||
#include <assert.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "expat_config.h"
|
||||
|
||||
#include "expat.h"
|
||||
#include "internal.h"
|
||||
#include "minicheck.h"
|
||||
#include "memcheck.h"
|
||||
#include "common.h"
|
||||
#include "ascii.h" /* for ASCII_xxx */
|
||||
#include "handlers.h"
|
||||
#include "misc_tests.h"
|
||||
|
||||
/* Test that a failure to allocate the parser structure fails gracefully */
|
||||
START_TEST(test_misc_alloc_create_parser) {
|
||||
XML_Memory_Handling_Suite memsuite = {duff_allocator, realloc, free};
|
||||
unsigned int i;
|
||||
const unsigned int max_alloc_count = 10;
|
||||
|
||||
/* Something this simple shouldn't need more than 10 allocations */
|
||||
for (i = 0; i < max_alloc_count; i++) {
|
||||
g_allocation_count = i;
|
||||
g_parser = XML_ParserCreate_MM(NULL, &memsuite, NULL);
|
||||
if (g_parser != NULL)
|
||||
break;
|
||||
}
|
||||
if (i == 0)
|
||||
fail("Parser unexpectedly ignored failing allocator");
|
||||
else if (i == max_alloc_count)
|
||||
fail("Parser not created with max allocation count");
|
||||
}
|
||||
END_TEST
|
||||
|
||||
/* Test memory allocation failures for a parser with an encoding */
|
||||
START_TEST(test_misc_alloc_create_parser_with_encoding) {
|
||||
XML_Memory_Handling_Suite memsuite = {duff_allocator, realloc, free};
|
||||
unsigned int i;
|
||||
const unsigned int max_alloc_count = 10;
|
||||
|
||||
/* Try several levels of allocation */
|
||||
for (i = 0; i < max_alloc_count; i++) {
|
||||
g_allocation_count = i;
|
||||
g_parser = XML_ParserCreate_MM(XCS("us-ascii"), &memsuite, NULL);
|
||||
if (g_parser != NULL)
|
||||
break;
|
||||
}
|
||||
if (i == 0)
|
||||
fail("Parser ignored failing allocator");
|
||||
else if (i == max_alloc_count)
|
||||
fail("Parser not created with max allocation count");
|
||||
}
|
||||
END_TEST
|
||||
|
||||
/* Test that freeing a NULL parser doesn't cause an explosion.
|
||||
* (Not actually tested anywhere else)
|
||||
*/
|
||||
START_TEST(test_misc_null_parser) {
|
||||
XML_ParserFree(NULL);
|
||||
}
|
||||
END_TEST
|
||||
|
||||
#if defined(__has_feature)
|
||||
# if __has_feature(undefined_behavior_sanitizer)
|
||||
# define EXPAT_TESTS_UBSAN 1
|
||||
# else
|
||||
# define EXPAT_TESTS_UBSAN 0
|
||||
# endif
|
||||
#else
|
||||
# define EXPAT_TESTS_UBSAN 0
|
||||
#endif
|
||||
|
||||
/* Test that XML_ErrorString rejects out-of-range codes */
|
||||
START_TEST(test_misc_error_string) {
|
||||
#if ! EXPAT_TESTS_UBSAN // because this would trigger UBSan
|
||||
union {
|
||||
enum XML_Error xml_error;
|
||||
int integer;
|
||||
} trickery;
|
||||
|
||||
assert_true(sizeof(enum XML_Error) == sizeof(int)); // self-test
|
||||
|
||||
trickery.integer = -1;
|
||||
if (XML_ErrorString(trickery.xml_error) != NULL)
|
||||
fail("Negative error code not rejected");
|
||||
|
||||
trickery.integer = 100;
|
||||
if (XML_ErrorString(trickery.xml_error) != NULL)
|
||||
fail("Large error code not rejected");
|
||||
#endif
|
||||
}
|
||||
END_TEST
|
||||
|
||||
/* Test the version information is consistent */
|
||||
|
||||
/* Since we are working in XML_LChars (potentially 16-bits), we
|
||||
* can't use the standard C library functions for character
|
||||
* manipulation and have to roll our own.
|
||||
*/
|
||||
static int
|
||||
parse_version(const XML_LChar *version_text,
|
||||
XML_Expat_Version *version_struct) {
|
||||
if (! version_text)
|
||||
return XML_FALSE;
|
||||
|
||||
while (*version_text != 0x00) {
|
||||
if (*version_text >= ASCII_0 && *version_text <= ASCII_9)
|
||||
break;
|
||||
version_text++;
|
||||
}
|
||||
if (*version_text == 0x00)
|
||||
return XML_FALSE;
|
||||
|
||||
/* version_struct->major = strtoul(version_text, 10, &version_text) */
|
||||
version_struct->major = 0;
|
||||
while (*version_text >= ASCII_0 && *version_text <= ASCII_9) {
|
||||
version_struct->major
|
||||
= 10 * version_struct->major + (*version_text++ - ASCII_0);
|
||||
}
|
||||
if (*version_text++ != ASCII_PERIOD)
|
||||
return XML_FALSE;
|
||||
|
||||
/* Now for the minor version number */
|
||||
version_struct->minor = 0;
|
||||
while (*version_text >= ASCII_0 && *version_text <= ASCII_9) {
|
||||
version_struct->minor
|
||||
= 10 * version_struct->minor + (*version_text++ - ASCII_0);
|
||||
}
|
||||
if (*version_text++ != ASCII_PERIOD)
|
||||
return XML_FALSE;
|
||||
|
||||
/* Finally the micro version number */
|
||||
version_struct->micro = 0;
|
||||
while (*version_text >= ASCII_0 && *version_text <= ASCII_9) {
|
||||
version_struct->micro
|
||||
= 10 * version_struct->micro + (*version_text++ - ASCII_0);
|
||||
}
|
||||
if (*version_text != 0x00)
|
||||
return XML_FALSE;
|
||||
return XML_TRUE;
|
||||
}
|
||||
|
||||
static int
|
||||
versions_equal(const XML_Expat_Version *first,
|
||||
const XML_Expat_Version *second) {
|
||||
return (first->major == second->major && first->minor == second->minor
|
||||
&& first->micro == second->micro);
|
||||
}
|
||||
|
||||
START_TEST(test_misc_version) {
|
||||
XML_Expat_Version read_version = XML_ExpatVersionInfo();
|
||||
/* Silence compiler warning with the following assignment */
|
||||
XML_Expat_Version parsed_version = {0, 0, 0};
|
||||
const XML_LChar *version_text = XML_ExpatVersion();
|
||||
|
||||
if (version_text == NULL)
|
||||
fail("Could not obtain version text");
|
||||
assert(version_text != NULL);
|
||||
if (! parse_version(version_text, &parsed_version))
|
||||
fail("Unable to parse version text");
|
||||
if (! versions_equal(&read_version, &parsed_version))
|
||||
fail("Version mismatch");
|
||||
|
||||
if (xcstrcmp(version_text, XCS("expat_2.6.0"))) /* needs bump on releases */
|
||||
fail("XML_*_VERSION in expat.h out of sync?\n");
|
||||
}
|
||||
END_TEST
|
||||
|
||||
/* Test feature information */
|
||||
START_TEST(test_misc_features) {
|
||||
const XML_Feature *features = XML_GetFeatureList();
|
||||
|
||||
/* Prevent problems with double-freeing parsers */
|
||||
g_parser = NULL;
|
||||
if (features == NULL) {
|
||||
fail("Failed to get feature information");
|
||||
} else {
|
||||
/* Loop through the features checking what we can */
|
||||
while (features->feature != XML_FEATURE_END) {
|
||||
switch (features->feature) {
|
||||
case XML_FEATURE_SIZEOF_XML_CHAR:
|
||||
if (features->value != sizeof(XML_Char))
|
||||
fail("Incorrect size of XML_Char");
|
||||
break;
|
||||
case XML_FEATURE_SIZEOF_XML_LCHAR:
|
||||
if (features->value != sizeof(XML_LChar))
|
||||
fail("Incorrect size of XML_LChar");
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
features++;
|
||||
}
|
||||
}
|
||||
}
|
||||
END_TEST
|
||||
|
||||
/* Regression test for GitHub Issue #17: memory leak parsing attribute
|
||||
* values with mixed bound and unbound namespaces.
|
||||
*/
|
||||
START_TEST(test_misc_attribute_leak) {
|
||||
const char *text = "<D xmlns:L=\"D\" l:a='' L:a=''/>";
|
||||
XML_Memory_Handling_Suite memsuite
|
||||
= {tracking_malloc, tracking_realloc, tracking_free};
|
||||
|
||||
g_parser = XML_ParserCreate_MM(XCS("UTF-8"), &memsuite, XCS("\n"));
|
||||
expect_failure(text, XML_ERROR_UNBOUND_PREFIX, "Unbound prefixes not found");
|
||||
XML_ParserFree(g_parser);
|
||||
/* Prevent the teardown trying to double free */
|
||||
g_parser = NULL;
|
||||
|
||||
if (! tracking_report())
|
||||
fail("Memory leak found");
|
||||
}
|
||||
END_TEST
|
||||
|
||||
/* Test parser created for UTF-16LE is successful */
|
||||
START_TEST(test_misc_utf16le) {
|
||||
const char text[] =
|
||||
/* <?xml version='1.0'?><q>Hi</q> */
|
||||
"<\0?\0x\0m\0l\0 \0"
|
||||
"v\0e\0r\0s\0i\0o\0n\0=\0'\0\x31\0.\0\x30\0'\0?\0>\0"
|
||||
"<\0q\0>\0H\0i\0<\0/\0q\0>\0";
|
||||
const XML_Char *expected = XCS("Hi");
|
||||
CharData storage;
|
||||
|
||||
g_parser = XML_ParserCreate(XCS("UTF-16LE"));
|
||||
if (g_parser == NULL)
|
||||
fail("Parser not created");
|
||||
|
||||
CharData_Init(&storage);
|
||||
XML_SetUserData(g_parser, &storage);
|
||||
XML_SetCharacterDataHandler(g_parser, accumulate_characters);
|
||||
if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE)
|
||||
== XML_STATUS_ERROR)
|
||||
xml_failure(g_parser);
|
||||
CharData_CheckXMLChars(&storage, expected);
|
||||
}
|
||||
END_TEST
|
||||
|
||||
START_TEST(test_misc_stop_during_end_handler_issue_240_1) {
|
||||
XML_Parser parser;
|
||||
DataIssue240 *mydata;
|
||||
enum XML_Status result;
|
||||
const char *const doc1 = "<doc><e1/><e><foo/></e></doc>";
|
||||
|
||||
parser = XML_ParserCreate(NULL);
|
||||
XML_SetElementHandler(parser, start_element_issue_240, end_element_issue_240);
|
||||
mydata = (DataIssue240 *)malloc(sizeof(DataIssue240));
|
||||
mydata->parser = parser;
|
||||
mydata->deep = 0;
|
||||
XML_SetUserData(parser, mydata);
|
||||
|
||||
result = _XML_Parse_SINGLE_BYTES(parser, doc1, (int)strlen(doc1), 1);
|
||||
XML_ParserFree(parser);
|
||||
free(mydata);
|
||||
if (result != XML_STATUS_ERROR)
|
||||
fail("Stopping the parser did not work as expected");
|
||||
}
|
||||
END_TEST
|
||||
|
||||
START_TEST(test_misc_stop_during_end_handler_issue_240_2) {
|
||||
XML_Parser parser;
|
||||
DataIssue240 *mydata;
|
||||
enum XML_Status result;
|
||||
const char *const doc2 = "<doc><elem/></doc>";
|
||||
|
||||
parser = XML_ParserCreate(NULL);
|
||||
XML_SetElementHandler(parser, start_element_issue_240, end_element_issue_240);
|
||||
mydata = (DataIssue240 *)malloc(sizeof(DataIssue240));
|
||||
mydata->parser = parser;
|
||||
mydata->deep = 0;
|
||||
XML_SetUserData(parser, mydata);
|
||||
|
||||
result = _XML_Parse_SINGLE_BYTES(parser, doc2, (int)strlen(doc2), 1);
|
||||
XML_ParserFree(parser);
|
||||
free(mydata);
|
||||
if (result != XML_STATUS_ERROR)
|
||||
fail("Stopping the parser did not work as expected");
|
||||
}
|
||||
END_TEST
|
||||
|
||||
START_TEST(test_misc_deny_internal_entity_closing_doctype_issue_317) {
|
||||
const char *const inputOne = "<!DOCTYPE d [\n"
|
||||
"<!ENTITY % e ']><d/>'>\n"
|
||||
"\n"
|
||||
"%e;";
|
||||
const char *const inputTwo = "<!DOCTYPE d [\n"
|
||||
"<!ENTITY % e1 ']><d/>'><!ENTITY % e2 '&e1;'>\n"
|
||||
"\n"
|
||||
"%e2;";
|
||||
const char *const inputThree = "<!DOCTYPE d [\n"
|
||||
"<!ENTITY % e ']><d'>\n"
|
||||
"\n"
|
||||
"%e;";
|
||||
const char *const inputIssue317 = "<!DOCTYPE doc [\n"
|
||||
"<!ENTITY % foo ']>\n"
|
||||
"<doc>Hell<oc (#PCDATA)*>'>\n"
|
||||
"%foo;\n"
|
||||
"]>\n"
|
||||
"<doc>Hello, world</dVc>";
|
||||
|
||||
const char *const inputs[] = {inputOne, inputTwo, inputThree, inputIssue317};
|
||||
size_t inputIndex = 0;
|
||||
|
||||
for (; inputIndex < sizeof(inputs) / sizeof(inputs[0]); inputIndex++) {
|
||||
set_subtest("%s", inputs[inputIndex]);
|
||||
XML_Parser parser;
|
||||
enum XML_Status parseResult;
|
||||
int setParamEntityResult;
|
||||
XML_Size lineNumber;
|
||||
XML_Size columnNumber;
|
||||
const char *const input = inputs[inputIndex];
|
||||
|
||||
parser = XML_ParserCreate(NULL);
|
||||
setParamEntityResult
|
||||
= XML_SetParamEntityParsing(parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
|
||||
if (setParamEntityResult != 1)
|
||||
fail("Failed to set XML_PARAM_ENTITY_PARSING_ALWAYS.");
|
||||
|
||||
parseResult = _XML_Parse_SINGLE_BYTES(parser, input, (int)strlen(input), 0);
|
||||
if (parseResult != XML_STATUS_ERROR) {
|
||||
parseResult = _XML_Parse_SINGLE_BYTES(parser, "", 0, 1);
|
||||
if (parseResult != XML_STATUS_ERROR) {
|
||||
fail("Parsing was expected to fail but succeeded.");
|
||||
}
|
||||
}
|
||||
|
||||
if (XML_GetErrorCode(parser) != XML_ERROR_INVALID_TOKEN)
|
||||
fail("Error code does not match XML_ERROR_INVALID_TOKEN");
|
||||
|
||||
lineNumber = XML_GetCurrentLineNumber(parser);
|
||||
if (lineNumber != 4)
|
||||
fail("XML_GetCurrentLineNumber does not work as expected.");
|
||||
|
||||
columnNumber = XML_GetCurrentColumnNumber(parser);
|
||||
if (columnNumber != 0)
|
||||
fail("XML_GetCurrentColumnNumber does not work as expected.");
|
||||
|
||||
XML_ParserFree(parser);
|
||||
}
|
||||
}
|
||||
END_TEST
|
||||
|
||||
START_TEST(test_misc_tag_mismatch_reset_leak) {
|
||||
#ifdef XML_NS
|
||||
const char *const text = "<open xmlns='https://namespace1.test'></close>";
|
||||
XML_Parser parser = XML_ParserCreateNS(NULL, XCS('\n'));
|
||||
|
||||
if (_XML_Parse_SINGLE_BYTES(parser, text, (int)strlen(text), XML_TRUE)
|
||||
!= XML_STATUS_ERROR)
|
||||
fail("Call to parse was expected to fail");
|
||||
if (XML_GetErrorCode(parser) != XML_ERROR_TAG_MISMATCH)
|
||||
fail("Call to parse was expected to fail from a closing tag mismatch");
|
||||
|
||||
XML_ParserReset(parser, NULL);
|
||||
|
||||
if (_XML_Parse_SINGLE_BYTES(parser, text, (int)strlen(text), XML_TRUE)
|
||||
!= XML_STATUS_ERROR)
|
||||
fail("Call to parse was expected to fail");
|
||||
if (XML_GetErrorCode(parser) != XML_ERROR_TAG_MISMATCH)
|
||||
fail("Call to parse was expected to fail from a closing tag mismatch");
|
||||
|
||||
XML_ParserFree(parser);
|
||||
#endif
|
||||
}
|
||||
END_TEST
|
||||
|
||||
START_TEST(test_misc_create_external_entity_parser_with_null_context) {
|
||||
// With XML_DTD undefined, the only supported case of external entities
|
||||
// is pattern "<!ENTITY entity123 SYSTEM 'filename123'>". A NULL context
|
||||
// was causing a segfault through a null pointer dereference in function
|
||||
// setContext, previously.
|
||||
XML_Parser parser = XML_ParserCreate(NULL);
|
||||
XML_Parser ext_parser = XML_ExternalEntityParserCreate(parser, NULL, NULL);
|
||||
#ifdef XML_DTD
|
||||
assert_true(ext_parser != NULL);
|
||||
XML_ParserFree(ext_parser);
|
||||
#else
|
||||
assert_true(ext_parser == NULL);
|
||||
#endif /* XML_DTD */
|
||||
XML_ParserFree(parser);
|
||||
}
|
||||
END_TEST
|
||||
|
||||
START_TEST(test_misc_general_entities_support) {
|
||||
const char *const doc
|
||||
= "<!DOCTYPE r [\n"
|
||||
"<!ENTITY e1 'v1'>\n"
|
||||
"<!ENTITY e2 SYSTEM 'v2'>\n"
|
||||
"]>\n"
|
||||
"<r a1='[&e1;]'>[&e1;][&e2;][&'><"]</r>";
|
||||
|
||||
CharData storage;
|
||||
CharData_Init(&storage);
|
||||
|
||||
XML_Parser parser = XML_ParserCreate(NULL);
|
||||
XML_SetUserData(parser, &storage);
|
||||
XML_SetStartElementHandler(parser, accumulate_start_element);
|
||||
XML_SetExternalEntityRefHandler(parser,
|
||||
external_entity_failer__if_not_xml_ge);
|
||||
XML_SetEntityDeclHandler(parser, accumulate_entity_decl);
|
||||
XML_SetCharacterDataHandler(parser, accumulate_char_data);
|
||||
|
||||
if (_XML_Parse_SINGLE_BYTES(parser, doc, (int)strlen(doc), XML_TRUE)
|
||||
!= XML_STATUS_OK) {
|
||||
xml_failure(parser);
|
||||
}
|
||||
|
||||
XML_ParserFree(parser);
|
||||
|
||||
CharData_CheckXMLChars(&storage,
|
||||
/* clang-format off */
|
||||
#if XML_GE == 1
|
||||
XCS("e1=v1\n")
|
||||
XCS("e2=(null)\n")
|
||||
XCS("(r(a1=[v1]))\n")
|
||||
XCS("[v1][][&'><\"]")
|
||||
#else
|
||||
XCS("e1=&e1;\n")
|
||||
XCS("e2=(null)\n")
|
||||
XCS("(r(a1=[&e1;]))\n")
|
||||
XCS("[&e1;][&e2;][&'><\"]")
|
||||
#endif
|
||||
);
|
||||
/* clang-format on */
|
||||
}
|
||||
END_TEST
|
||||
|
||||
static void XMLCALL
|
||||
resumable_stopping_character_handler(void *userData, const XML_Char *s,
|
||||
int len) {
|
||||
UNUSED_P(s);
|
||||
UNUSED_P(len);
|
||||
XML_Parser parser = (XML_Parser)userData;
|
||||
XML_StopParser(parser, XML_TRUE);
|
||||
}
|
||||
|
||||
// NOTE: This test needs active LeakSanitizer to be of actual use
|
||||
START_TEST(test_misc_char_handler_stop_without_leak) {
|
||||
const char *const data
|
||||
= "<!DOCTYPE t1[<!ENTITY e1 'angle<'><!ENTITY e2 '&e1;'>]><t1>&e2;";
|
||||
XML_Parser parser = XML_ParserCreate(NULL);
|
||||
assert_true(parser != NULL);
|
||||
XML_SetUserData(parser, parser);
|
||||
XML_SetCharacterDataHandler(parser, resumable_stopping_character_handler);
|
||||
_XML_Parse_SINGLE_BYTES(parser, data, (int)strlen(data), XML_FALSE);
|
||||
XML_ParserFree(parser);
|
||||
}
|
||||
END_TEST
|
||||
|
||||
void
|
||||
make_miscellaneous_test_case(Suite *s) {
|
||||
TCase *tc_misc = tcase_create("miscellaneous tests");
|
||||
|
||||
suite_add_tcase(s, tc_misc);
|
||||
tcase_add_checked_fixture(tc_misc, NULL, basic_teardown);
|
||||
|
||||
tcase_add_test(tc_misc, test_misc_alloc_create_parser);
|
||||
tcase_add_test(tc_misc, test_misc_alloc_create_parser_with_encoding);
|
||||
tcase_add_test(tc_misc, test_misc_null_parser);
|
||||
tcase_add_test(tc_misc, test_misc_error_string);
|
||||
tcase_add_test(tc_misc, test_misc_version);
|
||||
tcase_add_test(tc_misc, test_misc_features);
|
||||
tcase_add_test(tc_misc, test_misc_attribute_leak);
|
||||
tcase_add_test(tc_misc, test_misc_utf16le);
|
||||
tcase_add_test(tc_misc, test_misc_stop_during_end_handler_issue_240_1);
|
||||
tcase_add_test(tc_misc, test_misc_stop_during_end_handler_issue_240_2);
|
||||
tcase_add_test__ifdef_xml_dtd(
|
||||
tc_misc, test_misc_deny_internal_entity_closing_doctype_issue_317);
|
||||
tcase_add_test(tc_misc, test_misc_tag_mismatch_reset_leak);
|
||||
tcase_add_test(tc_misc,
|
||||
test_misc_create_external_entity_parser_with_null_context);
|
||||
tcase_add_test(tc_misc, test_misc_general_entities_support);
|
||||
tcase_add_test(tc_misc, test_misc_char_handler_stop_without_leak);
|
||||
}
|
||||
@@ -0,0 +1,56 @@
|
||||
/* Tests in the "miscellaneous" test case for the Expat test suite
|
||||
__ __ _
|
||||
___\ \/ /_ __ __ _| |_
|
||||
/ _ \\ /| '_ \ / _` | __|
|
||||
| __// \| |_) | (_| | |_
|
||||
\___/_/\_\ .__/ \__,_|\__|
|
||||
|_| XML parser
|
||||
|
||||
Copyright (c) 2001-2006 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
|
||||
Copyright (c) 2003 Greg Stein <gstein@users.sourceforge.net>
|
||||
Copyright (c) 2005-2007 Steven Solie <steven@solie.ca>
|
||||
Copyright (c) 2005-2012 Karl Waclawek <karl@waclawek.net>
|
||||
Copyright (c) 2016-2022 Sebastian Pipping <sebastian@pipping.org>
|
||||
Copyright (c) 2017-2022 Rhodri James <rhodri@wildebeest.org.uk>
|
||||
Copyright (c) 2017 Joe Orton <jorton@redhat.com>
|
||||
Copyright (c) 2017 José Gutiérrez de la Concha <jose@zeroc.com>
|
||||
Copyright (c) 2018 Marco Maggi <marco.maggi-ipsu@poste.it>
|
||||
Copyright (c) 2019 David Loffredo <loffredo@steptools.com>
|
||||
Copyright (c) 2020 Tim Gates <tim.gates@iress.com>
|
||||
Copyright (c) 2021 Donghee Na <donghee.na@python.org>
|
||||
Licensed under the MIT license:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
persons to whom the Software is furnished to do so, subject to the
|
||||
following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included
|
||||
in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
||||
NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||
USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#ifndef XML_MISC_TESTS_H
|
||||
# define XML_MISC_TESTS_H
|
||||
|
||||
extern void make_miscellaneous_test_case(Suite *s);
|
||||
|
||||
#endif /* XML_MISC_TESTS_H */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
@@ -0,0 +1,32 @@
|
||||
/* C++ compilation harness for the test suite.
|
||||
__ __ _
|
||||
___\ \/ /_ __ __ _| |_
|
||||
/ _ \\ /| '_ \ / _` | __|
|
||||
| __// \| |_) | (_| | |_
|
||||
\___/_/\_\ .__/ \__,_|\__|
|
||||
|_| XML parser
|
||||
|
||||
Copyright (c) 2023 Sebastian Pipping <sebastian@pipping.org>
|
||||
Licensed under the MIT license:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
persons to whom the Software is furnished to do so, subject to the
|
||||
following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included
|
||||
in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
||||
NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||
USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include "misc_tests.c"
|
||||
@@ -0,0 +1,754 @@
|
||||
/* Tests in the "namespace" test case for the Expat test suite
|
||||
__ __ _
|
||||
___\ \/ /_ __ __ _| |_
|
||||
/ _ \\ /| '_ \ / _` | __|
|
||||
| __// \| |_) | (_| | |_
|
||||
\___/_/\_\ .__/ \__,_|\__|
|
||||
|_| XML parser
|
||||
|
||||
Copyright (c) 2001-2006 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
|
||||
Copyright (c) 2003 Greg Stein <gstein@users.sourceforge.net>
|
||||
Copyright (c) 2005-2007 Steven Solie <steven@solie.ca>
|
||||
Copyright (c) 2005-2012 Karl Waclawek <karl@waclawek.net>
|
||||
Copyright (c) 2016-2023 Sebastian Pipping <sebastian@pipping.org>
|
||||
Copyright (c) 2017-2022 Rhodri James <rhodri@wildebeest.org.uk>
|
||||
Copyright (c) 2017 Joe Orton <jorton@redhat.com>
|
||||
Copyright (c) 2017 José Gutiérrez de la Concha <jose@zeroc.com>
|
||||
Copyright (c) 2018 Marco Maggi <marco.maggi-ipsu@poste.it>
|
||||
Copyright (c) 2019 David Loffredo <loffredo@steptools.com>
|
||||
Copyright (c) 2020 Tim Gates <tim.gates@iress.com>
|
||||
Copyright (c) 2021 Donghee Na <donghee.na@python.org>
|
||||
Copyright (c) 2023 Sony Corporation / Snild Dolkow <snild@sony.com>
|
||||
Licensed under the MIT license:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
persons to whom the Software is furnished to do so, subject to the
|
||||
following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included
|
||||
in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
||||
NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||
USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include "expat_config.h"
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include "expat.h"
|
||||
#include "internal.h"
|
||||
#include "minicheck.h"
|
||||
#include "common.h"
|
||||
#include "dummy.h"
|
||||
#include "handlers.h"
|
||||
#include "ns_tests.h"
|
||||
|
||||
static void
|
||||
namespace_setup(void) {
|
||||
g_parser = XML_ParserCreateNS(NULL, XCS(' '));
|
||||
if (g_parser == NULL)
|
||||
fail("Parser not created.");
|
||||
}
|
||||
|
||||
static void
|
||||
namespace_teardown(void) {
|
||||
basic_teardown();
|
||||
}
|
||||
|
||||
START_TEST(test_return_ns_triplet) {
|
||||
const char *text = "<foo:e xmlns:foo='http://example.org/' bar:a='12'\n"
|
||||
" xmlns:bar='http://example.org/'>";
|
||||
const char *epilog = "</foo:e>";
|
||||
const XML_Char *elemstr[]
|
||||
= {XCS("http://example.org/ e foo"), XCS("http://example.org/ a bar")};
|
||||
XML_SetReturnNSTriplet(g_parser, XML_TRUE);
|
||||
XML_SetUserData(g_parser, (void *)elemstr);
|
||||
XML_SetElementHandler(g_parser, triplet_start_checker, triplet_end_checker);
|
||||
XML_SetNamespaceDeclHandler(g_parser, dummy_start_namespace_decl_handler,
|
||||
dummy_end_namespace_decl_handler);
|
||||
g_triplet_start_flag = XML_FALSE;
|
||||
g_triplet_end_flag = XML_FALSE;
|
||||
init_dummy_handlers();
|
||||
if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_FALSE)
|
||||
== XML_STATUS_ERROR)
|
||||
xml_failure(g_parser);
|
||||
/* Check that unsetting "return triplets" fails while still parsing */
|
||||
XML_SetReturnNSTriplet(g_parser, XML_FALSE);
|
||||
if (_XML_Parse_SINGLE_BYTES(g_parser, epilog, (int)strlen(epilog), XML_TRUE)
|
||||
== XML_STATUS_ERROR)
|
||||
xml_failure(g_parser);
|
||||
if (! g_triplet_start_flag)
|
||||
fail("triplet_start_checker not invoked");
|
||||
if (! g_triplet_end_flag)
|
||||
fail("triplet_end_checker not invoked");
|
||||
if (get_dummy_handler_flags()
|
||||
!= (DUMMY_START_NS_DECL_HANDLER_FLAG | DUMMY_END_NS_DECL_HANDLER_FLAG))
|
||||
fail("Namespace handlers not called");
|
||||
}
|
||||
END_TEST
|
||||
|
||||
/* Test that the parsing status is correctly reset by XML_ParserReset().
|
||||
* We use test_return_ns_triplet() for our example parse to improve
|
||||
* coverage of tidying up code executed.
|
||||
*/
|
||||
START_TEST(test_ns_parser_reset) {
|
||||
XML_ParsingStatus status;
|
||||
|
||||
XML_GetParsingStatus(g_parser, &status);
|
||||
if (status.parsing != XML_INITIALIZED)
|
||||
fail("parsing status doesn't start INITIALIZED");
|
||||
test_return_ns_triplet();
|
||||
XML_GetParsingStatus(g_parser, &status);
|
||||
if (status.parsing != XML_FINISHED)
|
||||
fail("parsing status doesn't end FINISHED");
|
||||
XML_ParserReset(g_parser, NULL);
|
||||
XML_GetParsingStatus(g_parser, &status);
|
||||
if (status.parsing != XML_INITIALIZED)
|
||||
fail("parsing status doesn't reset to INITIALIZED");
|
||||
}
|
||||
END_TEST
|
||||
|
||||
static void
|
||||
run_ns_tagname_overwrite_test(const char *text, const XML_Char *result) {
|
||||
CharData storage;
|
||||
CharData_Init(&storage);
|
||||
XML_SetUserData(g_parser, &storage);
|
||||
XML_SetElementHandler(g_parser, overwrite_start_checker,
|
||||
overwrite_end_checker);
|
||||
if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
|
||||
== XML_STATUS_ERROR)
|
||||
xml_failure(g_parser);
|
||||
CharData_CheckXMLChars(&storage, result);
|
||||
}
|
||||
|
||||
/* Regression test for SF bug #566334. */
|
||||
START_TEST(test_ns_tagname_overwrite) {
|
||||
const char *text = "<n:e xmlns:n='http://example.org/'>\n"
|
||||
" <n:f n:attr='foo'/>\n"
|
||||
" <n:g n:attr2='bar'/>\n"
|
||||
"</n:e>";
|
||||
const XML_Char *result = XCS("start http://example.org/ e\n")
|
||||
XCS("start http://example.org/ f\n")
|
||||
XCS("attribute http://example.org/ attr\n")
|
||||
XCS("end http://example.org/ f\n")
|
||||
XCS("start http://example.org/ g\n")
|
||||
XCS("attribute http://example.org/ attr2\n")
|
||||
XCS("end http://example.org/ g\n")
|
||||
XCS("end http://example.org/ e\n");
|
||||
run_ns_tagname_overwrite_test(text, result);
|
||||
}
|
||||
END_TEST
|
||||
|
||||
/* Regression test for SF bug #566334. */
|
||||
START_TEST(test_ns_tagname_overwrite_triplet) {
|
||||
const char *text = "<n:e xmlns:n='http://example.org/'>\n"
|
||||
" <n:f n:attr='foo'/>\n"
|
||||
" <n:g n:attr2='bar'/>\n"
|
||||
"</n:e>";
|
||||
const XML_Char *result = XCS("start http://example.org/ e n\n")
|
||||
XCS("start http://example.org/ f n\n")
|
||||
XCS("attribute http://example.org/ attr n\n")
|
||||
XCS("end http://example.org/ f n\n")
|
||||
XCS("start http://example.org/ g n\n")
|
||||
XCS("attribute http://example.org/ attr2 n\n")
|
||||
XCS("end http://example.org/ g n\n")
|
||||
XCS("end http://example.org/ e n\n");
|
||||
XML_SetReturnNSTriplet(g_parser, XML_TRUE);
|
||||
run_ns_tagname_overwrite_test(text, result);
|
||||
}
|
||||
END_TEST
|
||||
|
||||
/* Regression test for SF bug #620343. */
|
||||
START_TEST(test_start_ns_clears_start_element) {
|
||||
/* This needs to use separate start/end tags; using the empty tag
|
||||
syntax doesn't cause the problematic path through Expat to be
|
||||
taken.
|
||||
*/
|
||||
const char *text = "<e xmlns='http://example.org/'></e>";
|
||||
|
||||
XML_SetStartElementHandler(g_parser, start_element_fail);
|
||||
XML_SetStartNamespaceDeclHandler(g_parser, start_ns_clearing_start_element);
|
||||
XML_SetEndNamespaceDeclHandler(g_parser, dummy_end_namespace_decl_handler);
|
||||
XML_UseParserAsHandlerArg(g_parser);
|
||||
if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
|
||||
== XML_STATUS_ERROR)
|
||||
xml_failure(g_parser);
|
||||
}
|
||||
END_TEST
|
||||
|
||||
/* Regression test for SF bug #616863. */
|
||||
START_TEST(test_default_ns_from_ext_subset_and_ext_ge) {
|
||||
const char *text = "<?xml version='1.0'?>\n"
|
||||
"<!DOCTYPE doc SYSTEM 'http://example.org/doc.dtd' [\n"
|
||||
" <!ENTITY en SYSTEM 'http://example.org/entity.ent'>\n"
|
||||
"]>\n"
|
||||
"<doc xmlns='http://example.org/ns1'>\n"
|
||||
"&en;\n"
|
||||
"</doc>";
|
||||
|
||||
XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
|
||||
XML_SetExternalEntityRefHandler(g_parser, external_entity_handler);
|
||||
/* We actually need to set this handler to tickle this bug. */
|
||||
XML_SetStartElementHandler(g_parser, dummy_start_element);
|
||||
XML_SetUserData(g_parser, NULL);
|
||||
if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
|
||||
== XML_STATUS_ERROR)
|
||||
xml_failure(g_parser);
|
||||
}
|
||||
END_TEST
|
||||
|
||||
/* Regression test #1 for SF bug #673791. */
|
||||
START_TEST(test_ns_prefix_with_empty_uri_1) {
|
||||
const char *text = "<doc xmlns:prefix='http://example.org/'>\n"
|
||||
" <e xmlns:prefix=''/>\n"
|
||||
"</doc>";
|
||||
|
||||
expect_failure(text, XML_ERROR_UNDECLARING_PREFIX,
|
||||
"Did not report re-setting namespace"
|
||||
" URI with prefix to ''.");
|
||||
}
|
||||
END_TEST
|
||||
|
||||
/* Regression test #2 for SF bug #673791. */
|
||||
START_TEST(test_ns_prefix_with_empty_uri_2) {
|
||||
const char *text = "<?xml version='1.0'?>\n"
|
||||
"<docelem xmlns:pre=''/>";
|
||||
|
||||
expect_failure(text, XML_ERROR_UNDECLARING_PREFIX,
|
||||
"Did not report setting namespace URI with prefix to ''.");
|
||||
}
|
||||
END_TEST
|
||||
|
||||
/* Regression test #3 for SF bug #673791. */
|
||||
START_TEST(test_ns_prefix_with_empty_uri_3) {
|
||||
const char *text = "<!DOCTYPE doc [\n"
|
||||
" <!ELEMENT doc EMPTY>\n"
|
||||
" <!ATTLIST doc\n"
|
||||
" xmlns:prefix CDATA ''>\n"
|
||||
"]>\n"
|
||||
"<doc/>";
|
||||
|
||||
expect_failure(text, XML_ERROR_UNDECLARING_PREFIX,
|
||||
"Didn't report attr default setting NS w/ prefix to ''.");
|
||||
}
|
||||
END_TEST
|
||||
|
||||
/* Regression test #4 for SF bug #673791. */
|
||||
START_TEST(test_ns_prefix_with_empty_uri_4) {
|
||||
const char *text = "<!DOCTYPE doc [\n"
|
||||
" <!ELEMENT prefix:doc EMPTY>\n"
|
||||
" <!ATTLIST prefix:doc\n"
|
||||
" xmlns:prefix CDATA 'http://example.org/'>\n"
|
||||
"]>\n"
|
||||
"<prefix:doc/>";
|
||||
/* Packaged info expected by the end element handler;
|
||||
the weird structuring lets us reuse the triplet_end_checker()
|
||||
function also used for another test. */
|
||||
const XML_Char *elemstr[] = {XCS("http://example.org/ doc prefix")};
|
||||
XML_SetReturnNSTriplet(g_parser, XML_TRUE);
|
||||
XML_SetUserData(g_parser, (void *)elemstr);
|
||||
XML_SetEndElementHandler(g_parser, triplet_end_checker);
|
||||
if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
|
||||
== XML_STATUS_ERROR)
|
||||
xml_failure(g_parser);
|
||||
}
|
||||
END_TEST
|
||||
|
||||
/* Test with non-xmlns prefix */
|
||||
START_TEST(test_ns_unbound_prefix) {
|
||||
const char *text = "<!DOCTYPE doc [\n"
|
||||
" <!ELEMENT prefix:doc EMPTY>\n"
|
||||
" <!ATTLIST prefix:doc\n"
|
||||
" notxmlns:prefix CDATA 'http://example.org/'>\n"
|
||||
"]>\n"
|
||||
"<prefix:doc/>";
|
||||
|
||||
if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
|
||||
!= XML_STATUS_ERROR)
|
||||
fail("Unbound prefix incorrectly passed");
|
||||
if (XML_GetErrorCode(g_parser) != XML_ERROR_UNBOUND_PREFIX)
|
||||
xml_failure(g_parser);
|
||||
}
|
||||
END_TEST
|
||||
|
||||
START_TEST(test_ns_default_with_empty_uri) {
|
||||
const char *text = "<doc xmlns='http://example.org/'>\n"
|
||||
" <e xmlns=''/>\n"
|
||||
"</doc>";
|
||||
/* Add some handlers to exercise extra code paths */
|
||||
XML_SetStartNamespaceDeclHandler(g_parser,
|
||||
dummy_start_namespace_decl_handler);
|
||||
XML_SetEndNamespaceDeclHandler(g_parser, dummy_end_namespace_decl_handler);
|
||||
if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
|
||||
== XML_STATUS_ERROR)
|
||||
xml_failure(g_parser);
|
||||
}
|
||||
END_TEST
|
||||
|
||||
/* Regression test for SF bug #692964: two prefixes for one namespace. */
|
||||
START_TEST(test_ns_duplicate_attrs_diff_prefixes) {
|
||||
const char *text = "<doc xmlns:a='http://example.org/a'\n"
|
||||
" xmlns:b='http://example.org/a'\n"
|
||||
" a:a='v' b:a='v' />";
|
||||
expect_failure(text, XML_ERROR_DUPLICATE_ATTRIBUTE,
|
||||
"did not report multiple attributes with same URI+name");
|
||||
}
|
||||
END_TEST
|
||||
|
||||
START_TEST(test_ns_duplicate_hashes) {
|
||||
/* The hash of an attribute is calculated as the hash of its URI
|
||||
* concatenated with a space followed by its name (after the
|
||||
* colon). We wish to generate attributes with the same hash
|
||||
* value modulo the attribute table size so that we can check that
|
||||
* the attribute hash table works correctly. The attribute hash
|
||||
* table size will be the smallest power of two greater than the
|
||||
* number of attributes, but at least eight. There is
|
||||
* unfortunately no programmatic way of getting the hash or the
|
||||
* table size at user level, but the test code coverage percentage
|
||||
* will drop if the hashes cease to point to the same row.
|
||||
*
|
||||
* The cunning plan is to have few enough attributes to have a
|
||||
* reliable table size of 8, and have the single letter attribute
|
||||
* names be 8 characters apart, producing a hash which will be the
|
||||
* same modulo 8.
|
||||
*/
|
||||
const char *text = "<doc xmlns:a='http://example.org/a'\n"
|
||||
" a:a='v' a:i='w' />";
|
||||
if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
|
||||
== XML_STATUS_ERROR)
|
||||
xml_failure(g_parser);
|
||||
}
|
||||
END_TEST
|
||||
|
||||
/* Regression test for SF bug #695401: unbound prefix. */
|
||||
START_TEST(test_ns_unbound_prefix_on_attribute) {
|
||||
const char *text = "<doc a:attr=''/>";
|
||||
expect_failure(text, XML_ERROR_UNBOUND_PREFIX,
|
||||
"did not report unbound prefix on attribute");
|
||||
}
|
||||
END_TEST
|
||||
|
||||
/* Regression test for SF bug #695401: unbound prefix. */
|
||||
START_TEST(test_ns_unbound_prefix_on_element) {
|
||||
const char *text = "<a:doc/>";
|
||||
expect_failure(text, XML_ERROR_UNBOUND_PREFIX,
|
||||
"did not report unbound prefix on element");
|
||||
}
|
||||
END_TEST
|
||||
|
||||
/* Test that long element names with namespaces are handled correctly */
|
||||
START_TEST(test_ns_long_element) {
|
||||
const char *text
|
||||
= "<foo:thisisalongenoughelementnametotriggerareallocation\n"
|
||||
" xmlns:foo='http://example.org/' bar:a='12'\n"
|
||||
" xmlns:bar='http://example.org/'>"
|
||||
"</foo:thisisalongenoughelementnametotriggerareallocation>";
|
||||
const XML_Char *elemstr[]
|
||||
= {XCS("http://example.org/")
|
||||
XCS(" thisisalongenoughelementnametotriggerareallocation foo"),
|
||||
XCS("http://example.org/ a bar")};
|
||||
|
||||
XML_SetReturnNSTriplet(g_parser, XML_TRUE);
|
||||
XML_SetUserData(g_parser, (void *)elemstr);
|
||||
XML_SetElementHandler(g_parser, triplet_start_checker, triplet_end_checker);
|
||||
if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
|
||||
== XML_STATUS_ERROR)
|
||||
xml_failure(g_parser);
|
||||
}
|
||||
END_TEST
|
||||
|
||||
/* Test mixed population of prefixed and unprefixed attributes */
|
||||
START_TEST(test_ns_mixed_prefix_atts) {
|
||||
const char *text = "<e a='12' bar:b='13'\n"
|
||||
" xmlns:bar='http://example.org/'>"
|
||||
"</e>";
|
||||
|
||||
if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
|
||||
== XML_STATUS_ERROR)
|
||||
xml_failure(g_parser);
|
||||
}
|
||||
END_TEST
|
||||
|
||||
/* Test having a long namespaced element name inside a short one.
|
||||
* This exercises some internal buffer reallocation that is shared
|
||||
* across elements with the same namespace URI.
|
||||
*/
|
||||
START_TEST(test_ns_extend_uri_buffer) {
|
||||
const char *text = "<foo:e xmlns:foo='http://example.org/'>"
|
||||
" <foo:thisisalongenoughnametotriggerallocationaction"
|
||||
" foo:a='12' />"
|
||||
"</foo:e>";
|
||||
if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
|
||||
== XML_STATUS_ERROR)
|
||||
xml_failure(g_parser);
|
||||
}
|
||||
END_TEST
|
||||
|
||||
/* Test that xmlns is correctly rejected as an attribute in the xmlns
|
||||
* namespace, but not in other namespaces
|
||||
*/
|
||||
START_TEST(test_ns_reserved_attributes) {
|
||||
const char *text1
|
||||
= "<foo:e xmlns:foo='http://example.org/' xmlns:xmlns='12' />";
|
||||
const char *text2
|
||||
= "<foo:e xmlns:foo='http://example.org/' foo:xmlns='12' />";
|
||||
expect_failure(text1, XML_ERROR_RESERVED_PREFIX_XMLNS,
|
||||
"xmlns not rejected as an attribute");
|
||||
XML_ParserReset(g_parser, NULL);
|
||||
if (_XML_Parse_SINGLE_BYTES(g_parser, text2, (int)strlen(text2), XML_TRUE)
|
||||
== XML_STATUS_ERROR)
|
||||
xml_failure(g_parser);
|
||||
}
|
||||
END_TEST
|
||||
|
||||
/* Test more reserved attributes */
|
||||
START_TEST(test_ns_reserved_attributes_2) {
|
||||
const char *text1 = "<foo:e xmlns:foo='http://example.org/'"
|
||||
" xmlns:xml='http://example.org/' />";
|
||||
const char *text2
|
||||
= "<foo:e xmlns:foo='http://www.w3.org/XML/1998/namespace' />";
|
||||
const char *text3 = "<foo:e xmlns:foo='http://www.w3.org/2000/xmlns/' />";
|
||||
|
||||
expect_failure(text1, XML_ERROR_RESERVED_PREFIX_XML,
|
||||
"xml not rejected as an attribute");
|
||||
XML_ParserReset(g_parser, NULL);
|
||||
expect_failure(text2, XML_ERROR_RESERVED_NAMESPACE_URI,
|
||||
"Use of w3.org URL not faulted");
|
||||
XML_ParserReset(g_parser, NULL);
|
||||
expect_failure(text3, XML_ERROR_RESERVED_NAMESPACE_URI,
|
||||
"Use of w3.org xmlns URL not faulted");
|
||||
}
|
||||
END_TEST
|
||||
|
||||
/* Test string pool handling of namespace names of 2048 characters */
|
||||
/* Exercises a particular string pool growth path */
|
||||
START_TEST(test_ns_extremely_long_prefix) {
|
||||
/* C99 compilers are only required to support 4095-character
|
||||
* strings, so the following needs to be split in two to be safe
|
||||
* for all compilers.
|
||||
*/
|
||||
const char *text1
|
||||
= "<doc "
|
||||
/* 64 character on each line */
|
||||
/* ...gives a total length of 2048 */
|
||||
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
|
||||
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
|
||||
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
|
||||
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
|
||||
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
|
||||
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
|
||||
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
|
||||
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
|
||||
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
|
||||
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
|
||||
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
|
||||
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
|
||||
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
|
||||
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
|
||||
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
|
||||
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
|
||||
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
|
||||
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
|
||||
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
|
||||
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
|
||||
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
|
||||
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
|
||||
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
|
||||
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
|
||||
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
|
||||
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
|
||||
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
|
||||
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
|
||||
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
|
||||
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
|
||||
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
|
||||
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
|
||||
":a='12'";
|
||||
const char *text2
|
||||
= " xmlns:"
|
||||
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
|
||||
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
|
||||
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
|
||||
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
|
||||
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
|
||||
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
|
||||
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
|
||||
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
|
||||
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
|
||||
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
|
||||
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
|
||||
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
|
||||
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
|
||||
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
|
||||
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
|
||||
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
|
||||
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
|
||||
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
|
||||
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
|
||||
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
|
||||
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
|
||||
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
|
||||
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
|
||||
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
|
||||
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
|
||||
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
|
||||
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
|
||||
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
|
||||
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
|
||||
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
|
||||
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
|
||||
"ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
|
||||
"='foo'\n>"
|
||||
"</doc>";
|
||||
|
||||
if (_XML_Parse_SINGLE_BYTES(g_parser, text1, (int)strlen(text1), XML_FALSE)
|
||||
== XML_STATUS_ERROR)
|
||||
xml_failure(g_parser);
|
||||
if (_XML_Parse_SINGLE_BYTES(g_parser, text2, (int)strlen(text2), XML_TRUE)
|
||||
== XML_STATUS_ERROR)
|
||||
xml_failure(g_parser);
|
||||
}
|
||||
END_TEST
|
||||
|
||||
/* Test unknown encoding handlers in namespace setup */
|
||||
START_TEST(test_ns_unknown_encoding_success) {
|
||||
const char *text = "<?xml version='1.0' encoding='prefix-conv'?>\n"
|
||||
"<foo:e xmlns:foo='http://example.org/'>Hi</foo:e>";
|
||||
|
||||
XML_SetUnknownEncodingHandler(g_parser, MiscEncodingHandler, NULL);
|
||||
run_character_check(text, XCS("Hi"));
|
||||
}
|
||||
END_TEST
|
||||
|
||||
/* Test that too many colons are rejected */
|
||||
START_TEST(test_ns_double_colon) {
|
||||
const char *text = "<foo:e xmlns:foo='http://example.org/' foo:a:b='bar' />";
|
||||
const enum XML_Status status
|
||||
= _XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE);
|
||||
#ifdef XML_NS
|
||||
if ((status == XML_STATUS_OK)
|
||||
|| (XML_GetErrorCode(g_parser) != XML_ERROR_INVALID_TOKEN)) {
|
||||
fail("Double colon in attribute name not faulted"
|
||||
" (despite active namespace support)");
|
||||
}
|
||||
#else
|
||||
if (status != XML_STATUS_OK) {
|
||||
fail("Double colon in attribute name faulted"
|
||||
" (despite inactive namespace support");
|
||||
}
|
||||
#endif
|
||||
}
|
||||
END_TEST
|
||||
|
||||
START_TEST(test_ns_double_colon_element) {
|
||||
const char *text = "<foo:bar:e xmlns:foo='http://example.org/' />";
|
||||
const enum XML_Status status
|
||||
= _XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE);
|
||||
#ifdef XML_NS
|
||||
if ((status == XML_STATUS_OK)
|
||||
|| (XML_GetErrorCode(g_parser) != XML_ERROR_INVALID_TOKEN)) {
|
||||
fail("Double colon in element name not faulted"
|
||||
" (despite active namespace support)");
|
||||
}
|
||||
#else
|
||||
if (status != XML_STATUS_OK) {
|
||||
fail("Double colon in element name faulted"
|
||||
" (despite inactive namespace support");
|
||||
}
|
||||
#endif
|
||||
}
|
||||
END_TEST
|
||||
|
||||
/* Test that non-name characters after a colon are rejected */
|
||||
START_TEST(test_ns_bad_attr_leafname) {
|
||||
const char *text = "<foo:e xmlns:foo='http://example.org/' foo:?ar='baz' />";
|
||||
|
||||
expect_failure(text, XML_ERROR_INVALID_TOKEN,
|
||||
"Invalid character in leafname not faulted");
|
||||
}
|
||||
END_TEST
|
||||
|
||||
START_TEST(test_ns_bad_element_leafname) {
|
||||
const char *text = "<foo:?oc xmlns:foo='http://example.org/' />";
|
||||
|
||||
expect_failure(text, XML_ERROR_INVALID_TOKEN,
|
||||
"Invalid character in element leafname not faulted");
|
||||
}
|
||||
END_TEST
|
||||
|
||||
/* Test high-byte-set UTF-16 characters are valid in a leafname */
|
||||
START_TEST(test_ns_utf16_leafname) {
|
||||
const char text[] =
|
||||
/* <n:e xmlns:n='URI' n:{KHO KHWAI}='a' />
|
||||
* where {KHO KHWAI} = U+0E04 = 0xe0 0xb8 0x84 in UTF-8
|
||||
*/
|
||||
"<\0n\0:\0e\0 \0x\0m\0l\0n\0s\0:\0n\0=\0'\0U\0R\0I\0'\0 \0"
|
||||
"n\0:\0\x04\x0e=\0'\0a\0'\0 \0/\0>\0";
|
||||
const XML_Char *expected = XCS("a");
|
||||
CharData storage;
|
||||
|
||||
CharData_Init(&storage);
|
||||
XML_SetStartElementHandler(g_parser, accumulate_attribute);
|
||||
XML_SetUserData(g_parser, &storage);
|
||||
if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE)
|
||||
== XML_STATUS_ERROR)
|
||||
xml_failure(g_parser);
|
||||
CharData_CheckXMLChars(&storage, expected);
|
||||
}
|
||||
END_TEST
|
||||
|
||||
START_TEST(test_ns_utf16_element_leafname) {
|
||||
const char text[] =
|
||||
/* <n:{KHO KHWAI} xmlns:n='URI'/>
|
||||
* where {KHO KHWAI} = U+0E04 = 0xe0 0xb8 0x84 in UTF-8
|
||||
*/
|
||||
"\0<\0n\0:\x0e\x04\0 \0x\0m\0l\0n\0s\0:\0n\0=\0'\0U\0R\0I\0'\0/\0>";
|
||||
#ifdef XML_UNICODE
|
||||
const XML_Char *expected = XCS("URI \x0e04");
|
||||
#else
|
||||
const XML_Char *expected = XCS("URI \xe0\xb8\x84");
|
||||
#endif
|
||||
CharData storage;
|
||||
|
||||
CharData_Init(&storage);
|
||||
XML_SetStartElementHandler(g_parser, start_element_event_handler);
|
||||
XML_SetUserData(g_parser, &storage);
|
||||
if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE)
|
||||
== XML_STATUS_ERROR)
|
||||
xml_failure(g_parser);
|
||||
CharData_CheckXMLChars(&storage, expected);
|
||||
}
|
||||
END_TEST
|
||||
|
||||
START_TEST(test_ns_utf16_doctype) {
|
||||
const char text[] =
|
||||
/* <!DOCTYPE foo:{KHO KHWAI} [ <!ENTITY bar 'baz'> ]>\n
|
||||
* where {KHO KHWAI} = U+0E04 = 0xe0 0xb8 0x84 in UTF-8
|
||||
*/
|
||||
"\0<\0!\0D\0O\0C\0T\0Y\0P\0E\0 \0f\0o\0o\0:\x0e\x04\0 "
|
||||
"\0[\0 \0<\0!\0E\0N\0T\0I\0T\0Y\0 \0b\0a\0r\0 \0'\0b\0a\0z\0'\0>\0 "
|
||||
"\0]\0>\0\n"
|
||||
/* <foo:{KHO KHWAI} xmlns:foo='URI'>&bar;</foo:{KHO KHWAI}> */
|
||||
"\0<\0f\0o\0o\0:\x0e\x04\0 "
|
||||
"\0x\0m\0l\0n\0s\0:\0f\0o\0o\0=\0'\0U\0R\0I\0'\0>"
|
||||
"\0&\0b\0a\0r\0;"
|
||||
"\0<\0/\0f\0o\0o\0:\x0e\x04\0>";
|
||||
#ifdef XML_UNICODE
|
||||
const XML_Char *expected = XCS("URI \x0e04");
|
||||
#else
|
||||
const XML_Char *expected = XCS("URI \xe0\xb8\x84");
|
||||
#endif
|
||||
CharData storage;
|
||||
|
||||
CharData_Init(&storage);
|
||||
XML_SetUserData(g_parser, &storage);
|
||||
XML_SetStartElementHandler(g_parser, start_element_event_handler);
|
||||
XML_SetUnknownEncodingHandler(g_parser, MiscEncodingHandler, NULL);
|
||||
if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE)
|
||||
== XML_STATUS_ERROR)
|
||||
xml_failure(g_parser);
|
||||
CharData_CheckXMLChars(&storage, expected);
|
||||
}
|
||||
END_TEST
|
||||
|
||||
START_TEST(test_ns_invalid_doctype) {
|
||||
const char *text = "<!DOCTYPE foo:!bad [ <!ENTITY bar 'baz' ]>\n"
|
||||
"<foo:!bad>&bar;</foo:!bad>";
|
||||
|
||||
expect_failure(text, XML_ERROR_INVALID_TOKEN,
|
||||
"Invalid character in document local name not faulted");
|
||||
}
|
||||
END_TEST
|
||||
|
||||
START_TEST(test_ns_double_colon_doctype) {
|
||||
const char *text = "<!DOCTYPE foo:a:doc [ <!ENTITY bar 'baz' ]>\n"
|
||||
"<foo:a:doc>&bar;</foo:a:doc>";
|
||||
|
||||
expect_failure(text, XML_ERROR_SYNTAX,
|
||||
"Double colon in document name not faulted");
|
||||
}
|
||||
END_TEST
|
||||
|
||||
START_TEST(test_ns_separator_in_uri) {
|
||||
struct test_case {
|
||||
enum XML_Status expectedStatus;
|
||||
const char *doc;
|
||||
XML_Char namesep;
|
||||
};
|
||||
struct test_case cases[] = {
|
||||
{XML_STATUS_OK, "<doc xmlns='one_two' />", XCS('\n')},
|
||||
{XML_STATUS_ERROR, "<doc xmlns='one
two' />", XCS('\n')},
|
||||
{XML_STATUS_OK, "<doc xmlns='one:two' />", XCS(':')},
|
||||
};
|
||||
|
||||
size_t i = 0;
|
||||
size_t failCount = 0;
|
||||
for (; i < sizeof(cases) / sizeof(cases[0]); i++) {
|
||||
set_subtest("%s", cases[i].doc);
|
||||
XML_Parser parser = XML_ParserCreateNS(NULL, cases[i].namesep);
|
||||
XML_SetElementHandler(parser, dummy_start_element, dummy_end_element);
|
||||
if (_XML_Parse_SINGLE_BYTES(parser, cases[i].doc, (int)strlen(cases[i].doc),
|
||||
/*isFinal*/ XML_TRUE)
|
||||
!= cases[i].expectedStatus) {
|
||||
failCount++;
|
||||
}
|
||||
XML_ParserFree(parser);
|
||||
}
|
||||
|
||||
if (failCount) {
|
||||
fail("Namespace separator handling is broken");
|
||||
}
|
||||
}
|
||||
END_TEST
|
||||
|
||||
void
|
||||
make_namespace_test_case(Suite *s) {
|
||||
TCase *tc_namespace = tcase_create("XML namespaces");
|
||||
|
||||
suite_add_tcase(s, tc_namespace);
|
||||
tcase_add_checked_fixture(tc_namespace, namespace_setup, namespace_teardown);
|
||||
tcase_add_test(tc_namespace, test_return_ns_triplet);
|
||||
tcase_add_test(tc_namespace, test_ns_parser_reset);
|
||||
tcase_add_test(tc_namespace, test_ns_tagname_overwrite);
|
||||
tcase_add_test(tc_namespace, test_ns_tagname_overwrite_triplet);
|
||||
tcase_add_test(tc_namespace, test_start_ns_clears_start_element);
|
||||
tcase_add_test__ifdef_xml_dtd(tc_namespace,
|
||||
test_default_ns_from_ext_subset_and_ext_ge);
|
||||
tcase_add_test(tc_namespace, test_ns_prefix_with_empty_uri_1);
|
||||
tcase_add_test(tc_namespace, test_ns_prefix_with_empty_uri_2);
|
||||
tcase_add_test(tc_namespace, test_ns_prefix_with_empty_uri_3);
|
||||
tcase_add_test(tc_namespace, test_ns_prefix_with_empty_uri_4);
|
||||
tcase_add_test(tc_namespace, test_ns_unbound_prefix);
|
||||
tcase_add_test(tc_namespace, test_ns_default_with_empty_uri);
|
||||
tcase_add_test(tc_namespace, test_ns_duplicate_attrs_diff_prefixes);
|
||||
tcase_add_test(tc_namespace, test_ns_duplicate_hashes);
|
||||
tcase_add_test(tc_namespace, test_ns_unbound_prefix_on_attribute);
|
||||
tcase_add_test(tc_namespace, test_ns_unbound_prefix_on_element);
|
||||
tcase_add_test(tc_namespace, test_ns_long_element);
|
||||
tcase_add_test(tc_namespace, test_ns_mixed_prefix_atts);
|
||||
tcase_add_test(tc_namespace, test_ns_extend_uri_buffer);
|
||||
tcase_add_test(tc_namespace, test_ns_reserved_attributes);
|
||||
tcase_add_test(tc_namespace, test_ns_reserved_attributes_2);
|
||||
tcase_add_test(tc_namespace, test_ns_extremely_long_prefix);
|
||||
tcase_add_test(tc_namespace, test_ns_unknown_encoding_success);
|
||||
tcase_add_test(tc_namespace, test_ns_double_colon);
|
||||
tcase_add_test(tc_namespace, test_ns_double_colon_element);
|
||||
tcase_add_test(tc_namespace, test_ns_bad_attr_leafname);
|
||||
tcase_add_test(tc_namespace, test_ns_bad_element_leafname);
|
||||
tcase_add_test(tc_namespace, test_ns_utf16_leafname);
|
||||
tcase_add_test(tc_namespace, test_ns_utf16_element_leafname);
|
||||
tcase_add_test__if_xml_ge(tc_namespace, test_ns_utf16_doctype);
|
||||
tcase_add_test(tc_namespace, test_ns_invalid_doctype);
|
||||
tcase_add_test(tc_namespace, test_ns_double_colon_doctype);
|
||||
tcase_add_test(tc_namespace, test_ns_separator_in_uri);
|
||||
}
|
||||
@@ -0,0 +1,56 @@
|
||||
/* Tests in the "namespace" test case for the Expat test suite
|
||||
__ __ _
|
||||
___\ \/ /_ __ __ _| |_
|
||||
/ _ \\ /| '_ \ / _` | __|
|
||||
| __// \| |_) | (_| | |_
|
||||
\___/_/\_\ .__/ \__,_|\__|
|
||||
|_| XML parser
|
||||
|
||||
Copyright (c) 2001-2006 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
|
||||
Copyright (c) 2003 Greg Stein <gstein@users.sourceforge.net>
|
||||
Copyright (c) 2005-2007 Steven Solie <steven@solie.ca>
|
||||
Copyright (c) 2005-2012 Karl Waclawek <karl@waclawek.net>
|
||||
Copyright (c) 2016-2022 Sebastian Pipping <sebastian@pipping.org>
|
||||
Copyright (c) 2017-2022 Rhodri James <rhodri@wildebeest.org.uk>
|
||||
Copyright (c) 2017 Joe Orton <jorton@redhat.com>
|
||||
Copyright (c) 2017 José Gutiérrez de la Concha <jose@zeroc.com>
|
||||
Copyright (c) 2018 Marco Maggi <marco.maggi-ipsu@poste.it>
|
||||
Copyright (c) 2019 David Loffredo <loffredo@steptools.com>
|
||||
Copyright (c) 2020 Tim Gates <tim.gates@iress.com>
|
||||
Copyright (c) 2021 Donghee Na <donghee.na@python.org>
|
||||
Licensed under the MIT license:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
persons to whom the Software is furnished to do so, subject to the
|
||||
following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included
|
||||
in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
||||
NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||
USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#ifndef XML_NS_TESTS_H
|
||||
# define XML_NS_TESTS_H
|
||||
|
||||
extern void make_namespace_test_case(Suite *s);
|
||||
|
||||
#endif /* XML_NS_TESTS_H */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
@@ -0,0 +1,32 @@
|
||||
/* C++ compilation harness for the test suite.
|
||||
__ __ _
|
||||
___\ \/ /_ __ __ _| |_
|
||||
/ _ \\ /| '_ \ / _` | __|
|
||||
| __// \| |_) | (_| | |_
|
||||
\___/_/\_\ .__/ \__,_|\__|
|
||||
|_| XML parser
|
||||
|
||||
Copyright (c) 2023 Sebastian Pipping <sebastian@pipping.org>
|
||||
Licensed under the MIT license:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
persons to whom the Software is furnished to do so, subject to the
|
||||
following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included
|
||||
in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
||||
NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||
USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include "ns_tests.c"
|
||||
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,56 @@
|
||||
/* Tests in the "namespace allocation" test case for the Expat test suite
|
||||
__ __ _
|
||||
___\ \/ /_ __ __ _| |_
|
||||
/ _ \\ /| '_ \ / _` | __|
|
||||
| __// \| |_) | (_| | |_
|
||||
\___/_/\_\ .__/ \__,_|\__|
|
||||
|_| XML parser
|
||||
|
||||
Copyright (c) 2001-2006 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
|
||||
Copyright (c) 2003 Greg Stein <gstein@users.sourceforge.net>
|
||||
Copyright (c) 2005-2007 Steven Solie <steven@solie.ca>
|
||||
Copyright (c) 2005-2012 Karl Waclawek <karl@waclawek.net>
|
||||
Copyright (c) 2016-2022 Sebastian Pipping <sebastian@pipping.org>
|
||||
Copyright (c) 2017-2022 Rhodri James <rhodri@wildebeest.org.uk>
|
||||
Copyright (c) 2017 Joe Orton <jorton@redhat.com>
|
||||
Copyright (c) 2017 José Gutiérrez de la Concha <jose@zeroc.com>
|
||||
Copyright (c) 2018 Marco Maggi <marco.maggi-ipsu@poste.it>
|
||||
Copyright (c) 2019 David Loffredo <loffredo@steptools.com>
|
||||
Copyright (c) 2020 Tim Gates <tim.gates@iress.com>
|
||||
Copyright (c) 2021 Donghee Na <donghee.na@python.org>
|
||||
Licensed under the MIT license:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
persons to whom the Software is furnished to do so, subject to the
|
||||
following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included
|
||||
in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
||||
NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||
USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#ifndef XML_NSALLOC_TESTS_H
|
||||
# define XML_NSALLOC_TESTS_H
|
||||
|
||||
extern void make_nsalloc_test_case(Suite *s);
|
||||
|
||||
#endif /* XML_NSALLOC_TESTS_H */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
@@ -0,0 +1,32 @@
|
||||
/* C++ compilation harness for the test suite.
|
||||
__ __ _
|
||||
___\ \/ /_ __ __ _| |_
|
||||
/ _ \\ /| '_ \ / _` | __|
|
||||
| __// \| |_) | (_| | |_
|
||||
\___/_/\_\ .__/ \__,_|\__|
|
||||
|_| XML parser
|
||||
|
||||
Copyright (c) 2023 Sebastian Pipping <sebastian@pipping.org>
|
||||
Licensed under the MIT license:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
persons to whom the Software is furnished to do so, subject to the
|
||||
following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included
|
||||
in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
||||
NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||
USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include "nsalloc_tests.c"
|
||||
+32
-12437
File diff suppressed because it is too large.
Load diff
@@ -9,8 +9,8 @@
|
||||
\___/_/\_\ .__/ \__,_|\__|
|
||||
|_| XML parser
|
||||
|
||||
Copyright (c) 2005 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
|
||||
Copyright (c) 2017 Sebastian Pipping <sebastian@pipping.org>
|
||||
Copyright (c) 2005 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
|
||||
Copyright (c) 2017-2023 Sebastian Pipping <sebastian@pipping.org>
|
||||
Licensed under the MIT license:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
@@ -7,7 +7,8 @@
|
||||
|_| XML parser
|
||||
|
||||
Copyright (c) 2017 Rhodri James <rhodri@wildebeest.org.uk>
|
||||
Copyright (c) 2017-2021 Sebastian Pipping <sebastian@pipping.org>
|
||||
Copyright (c) 2017-2023 Sebastian Pipping <sebastian@pipping.org>
|
||||
Copyright (c) 2022 Sean McBride <sean@rogue-research.com>
|
||||
Licensed under the MIT license:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
@@ -30,6 +31,10 @@
|
||||
USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#if defined(NDEBUG)
|
||||
# undef NDEBUG /* because test suite relies on assert(...) at the moment */
|
||||
#endif
|
||||
|
||||
#include "expat_config.h"
|
||||
|
||||
#include <assert.h>
|
||||
@@ -56,7 +61,7 @@
|
||||
static XML_Char *
|
||||
xmlstrdup(const XML_Char *s) {
|
||||
size_t byte_count = (xcstrlen(s) + 1) * sizeof(XML_Char);
|
||||
XML_Char *dup = malloc(byte_count);
|
||||
XML_Char *const dup = (XML_Char *)malloc(byte_count);
|
||||
|
||||
assert(dup != NULL);
|
||||
memcpy(dup, s, byte_count);
|
||||
@@ -79,13 +84,13 @@ StructData_AddItem(StructData *storage, const XML_Char *s, int data0, int data1,
|
||||
assert(storage != NULL);
|
||||
assert(s != NULL);
|
||||
if (storage->count == storage->max_count) {
|
||||
StructDataEntry *new;
|
||||
StructDataEntry *new_entries;
|
||||
|
||||
storage->max_count += STRUCT_EXTENSION_COUNT;
|
||||
new = realloc(storage->entries,
|
||||
storage->max_count * sizeof(StructDataEntry));
|
||||
assert(new != NULL);
|
||||
storage->entries = new;
|
||||
new_entries = (StructDataEntry *)realloc(
|
||||
storage->entries, storage->max_count * sizeof(StructDataEntry));
|
||||
assert(new_entries != NULL);
|
||||
storage->entries = new_entries;
|
||||
}
|
||||
|
||||
entry = &storage->entries[storage->count];
|
||||
@@ -103,17 +108,17 @@ void
|
||||
StructData_CheckItems(StructData *storage, const StructDataEntry *expected,
|
||||
int count) {
|
||||
char buffer[1024];
|
||||
int i;
|
||||
|
||||
assert(storage != NULL);
|
||||
assert(expected != NULL);
|
||||
if (count != storage->count) {
|
||||
sprintf(buffer, "wrong number of entries: got %d, expected %d",
|
||||
storage->count, count);
|
||||
snprintf(buffer, sizeof(buffer),
|
||||
"wrong number of entries: got %d, expected %d", storage->count,
|
||||
count);
|
||||
StructData_Dispose(storage);
|
||||
fail(buffer);
|
||||
} else {
|
||||
for (i = 0; i < count; i++) {
|
||||
for (int i = 0; i < count; i++) {
|
||||
const StructDataEntry *got = &storage->entries[i];
|
||||
const StructDataEntry *want = &expected[i];
|
||||
|
||||
@@ -126,11 +131,11 @@ StructData_CheckItems(StructData *storage, const StructDataEntry *expected,
|
||||
} else {
|
||||
if (got->data0 != want->data0 || got->data1 != want->data1
|
||||
|| got->data2 != want->data2) {
|
||||
sprintf(buffer,
|
||||
"struct '%" XML_FMT_STR
|
||||
"' expected (%d,%d,%d), got (%d,%d,%d)",
|
||||
got->str, want->data0, want->data1, want->data2, got->data0,
|
||||
got->data1, got->data2);
|
||||
snprintf(buffer, sizeof(buffer),
|
||||
"struct '%" XML_FMT_STR
|
||||
"' expected (%d,%d,%d), got (%d,%d,%d)",
|
||||
got->str, want->data0, want->data1, want->data2, got->data0,
|
||||
got->data1, got->data2);
|
||||
StructData_Dispose(storage);
|
||||
fail(buffer);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
/* C++ compilation harness for the test suite.
|
||||
__ __ _
|
||||
___\ \/ /_ __ __ _| |_
|
||||
/ _ \\ /| '_ \ / _` | __|
|
||||
| __// \| |_) | (_| | |_
|
||||
\___/_/\_\ .__/ \__,_|\__|
|
||||
|_| XML parser
|
||||
|
||||
Copyright (c) 2023 Sebastian Pipping <sebastian@pipping.org>
|
||||
Licensed under the MIT license:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
persons to whom the Software is furnished to do so, subject to the
|
||||
following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included
|
||||
in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
||||
NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||
USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include "structdata.c"
|
||||
@@ -134,6 +134,8 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
|
||||
$(top_srcdir)/conftools/ax-append-compile-flags.m4 \
|
||||
$(top_srcdir)/conftools/ax-append-link-flags.m4 \
|
||||
$(top_srcdir)/conftools/expatcfg-compiler-supports-visibility.m4 \
|
||||
$(top_srcdir)/conftools/ax-cxx-compile-stdcxx.m4 \
|
||||
$(top_srcdir)/conftools/ax-cxx-compile-stdcxx-11.m4 \
|
||||
$(top_srcdir)/configure.ac
|
||||
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
||||
$(ACLOCAL_M4)
|
||||
@@ -267,6 +269,7 @@ FGREP = @FGREP@
|
||||
FILECMD = @FILECMD@
|
||||
FILEMAP = @FILEMAP@
|
||||
GREP = @GREP@
|
||||
HAVE_CXX11 = @HAVE_CXX11@
|
||||
INSTALL = @INSTALL@
|
||||
INSTALL_DATA = @INSTALL_DATA@
|
||||
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
||||
@@ -286,6 +289,7 @@ LIPO = @LIPO@
|
||||
LN_S = @LN_S@
|
||||
LTLIBOBJS = @LTLIBOBJS@
|
||||
LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
|
||||
MAINT = @MAINT@
|
||||
MAKEINFO = @MAKEINFO@
|
||||
MANIFEST_TOOL = @MANIFEST_TOOL@
|
||||
MKDIR_P = @MKDIR_P@
|
||||
@@ -392,7 +396,7 @@ all: all-am
|
||||
|
||||
.SUFFIXES:
|
||||
.SUFFIXES: .c .lo .o .obj
|
||||
$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
|
||||
$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
|
||||
@for dep in $?; do \
|
||||
case '$(am__configure_deps)' in \
|
||||
*$$dep*) \
|
||||
@@ -416,9 +420,9 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
||||
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
|
||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||
|
||||
$(top_srcdir)/configure: $(am__configure_deps)
|
||||
$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
|
||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||
$(ACLOCAL_M4): $(am__aclocal_m4_deps)
|
||||
$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
|
||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||
$(am__aclocal_m4_deps):
|
||||
install-binPROGRAMS: $(bin_PROGRAMS)
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
Copyright (c) 2016-2017 Sebastian Pipping <sebastian@pipping.org>
|
||||
Copyright (c) 2017 Rhodri James <rhodri@wildebeest.org.uk>
|
||||
Copyright (c) 2017 Franek Korta <fkorta@gmail.com>
|
||||
Copyright (c) 2022 Sean McBride <sean@rogue-research.com>
|
||||
Licensed under the MIT license:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
@@ -50,14 +51,14 @@
|
||||
#if defined(_MSC_VER)
|
||||
# include <io.h>
|
||||
/* https://msdn.microsoft.com/en-us/library/wyssk1bs(v=vs.100).aspx */
|
||||
# define _EXPAT_read _read
|
||||
# define _EXPAT_read_count_t int
|
||||
# define _EXPAT_read_req_t unsigned int
|
||||
# define EXPAT_read _read
|
||||
# define EXPAT_read_count_t int
|
||||
# define EXPAT_read_req_t unsigned int
|
||||
#else /* POSIX */
|
||||
/* http://pubs.opengroup.org/onlinepubs/009695399/functions/read.html */
|
||||
# define _EXPAT_read read
|
||||
# define _EXPAT_read_count_t ssize_t
|
||||
# define _EXPAT_read_req_t size_t
|
||||
# define EXPAT_read read
|
||||
# define EXPAT_read_count_t ssize_t
|
||||
# define EXPAT_read_req_t size_t
|
||||
#endif
|
||||
|
||||
#ifndef S_ISREG
|
||||
@@ -67,7 +68,7 @@
|
||||
# ifndef S_IFMT
|
||||
# define S_IFMT _S_IFMT
|
||||
# endif
|
||||
# define S_ISREG(m) (((m)&S_IFMT) == S_IFREG)
|
||||
# define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
|
||||
#endif /* not S_ISREG */
|
||||
|
||||
#ifndef O_BINARY
|
||||
@@ -87,7 +88,7 @@ filemap(const tchar *name,
|
||||
void *arg) {
|
||||
size_t nbytes;
|
||||
int fd;
|
||||
_EXPAT_read_count_t n;
|
||||
EXPAT_read_count_t n;
|
||||
struct stat sb;
|
||||
void *p;
|
||||
|
||||
@@ -125,14 +126,14 @@ filemap(const tchar *name,
|
||||
close(fd);
|
||||
return 0;
|
||||
}
|
||||
n = _EXPAT_read(fd, p, (_EXPAT_read_req_t)nbytes);
|
||||
n = EXPAT_read(fd, p, (EXPAT_read_req_t)nbytes);
|
||||
if (n < 0) {
|
||||
tperror(name);
|
||||
free(p);
|
||||
close(fd);
|
||||
return 0;
|
||||
}
|
||||
if (n != (_EXPAT_read_count_t)nbytes) {
|
||||
if (n != (EXPAT_read_count_t)nbytes) {
|
||||
ftprintf(stderr, T("%s: read unexpected number of bytes\n"), name);
|
||||
free(p);
|
||||
close(fd);
|
||||
|
||||
@@ -11,10 +11,10 @@
|
||||
Copyright (c) 2002-2003 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
|
||||
Copyright (c) 2004-2006 Karl Waclawek <karl@waclawek.net>
|
||||
Copyright (c) 2005-2007 Steven Solie <steven@solie.ca>
|
||||
Copyright (c) 2016-2021 Sebastian Pipping <sebastian@pipping.org>
|
||||
Copyright (c) 2016-2023 Sebastian Pipping <sebastian@pipping.org>
|
||||
Copyright (c) 2017 Rhodri James <rhodri@wildebeest.org.uk>
|
||||
Copyright (c) 2019 David Loffredo <loffredo@steptools.com>
|
||||
Copyright (c) 2021 Dong-hee Na <donghee.na@python.org>
|
||||
Copyright (c) 2021 Donghee Na <donghee.na@python.org>
|
||||
Licensed under the MIT license:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
@@ -37,7 +37,7 @@
|
||||
USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <expat_config.h>
|
||||
#include "expat_config.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
@@ -71,11 +71,7 @@
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifdef _DEBUG
|
||||
# define READ_SIZE 16
|
||||
#else
|
||||
# define READ_SIZE (1024 * 8)
|
||||
#endif
|
||||
int g_read_size_bytes = 1024 * 8;
|
||||
|
||||
typedef struct {
|
||||
XML_Parser parser;
|
||||
@@ -195,7 +191,7 @@ processStream(const XML_Char *filename, XML_Parser parser) {
|
||||
}
|
||||
for (;;) {
|
||||
int nread;
|
||||
char *buf = (char *)XML_GetBuffer(parser, READ_SIZE);
|
||||
char *buf = (char *)XML_GetBuffer(parser, g_read_size_bytes);
|
||||
if (! buf) {
|
||||
if (filename != NULL)
|
||||
close(fd);
|
||||
@@ -203,7 +199,7 @@ processStream(const XML_Char *filename, XML_Parser parser) {
|
||||
filename != NULL ? filename : T("xmlwf"));
|
||||
return 0;
|
||||
}
|
||||
nread = read(fd, buf, READ_SIZE);
|
||||
nread = read(fd, buf, g_read_size_bytes);
|
||||
if (nread < 0) {
|
||||
tperror(filename != NULL ? filename : T("STDIN"));
|
||||
if (filename != NULL)
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
Copyright (c) 2000 Clark Cooper <coopercc@users.sourceforge.net>
|
||||
Copyright (c) 2002 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
|
||||
Copyright (c) 2005 Karl Waclawek <karl@waclawek.net>
|
||||
Copyright (c) 2016-2019 Sebastian Pipping <sebastian@pipping.org>
|
||||
Copyright (c) 2016-2023 Sebastian Pipping <sebastian@pipping.org>
|
||||
Licensed under the MIT license:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
@@ -42,5 +42,7 @@
|
||||
# define XML_FMT_INT_MOD "l"
|
||||
#endif
|
||||
|
||||
extern int g_read_size_bytes;
|
||||
|
||||
extern int XML_ProcessFile(XML_Parser parser, const XML_Char *filename,
|
||||
unsigned flags);
|
||||
+107
-49
@@ -11,13 +11,14 @@
|
||||
Copyright (c) 2001-2003 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
|
||||
Copyright (c) 2004-2009 Karl Waclawek <karl@waclawek.net>
|
||||
Copyright (c) 2005-2007 Steven Solie <steven@solie.ca>
|
||||
Copyright (c) 2016-2022 Sebastian Pipping <sebastian@pipping.org>
|
||||
Copyright (c) 2016-2023 Sebastian Pipping <sebastian@pipping.org>
|
||||
Copyright (c) 2017 Rhodri James <rhodri@wildebeest.org.uk>
|
||||
Copyright (c) 2019 David Loffredo <loffredo@steptools.com>
|
||||
Copyright (c) 2020 Joe Orton <jorton@redhat.com>
|
||||
Copyright (c) 2020 Kleber Tarcísio <klebertarcisio@yahoo.com.br>
|
||||
Copyright (c) 2021 Tim Bray <tbray@textuality.com>
|
||||
Copyright (c) 2022 Martin Ettl <ettl.martin78@googlemail.com>
|
||||
Copyright (c) 2022 Sean McBride <sean@rogue-research.com>
|
||||
Licensed under the MIT license:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
@@ -40,7 +41,7 @@
|
||||
USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <expat_config.h>
|
||||
#include "expat_config.h"
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdio.h>
|
||||
@@ -178,7 +179,7 @@ is equivalent to lexicographically comparing based on the character number. */
|
||||
|
||||
static int
|
||||
attcmp(const void *att1, const void *att2) {
|
||||
return tcscmp(*(const XML_Char **)att1, *(const XML_Char **)att2);
|
||||
return tcscmp(*(const XML_Char *const *)att1, *(const XML_Char *const *)att2);
|
||||
}
|
||||
|
||||
static void XMLCALL
|
||||
@@ -215,8 +216,8 @@ endElement(void *userData, const XML_Char *name) {
|
||||
|
||||
static int
|
||||
nsattcmp(const void *p1, const void *p2) {
|
||||
const XML_Char *att1 = *(const XML_Char **)p1;
|
||||
const XML_Char *att2 = *(const XML_Char **)p2;
|
||||
const XML_Char *att1 = *(const XML_Char *const *)p1;
|
||||
const XML_Char *att2 = *(const XML_Char *const *)p2;
|
||||
int sep1 = (tcsrchr(att1, NSSEP) != 0);
|
||||
int sep2 = (tcsrchr(att2, NSSEP) != 0);
|
||||
if (sep1 != sep2)
|
||||
@@ -370,8 +371,8 @@ xcscmp(const XML_Char *xs, const XML_Char *xt) {
|
||||
|
||||
static int
|
||||
notationCmp(const void *a, const void *b) {
|
||||
const NotationList *const n1 = *(NotationList **)a;
|
||||
const NotationList *const n2 = *(NotationList **)b;
|
||||
const NotationList *const n1 = *(const NotationList *const *)a;
|
||||
const NotationList *const n2 = *(const NotationList *const *)b;
|
||||
|
||||
return xcscmp(n1->notationName, n2->notationName);
|
||||
}
|
||||
@@ -871,6 +872,9 @@ showVersion(XML_Char *prog) {
|
||||
}
|
||||
}
|
||||
|
||||
#if defined(__GNUC__)
|
||||
__attribute__((noreturn))
|
||||
#endif
|
||||
static void
|
||||
usage(const XML_Char *prog, int rc) {
|
||||
ftprintf(
|
||||
@@ -883,50 +887,54 @@ usage(const XML_Char *prog, int rc) {
|
||||
/* clang-format off */
|
||||
T("usage:\n")
|
||||
T(" %s [OPTIONS] [FILE ...]\n")
|
||||
T(" %s -h\n")
|
||||
T(" %s -v\n")
|
||||
T(" %s -h|--help\n")
|
||||
T(" %s -v|--version\n")
|
||||
T("\n")
|
||||
T("xmlwf - Determines if an XML document is well-formed\n")
|
||||
T("\n")
|
||||
T("positional arguments:\n")
|
||||
T(" FILE file to process (default: STDIN)\n")
|
||||
T(" FILE file to process (default: STDIN)\n")
|
||||
T("\n")
|
||||
T("input control arguments:\n")
|
||||
T(" -s print an error if the document is not [s]tandalone\n")
|
||||
T(" -n enable [n]amespace processing\n")
|
||||
T(" -p enable processing external DTDs and [p]arameter entities\n")
|
||||
T(" -x enable processing of e[x]ternal entities\n")
|
||||
T(" -e ENCODING override any in-document [e]ncoding declaration\n")
|
||||
T(" -w enable support for [W]indows code pages\n")
|
||||
T(" -r disable memory-mapping and use normal file [r]ead IO calls instead\n")
|
||||
T(" -k when processing multiple files, [k]eep processing after first file with error\n")
|
||||
T(" -s print an error if the document is not [s]tandalone\n")
|
||||
T(" -n enable [n]amespace processing\n")
|
||||
T(" -p enable processing of external DTDs and [p]arameter entities\n")
|
||||
T(" -x enable processing of e[x]ternal entities\n")
|
||||
T(" -e ENCODING override any in-document [e]ncoding declaration\n")
|
||||
T(" -w enable support for [W]indows code pages\n")
|
||||
T(" -r disable memory-mapping and use [r]ead calls instead\n")
|
||||
T(" -g BYTES buffer size to request per call pair to XML_[G]etBuffer and read (default: 8 KiB)\n")
|
||||
T(" -k when processing multiple files, [k]eep processing after first file with error\n")
|
||||
T("\n")
|
||||
T("output control arguments:\n")
|
||||
T(" -d DIRECTORY output [d]estination directory\n")
|
||||
T(" -c write a [c]opy of input XML, not canonical XML\n")
|
||||
T(" -m write [m]eta XML, not canonical XML\n")
|
||||
T(" -t write no XML output for [t]iming of plain parsing\n")
|
||||
T(" -N enable adding doctype and [n]otation declarations\n")
|
||||
T(" -d DIRECTORY output [d]estination directory\n")
|
||||
T(" -c write a [c]opy of input XML, not canonical XML\n")
|
||||
T(" -m write [m]eta XML, not canonical XML\n")
|
||||
T(" -t write no XML output for [t]iming of plain parsing\n")
|
||||
T(" -N enable adding doctype and [n]otation declarations\n")
|
||||
T("\n")
|
||||
T("billion laughs attack protection:\n")
|
||||
T(" NOTE: If you ever need to increase these values for non-attack payload, please file a bug report.\n")
|
||||
T("\n")
|
||||
T(" -a FACTOR set maximum tolerated [a]mplification factor (default: 100.0)\n")
|
||||
T(" -b BYTES set number of output [b]ytes needed to activate (default: 8 MiB)\n")
|
||||
T(" -a FACTOR set maximum tolerated [a]mplification factor (default: 100.0)\n")
|
||||
T(" -b BYTES set number of output [b]ytes needed to activate (default: 8 MiB)\n")
|
||||
T("\n")
|
||||
T("reparse deferral:\n")
|
||||
T(" -q disable reparse deferral, and allow [q]uadratic parse runtime with large tokens\n")
|
||||
T("\n")
|
||||
T("info arguments:\n")
|
||||
T(" -h show this [h]elp message and exit\n")
|
||||
T(" -v show program's [v]ersion number and exit\n")
|
||||
T(" -h, --help show this [h]elp message and exit\n")
|
||||
T(" -v, --version show program's [v]ersion number and exit\n")
|
||||
T("\n")
|
||||
T("exit status:\n")
|
||||
T(" 0 the input files are well-formed and the output (if requested) was written successfully\n")
|
||||
T(" 1 could not allocate data structures, signals a serious problem with execution environment\n")
|
||||
T(" 2 one or more input files were not well-formed\n")
|
||||
T(" 3 could not create an output file\n")
|
||||
T(" 4 command-line argument error\n")
|
||||
T(" 0 the input files are well-formed and the output (if requested) was written successfully\n")
|
||||
T(" 1 could not allocate data structures, signals a serious problem with execution environment\n")
|
||||
T(" 2 one or more input files were not well-formed\n")
|
||||
T(" 3 could not create an output file\n")
|
||||
T(" 4 command-line argument error\n")
|
||||
T("\n")
|
||||
T("xmlwf of libexpat is software libre, licensed under the MIT license.\n")
|
||||
T("Please report bugs at https://github.com/libexpat/libexpat/issues. Thank you!\n")
|
||||
T("Please report bugs at https://github.com/libexpat/libexpat/issues -- thank you!\n")
|
||||
, /* clang-format on */
|
||||
prog, prog, prog);
|
||||
exit(rc);
|
||||
@@ -940,8 +948,10 @@ int wmain(int argc, XML_Char **argv);
|
||||
#define XMLWF_SHIFT_ARG_INTO(constCharStarTarget, argc, argv, i, j) \
|
||||
{ \
|
||||
if (argv[i][j + 1] == T('\0')) { \
|
||||
if (++i == argc) \
|
||||
if (++i == argc) { \
|
||||
usage(argv[0], XMLWF_EXIT_USAGE_ERROR); \
|
||||
/* usage called exit(..), never gets here */ \
|
||||
} \
|
||||
constCharStarTarget = argv[i]; \
|
||||
} else { \
|
||||
constCharStarTarget = argv[i] + j + 1; \
|
||||
@@ -964,9 +974,11 @@ tmain(int argc, XML_Char **argv) {
|
||||
int continueOnError = 0;
|
||||
|
||||
float attackMaximumAmplification = -1.0f; /* signaling "not set" */
|
||||
unsigned long long attackThresholdBytes;
|
||||
unsigned long long attackThresholdBytes = 0;
|
||||
XML_Bool attackThresholdGiven = XML_FALSE;
|
||||
|
||||
XML_Bool disableDeferral = XML_FALSE;
|
||||
|
||||
int exitCode = XMLWF_EXIT_SUCCESS;
|
||||
enum XML_ParamEntityParsing paramEntityParsing
|
||||
= XML_PARAM_ENTITY_PARSING_NEVER;
|
||||
@@ -983,9 +995,17 @@ tmain(int argc, XML_Char **argv) {
|
||||
if (j == 0) {
|
||||
if (argv[i][0] != T('-'))
|
||||
break;
|
||||
if (argv[i][1] == T('-') && argv[i][2] == T('\0')) {
|
||||
i++;
|
||||
break;
|
||||
if (argv[i][1] == T('-')) {
|
||||
if (argv[i][2] == T('\0')) {
|
||||
i++;
|
||||
break;
|
||||
} else if (tcscmp(argv[i] + 2, T("help")) == 0) {
|
||||
usage(argv[0], XMLWF_EXIT_SUCCESS);
|
||||
// usage called exit(..), never gets here
|
||||
} else if (tcscmp(argv[i] + 2, T("version")) == 0) {
|
||||
showVersion(argv[0]);
|
||||
return XMLWF_EXIT_SUCCESS;
|
||||
}
|
||||
}
|
||||
j++;
|
||||
}
|
||||
@@ -1038,10 +1058,30 @@ tmain(int argc, XML_Char **argv) {
|
||||
break;
|
||||
case T('h'):
|
||||
usage(argv[0], XMLWF_EXIT_SUCCESS);
|
||||
return 0;
|
||||
// usage called exit(..), never gets here
|
||||
case T('v'):
|
||||
showVersion(argv[0]);
|
||||
return 0;
|
||||
return XMLWF_EXIT_SUCCESS;
|
||||
case T('g'): {
|
||||
const XML_Char *valueText = NULL;
|
||||
XMLWF_SHIFT_ARG_INTO(valueText, argc, argv, i, j);
|
||||
|
||||
errno = 0;
|
||||
XML_Char *afterValueText = (XML_Char *)valueText;
|
||||
const long long read_size_bytes_candidate
|
||||
= tcstoull(valueText, &afterValueText, 10);
|
||||
if ((errno != 0) || (afterValueText[0] != T('\0'))
|
||||
|| (read_size_bytes_candidate < 1)
|
||||
|| (read_size_bytes_candidate > (INT_MAX / 2 + 1))) {
|
||||
// This prevents tperror(..) from reporting misleading "[..]: Success"
|
||||
errno = ERANGE;
|
||||
tperror(T("invalid buffer size") T(
|
||||
" (needs an integer from 1 to INT_MAX/2+1 i.e. 1,073,741,824 on most platforms)"));
|
||||
exit(XMLWF_EXIT_USAGE_ERROR);
|
||||
}
|
||||
g_read_size_bytes = (int)read_size_bytes_candidate;
|
||||
break;
|
||||
}
|
||||
case T('k'):
|
||||
continueOnError = 1;
|
||||
j++;
|
||||
@@ -1051,7 +1091,7 @@ tmain(int argc, XML_Char **argv) {
|
||||
XMLWF_SHIFT_ARG_INTO(valueText, argc, argv, i, j);
|
||||
|
||||
errno = 0;
|
||||
XML_Char *afterValueText = (XML_Char *)valueText;
|
||||
XML_Char *afterValueText = NULL;
|
||||
attackMaximumAmplification = tcstof(valueText, &afterValueText);
|
||||
if ((errno != 0) || (afterValueText[0] != T('\0'))
|
||||
|| isnan(attackMaximumAmplification)
|
||||
@@ -1062,9 +1102,10 @@ tmain(int argc, XML_Char **argv) {
|
||||
" (needs a floating point number greater or equal than 1.0)"));
|
||||
exit(XMLWF_EXIT_USAGE_ERROR);
|
||||
}
|
||||
#ifndef XML_DTD
|
||||
ftprintf(stderr, T("Warning: Given amplification limit ignored") T(
|
||||
", xmlwf has been compiled without DTD support.\n"));
|
||||
#if XML_GE == 0
|
||||
ftprintf(stderr,
|
||||
T("Warning: Given amplification limit ignored")
|
||||
T(", xmlwf has been compiled without DTD/GE support.\n"));
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
@@ -1083,12 +1124,18 @@ tmain(int argc, XML_Char **argv) {
|
||||
exit(XMLWF_EXIT_USAGE_ERROR);
|
||||
}
|
||||
attackThresholdGiven = XML_TRUE;
|
||||
#ifndef XML_DTD
|
||||
ftprintf(stderr, T("Warning: Given attack threshold ignored") T(
|
||||
", xmlwf has been compiled without DTD support.\n"));
|
||||
#if XML_GE == 0
|
||||
ftprintf(stderr,
|
||||
T("Warning: Given attack threshold ignored")
|
||||
T(", xmlwf has been compiled without DTD/GE support.\n"));
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
case T('q'): {
|
||||
disableDeferral = XML_TRUE;
|
||||
j++;
|
||||
break;
|
||||
}
|
||||
case T('\0'):
|
||||
if (j > 1) {
|
||||
i++;
|
||||
@@ -1098,6 +1145,7 @@ tmain(int argc, XML_Char **argv) {
|
||||
/* fall through */
|
||||
default:
|
||||
usage(argv[0], XMLWF_EXIT_USAGE_ERROR);
|
||||
// usage called exit(..), never gets here
|
||||
}
|
||||
}
|
||||
if (i == argc) {
|
||||
@@ -1120,13 +1168,13 @@ tmain(int argc, XML_Char **argv) {
|
||||
}
|
||||
|
||||
if (attackMaximumAmplification != -1.0f) {
|
||||
#ifdef XML_DTD
|
||||
#if XML_GE == 1
|
||||
XML_SetBillionLaughsAttackProtectionMaximumAmplification(
|
||||
parser, attackMaximumAmplification);
|
||||
#endif
|
||||
}
|
||||
if (attackThresholdGiven) {
|
||||
#ifdef XML_DTD
|
||||
#if XML_GE == 1
|
||||
XML_SetBillionLaughsAttackProtectionActivationThreshold(
|
||||
parser, attackThresholdBytes);
|
||||
#else
|
||||
@@ -1134,6 +1182,16 @@ tmain(int argc, XML_Char **argv) {
|
||||
#endif
|
||||
}
|
||||
|
||||
if (disableDeferral) {
|
||||
const XML_Bool success = XML_SetReparseDeferralEnabled(parser, XML_FALSE);
|
||||
if (! success) {
|
||||
// This prevents tperror(..) from reporting misleading "[..]: Success"
|
||||
errno = EINVAL;
|
||||
tperror(T("Failed to disable reparse deferral"));
|
||||
exit(XMLWF_EXIT_INTERNAL_ERROR);
|
||||
}
|
||||
}
|
||||
|
||||
if (requireStandalone)
|
||||
XML_SetNotStandaloneHandler(parser, notStandalone);
|
||||
XML_SetParamEntityParsing(parser, paramEntityParsing);
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
# \___/_/\_\ .__/ \__,_|\__|
|
||||
# |_| XML parser
|
||||
#
|
||||
# Copyright (c) 2019-2021 Sebastian Pipping <[email protected]>
|
||||
# Copyright (c) 2019-2023 Sebastian Pipping <[email protected]>
|
||||
# Copyright (c) 2021 Tim Bray <[email protected]>
|
||||
# Licensed under the MIT license:
|
||||
#
|
||||
@@ -33,20 +33,20 @@ import argparse
|
||||
|
||||
epilog = """
|
||||
exit status:
|
||||
0 the input files are well-formed and the output (if requested) was written successfully
|
||||
1 could not allocate data structures, signals a serious problem with execution environment
|
||||
2 one or more input files were not well-formed
|
||||
3 could not create an output file
|
||||
4 command-line argument error
|
||||
0 the input files are well-formed and the output (if requested) was written successfully
|
||||
1 could not allocate data structures, signals a serious problem with execution environment
|
||||
2 one or more input files were not well-formed
|
||||
3 could not create an output file
|
||||
4 command-line argument error
|
||||
|
||||
xmlwf of libexpat is software libre, licensed under the MIT license.
|
||||
Please report bugs at https://github.com/libexpat/libexpat/issues. Thank you!
|
||||
Please report bugs at https://github.com/libexpat/libexpat/issues -- thank you!
|
||||
"""
|
||||
|
||||
usage = """
|
||||
%(prog)s [OPTIONS] [FILE ...]
|
||||
%(prog)s -h
|
||||
%(prog)s -v
|
||||
%(prog)s -h|--help
|
||||
%(prog)s -v|--version
|
||||
"""
|
||||
|
||||
parser = argparse.ArgumentParser(prog='xmlwf', add_help=False,
|
||||
@@ -58,11 +58,12 @@ parser = argparse.ArgumentParser(prog='xmlwf', add_help=False,
|
||||
input_related = parser.add_argument_group('input control arguments')
|
||||
input_related.add_argument('-s', action='store_true', help='print an error if the document is not [s]tandalone')
|
||||
input_related.add_argument('-n', action='store_true', help='enable [n]amespace processing')
|
||||
input_related.add_argument('-p', action='store_true', help='enable processing external DTDs and [p]arameter entities')
|
||||
input_related.add_argument('-p', action='store_true', help='enable processing of external DTDs and [p]arameter entities')
|
||||
input_related.add_argument('-x', action='store_true', help='enable processing of e[x]ternal entities')
|
||||
input_related.add_argument('-e', action='store', metavar='ENCODING', help='override any in-document [e]ncoding declaration')
|
||||
input_related.add_argument('-w', action='store_true', help='enable support for [W]indows code pages')
|
||||
input_related.add_argument('-r', action='store_true', help='disable memory-mapping and use normal file [r]ead IO calls instead')
|
||||
input_related.add_argument('-r', action='store_true', help='disable memory-mapping and use [r]ead calls instead')
|
||||
input_related.add_argument('-g', metavar='BYTES', help='buffer size to request per call pair to XML_[G]etBuffer and read (default: 8 KiB)')
|
||||
input_related.add_argument('-k', action='store_true', help='when processing multiple files, [k]eep processing after first file with error')
|
||||
|
||||
output_related = parser.add_argument_group('output control arguments')
|
||||
@@ -81,12 +82,16 @@ billion_laughs.add_argument('-a', metavar='FACTOR',
|
||||
help='set maximum tolerated [a]mplification factor (default: 100.0)')
|
||||
billion_laughs.add_argument('-b', metavar='BYTES', help='set number of output [b]ytes needed to activate (default: 8 MiB)')
|
||||
|
||||
reparse_deferral = parser.add_argument_group('reparse deferral')
|
||||
reparse_deferral.add_argument('-q', metavar='FACTOR',
|
||||
help='disable reparse deferral, and allow [q]uadratic parse runtime with large tokens')
|
||||
|
||||
parser.add_argument('files', metavar='FILE', nargs='*', help='file to process (default: STDIN)')
|
||||
|
||||
info = parser.add_argument_group('info arguments')
|
||||
info = info.add_mutually_exclusive_group()
|
||||
info.add_argument('-h', action='store_true', help='show this [h]elp message and exit')
|
||||
info.add_argument('-v', action='store_true', help='show program\'s [v]ersion number and exit')
|
||||
info.add_argument('-h', '--help', action='store_true', help='show this [h]elp message and exit')
|
||||
info.add_argument('-v', '--version', action='store_true', help='show program\'s [v]ersion number and exit')
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
||||
@@ -95,6 +95,8 @@ ssize_t ldns_fget_token_l(FILE *f, char *token, const char *delim, size_t limit,
|
||||
*/
|
||||
ldns_status ldns_fget_token_l_st(FILE *f, char **token, size_t *limit, bool fixed, const char *delim, int *line_nr);
|
||||
|
||||
ssize_t ldns_fget_token_l_resolv_conf(FILE *f, char *token, const char *delim, size_t limit, int *line_nr);
|
||||
|
||||
/**
|
||||
* returns a token/char from the buffer b.
|
||||
* This function deals with ( and ) in the buffer,
|
||||
|
||||
+31
-4
@@ -27,9 +27,14 @@ ldns_fget_token(FILE *f, char *token, const char *delim, size_t limit)
|
||||
return ldns_fget_token_l(f, token, delim, limit, NULL);
|
||||
}
|
||||
|
||||
ldns_status
|
||||
ldns_fget_token_l_st(FILE *f, char **token, size_t *limit, bool fixed
|
||||
, const char *delim, int *line_nr)
|
||||
enum file_type2parse {
|
||||
zone_file_type, resolv_conf_file_type
|
||||
};
|
||||
|
||||
static ldns_status
|
||||
ldns_fget_token_l_st_file_type(FILE *f, char **token, size_t *limit,
|
||||
bool fixed, const char *delim, int *line_nr,
|
||||
enum file_type2parse file_type)
|
||||
{
|
||||
int c, prev_c;
|
||||
int p; /* 0 -> no parentheses seen, >0 nr of ( seen */
|
||||
@@ -98,7 +103,9 @@ ldns_fget_token_l_st(FILE *f, char **token, size_t *limit, bool fixed
|
||||
}
|
||||
|
||||
/* do something with comments ; */
|
||||
if (c == ';' && quoted == 0) {
|
||||
if ((c == ';'
|
||||
|| (c == '#' && file_type == resolv_conf_file_type))
|
||||
&& quoted == 0) {
|
||||
if (prev_c != '\\') {
|
||||
com = 1;
|
||||
}
|
||||
@@ -215,6 +222,26 @@ tokenread:
|
||||
return i == 0 ? LDNS_STATUS_SYNTAX_EMPTY : LDNS_STATUS_OK;
|
||||
}
|
||||
|
||||
ldns_status
|
||||
ldns_fget_token_l_st(FILE *f, char **token, size_t *limit, bool fixed
|
||||
, const char *delim, int *line_nr)
|
||||
{
|
||||
return ldns_fget_token_l_st_file_type(
|
||||
f, token, limit, fixed, delim, line_nr, zone_file_type);
|
||||
}
|
||||
|
||||
ssize_t
|
||||
ldns_fget_token_l_resolv_conf(FILE *f, char *token, const char *delim,
|
||||
size_t limit, int *line_nr)
|
||||
{
|
||||
if (limit == 0)
|
||||
limit = LDNS_MAX_LINELEN;
|
||||
if (ldns_fget_token_l_st_file_type(f, &token, &limit, true, delim,
|
||||
line_nr, resolv_conf_file_type))
|
||||
return -1;
|
||||
else
|
||||
return (ssize_t)strlen(token);
|
||||
}
|
||||
|
||||
ssize_t
|
||||
ldns_fget_token_l(FILE *f, char *token, const char *delim, size_t limit, int *line_nr)
|
||||
|
||||
+9
-44
@@ -775,7 +775,7 @@ ldns_resolver_new_frm_fp_l(ldns_resolver **res, FILE *fp, int *line_nr)
|
||||
#endif
|
||||
ssize_t gtr, bgtr;
|
||||
ldns_buffer *b;
|
||||
int lnr = 0, oldline;
|
||||
int lnr = 0;
|
||||
FILE* myfp = fp;
|
||||
if(!line_nr) line_nr = &lnr;
|
||||
|
||||
@@ -809,36 +809,18 @@ ldns_resolver_new_frm_fp_l(ldns_resolver **res, FILE *fp, int *line_nr)
|
||||
|
||||
gtr = 1;
|
||||
word[0] = 0;
|
||||
oldline = *line_nr;
|
||||
expect = LDNS_RESOLV_KEYWORD;
|
||||
while (gtr > 0) {
|
||||
/* check comments */
|
||||
if (word[0] == '#') {
|
||||
word[0]='x';
|
||||
if(oldline == *line_nr) {
|
||||
/* skip until end of line */
|
||||
int c;
|
||||
do {
|
||||
c = fgetc(myfp);
|
||||
} while(c != EOF && c != '\n');
|
||||
if(c=='\n') (*line_nr)++;
|
||||
}
|
||||
/* and read next to prepare for further parsing */
|
||||
oldline = *line_nr;
|
||||
continue;
|
||||
}
|
||||
oldline = *line_nr;
|
||||
switch(expect) {
|
||||
case LDNS_RESOLV_KEYWORD:
|
||||
/* keyword */
|
||||
gtr = ldns_fget_token_l(myfp, word, LDNS_PARSE_NORMAL, 0, line_nr);
|
||||
gtr = ldns_fget_token_l_resolv_conf(myfp, word, LDNS_PARSE_NORMAL, 0, line_nr);
|
||||
if (gtr != 0) {
|
||||
if(word[0] == '#') continue;
|
||||
for(i = 0; i < LDNS_RESOLV_KEYWORDS; i++) {
|
||||
if (strcasecmp(keyword[i], word) == 0) {
|
||||
/* chosen the keyword and
|
||||
* expect values carefully
|
||||
*/
|
||||
*/
|
||||
expect = i;
|
||||
break;
|
||||
}
|
||||
@@ -856,16 +838,12 @@ ldns_resolver_new_frm_fp_l(ldns_resolver **res, FILE *fp, int *line_nr)
|
||||
break;
|
||||
case LDNS_RESOLV_DEFDOMAIN:
|
||||
/* default domain dname */
|
||||
gtr = ldns_fget_token_l(myfp, word, LDNS_PARSE_NORMAL, 0, line_nr);
|
||||
gtr = ldns_fget_token_l_resolv_conf(myfp, word, LDNS_PARSE_NORMAL, 0, line_nr);
|
||||
if (gtr == 0) {
|
||||
if(!fp) fclose(myfp);
|
||||
ldns_resolver_deep_free(r);
|
||||
return LDNS_STATUS_SYNTAX_MISSING_VALUE_ERR;
|
||||
}
|
||||
if(word[0] == '#') {
|
||||
expect = LDNS_RESOLV_KEYWORD;
|
||||
continue;
|
||||
}
|
||||
tmp = ldns_rdf_new_frm_str(LDNS_RDF_TYPE_DNAME, word);
|
||||
if (!tmp) {
|
||||
if(!fp) fclose(myfp);
|
||||
@@ -879,16 +857,12 @@ ldns_resolver_new_frm_fp_l(ldns_resolver **res, FILE *fp, int *line_nr)
|
||||
break;
|
||||
case LDNS_RESOLV_NAMESERVER:
|
||||
/* NS aaaa or a record */
|
||||
gtr = ldns_fget_token_l(myfp, word, LDNS_PARSE_NORMAL, 0, line_nr);
|
||||
gtr = ldns_fget_token_l_resolv_conf(myfp, word, LDNS_PARSE_NORMAL, 0, line_nr);
|
||||
if (gtr == 0) {
|
||||
if(!fp) fclose(myfp);
|
||||
ldns_resolver_deep_free(r);
|
||||
return LDNS_STATUS_SYNTAX_MISSING_VALUE_ERR;
|
||||
}
|
||||
if(word[0] == '#') {
|
||||
expect = LDNS_RESOLV_KEYWORD;
|
||||
continue;
|
||||
}
|
||||
if(strchr(word, '%')) {
|
||||
/* snip off interface labels,
|
||||
* fe80::222:19ff:fe31:4222%eth0 */
|
||||
@@ -911,7 +885,7 @@ ldns_resolver_new_frm_fp_l(ldns_resolver **res, FILE *fp, int *line_nr)
|
||||
break;
|
||||
case LDNS_RESOLV_SEARCH:
|
||||
/* search list domain dname */
|
||||
gtr = ldns_fget_token_l(myfp, word, LDNS_PARSE_SKIP_SPACE, 0, line_nr);
|
||||
gtr = ldns_fget_token_l_resolv_conf(myfp, word, LDNS_PARSE_SKIP_SPACE, 0, line_nr);
|
||||
b = LDNS_MALLOC(ldns_buffer);
|
||||
if(!b) {
|
||||
ldns_resolver_deep_free(r);
|
||||
@@ -929,10 +903,6 @@ ldns_resolver_new_frm_fp_l(ldns_resolver **res, FILE *fp, int *line_nr)
|
||||
bgtr = ldns_bget_token(b, word, LDNS_PARSE_NORMAL, (size_t) gtr + 1);
|
||||
while (bgtr > 0) {
|
||||
gtr -= bgtr;
|
||||
if(word[0] == '#') {
|
||||
expect = LDNS_RESOLV_KEYWORD;
|
||||
break;
|
||||
}
|
||||
tmp = ldns_rdf_new_frm_str(LDNS_RDF_TYPE_DNAME, word);
|
||||
if (!tmp) {
|
||||
ldns_resolver_deep_free(r);
|
||||
@@ -954,28 +924,23 @@ ldns_resolver_new_frm_fp_l(ldns_resolver **res, FILE *fp, int *line_nr)
|
||||
}
|
||||
break;
|
||||
case LDNS_RESOLV_SORTLIST:
|
||||
gtr = ldns_fget_token_l(myfp, word, LDNS_PARSE_SKIP_SPACE, 0, line_nr);
|
||||
gtr = ldns_fget_token_l_resolv_conf(myfp, word, LDNS_PARSE_SKIP_SPACE, 0, line_nr);
|
||||
/* sortlist not implemented atm */
|
||||
expect = LDNS_RESOLV_KEYWORD;
|
||||
break;
|
||||
case LDNS_RESOLV_OPTIONS:
|
||||
gtr = ldns_fget_token_l(myfp, word, LDNS_PARSE_SKIP_SPACE, 0, line_nr);
|
||||
gtr = ldns_fget_token_l_resolv_conf(myfp, word, LDNS_PARSE_SKIP_SPACE, 0, line_nr);
|
||||
/* options not implemented atm */
|
||||
expect = LDNS_RESOLV_KEYWORD;
|
||||
break;
|
||||
case LDNS_RESOLV_ANCHOR:
|
||||
/* a file containing a DNSSEC trust anchor */
|
||||
gtr = ldns_fget_token_l(myfp, word, LDNS_PARSE_NORMAL, 0, line_nr);
|
||||
gtr = ldns_fget_token_l_resolv_conf(myfp, word, LDNS_PARSE_NORMAL, 0, line_nr);
|
||||
if (gtr == 0) {
|
||||
ldns_resolver_deep_free(r);
|
||||
if(!fp) fclose(myfp);
|
||||
return LDNS_STATUS_SYNTAX_MISSING_VALUE_ERR;
|
||||
}
|
||||
if(word[0] == '#') {
|
||||
expect = LDNS_RESOLV_KEYWORD;
|
||||
continue;
|
||||
}
|
||||
|
||||
#ifdef HAVE_SSL
|
||||
tmp_rr = ldns_read_anchor_file(word);
|
||||
(void) ldns_resolver_push_dnssec_anchor(r, tmp_rr);
|
||||
|
||||
@@ -2044,9 +2044,13 @@ template <class ELFT> void Writer<ELFT>::finalizeSections() {
|
||||
addPhdrForSection(part, SHT_MIPS_OPTIONS, PT_MIPS_OPTIONS, PF_R);
|
||||
addPhdrForSection(part, SHT_MIPS_ABIFLAGS, PT_MIPS_ABIFLAGS, PF_R);
|
||||
}
|
||||
#if 0
|
||||
// XXX: This stops elftoolchain strip adjusting .riscv.attributes,
|
||||
// leaving large holes in binaries.
|
||||
if (config->emachine == EM_RISCV)
|
||||
addPhdrForSection(part, SHT_RISCV_ATTRIBUTES, PT_RISCV_ATTRIBUTES,
|
||||
PF_R);
|
||||
#endif
|
||||
}
|
||||
Out::programHeaders->size = sizeof(Elf_Phdr) * mainPart->phdrs.size();
|
||||
|
||||
|
||||
@@ -1285,6 +1285,8 @@ void PEI::insertZeroCallUsedRegs(MachineFunction &MF) {
|
||||
continue;
|
||||
|
||||
MCRegister Reg = MO.getReg();
|
||||
if (!Reg)
|
||||
continue;
|
||||
|
||||
// This picks up sibling registers (e.q. %al -> %ah).
|
||||
for (MCRegUnit Unit : TRI.regunits(Reg))
|
||||
@@ -1308,8 +1310,11 @@ void PEI::insertZeroCallUsedRegs(MachineFunction &MF) {
|
||||
if (!MO.isReg())
|
||||
continue;
|
||||
|
||||
for (const MCPhysReg &Reg :
|
||||
TRI.sub_and_superregs_inclusive(MO.getReg()))
|
||||
MCRegister Reg = MO.getReg();
|
||||
if (!Reg)
|
||||
continue;
|
||||
|
||||
for (const MCPhysReg Reg : TRI.sub_and_superregs_inclusive(Reg))
|
||||
RegsToZero.reset(Reg);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*-
|
||||
* SPDX-License-Identifier: GPL-2.0 or Linux-OpenIB
|
||||
*
|
||||
* Copyright (C) 2019 - 2022 Intel Corporation
|
||||
* Copyright (C) 2019 - 2023 Intel Corporation
|
||||
*
|
||||
* This software is available to you under a choice of one of two
|
||||
* licenses. You may choose to be licensed under the terms of the GNU
|
||||
@@ -85,6 +85,7 @@ struct irdma_ucreate_qp {
|
||||
struct ibv_create_qp ibv_cmd;
|
||||
__aligned_u64 user_wqe_bufs;
|
||||
__aligned_u64 user_compl_ctx;
|
||||
__aligned_u64 comp_mask;
|
||||
|
||||
};
|
||||
struct irdma_ucreate_qp_resp {
|
||||
@@ -97,6 +98,9 @@ struct irdma_ucreate_qp_resp {
|
||||
__u8 lsmm;
|
||||
__u8 rsvd;
|
||||
__u32 qp_caps;
|
||||
__aligned_u64 comp_mask;
|
||||
__u8 start_wqe_idx;
|
||||
__u8 rsvd2[7];
|
||||
|
||||
};
|
||||
struct irdma_umodify_qp_resp {
|
||||
@@ -137,6 +141,8 @@ struct irdma_get_context_resp {
|
||||
__u8 hw_rev;
|
||||
__u8 rsvd2;
|
||||
__aligned_u64 comp_mask;
|
||||
__u16 min_hw_wq_size;
|
||||
__u8 rsvd3[6];
|
||||
|
||||
};
|
||||
struct irdma_ureg_mr {
|
||||
|
||||
@@ -54,6 +54,11 @@ enum irdma_memreg_type {
|
||||
|
||||
enum {
|
||||
IRDMA_ALLOC_UCTX_USE_RAW_ATTR = 1 << 0,
|
||||
IRDMA_ALLOC_UCTX_MIN_HW_WQ_SIZE = 1 << 1,
|
||||
};
|
||||
|
||||
enum {
|
||||
IRDMA_CREATE_QP_USE_START_WQE_IDX = 1 << 0,
|
||||
};
|
||||
|
||||
struct irdma_alloc_ucontext_req {
|
||||
@@ -82,6 +87,8 @@ struct irdma_alloc_ucontext_resp {
|
||||
__u8 hw_rev;
|
||||
__u8 rsvd2;
|
||||
__aligned_u64 comp_mask;
|
||||
__u16 min_hw_wq_size;
|
||||
__u8 rsvd3[6];
|
||||
};
|
||||
|
||||
struct irdma_alloc_pd_resp {
|
||||
@@ -101,6 +108,7 @@ struct irdma_create_cq_req {
|
||||
struct irdma_create_qp_req {
|
||||
__aligned_u64 user_wqe_bufs;
|
||||
__aligned_u64 user_compl_ctx;
|
||||
__aligned_u64 comp_mask;
|
||||
};
|
||||
|
||||
struct irdma_mem_reg_req {
|
||||
@@ -130,6 +138,9 @@ struct irdma_create_qp_resp {
|
||||
__u8 lsmm;
|
||||
__u8 rsvd;
|
||||
__u32 qp_caps;
|
||||
__aligned_u64 comp_mask;
|
||||
__u8 start_wqe_idx;
|
||||
__u8 rsvd2[7];
|
||||
};
|
||||
|
||||
struct irdma_modify_qp_resp {
|
||||
|
||||
@@ -46,7 +46,6 @@ enum irdma_vers {
|
||||
IRDMA_GEN_RSVD = 0,
|
||||
IRDMA_GEN_1 = 1,
|
||||
IRDMA_GEN_2 = 2,
|
||||
IRDMA_GEN_MAX = 2,
|
||||
};
|
||||
|
||||
struct irdma_uk_attrs {
|
||||
|
||||
@@ -456,19 +456,6 @@ enum irdma_qp_wqe_size {
|
||||
IRDMA_WQE_SIZE_256 = 256,
|
||||
};
|
||||
|
||||
enum irdma_ws_op_type {
|
||||
IRDMA_WS_OP_TYPE_NODE = 0,
|
||||
IRDMA_WS_OP_TYPE_LEAF_NODE_GROUP,
|
||||
};
|
||||
|
||||
enum irdma_ws_rate_limit_flags {
|
||||
IRDMA_WS_RATE_LIMIT_FLAGS_VALID = 0x1,
|
||||
IRDMA_WS_NO_RDMA_RATE_LIMIT = 0x2,
|
||||
IRDMA_WS_LEAF_NODE_IS_PART_GROUP = 0x4,
|
||||
IRDMA_WS_TREE_RATE_LIMITING = 0x8,
|
||||
IRDMA_WS_PACING_CONTROL = 0x10,
|
||||
};
|
||||
|
||||
/**
|
||||
* set_64bit_val - set 64 bit value to hw wqe
|
||||
* @wqe_words: wqe addr to write
|
||||
|
||||
@@ -45,16 +45,16 @@
|
||||
* @valid: The wqe valid
|
||||
*/
|
||||
static void
|
||||
irdma_set_fragment(__le64 * wqe, u32 offset, struct irdma_sge *sge,
|
||||
irdma_set_fragment(__le64 * wqe, u32 offset, struct ibv_sge *sge,
|
||||
u8 valid)
|
||||
{
|
||||
if (sge) {
|
||||
set_64bit_val(wqe, offset,
|
||||
FIELD_PREP(IRDMAQPSQ_FRAG_TO, sge->tag_off));
|
||||
FIELD_PREP(IRDMAQPSQ_FRAG_TO, sge->addr));
|
||||
set_64bit_val(wqe, offset + IRDMA_BYTE_8,
|
||||
FIELD_PREP(IRDMAQPSQ_VALID, valid) |
|
||||
FIELD_PREP(IRDMAQPSQ_FRAG_LEN, sge->len) |
|
||||
FIELD_PREP(IRDMAQPSQ_FRAG_STAG, sge->stag));
|
||||
FIELD_PREP(IRDMAQPSQ_FRAG_LEN, sge->length) |
|
||||
FIELD_PREP(IRDMAQPSQ_FRAG_STAG, sge->lkey));
|
||||
} else {
|
||||
set_64bit_val(wqe, offset, 0);
|
||||
set_64bit_val(wqe, offset + IRDMA_BYTE_8,
|
||||
@@ -71,14 +71,14 @@ irdma_set_fragment(__le64 * wqe, u32 offset, struct irdma_sge *sge,
|
||||
*/
|
||||
static void
|
||||
irdma_set_fragment_gen_1(__le64 * wqe, u32 offset,
|
||||
struct irdma_sge *sge, u8 valid)
|
||||
struct ibv_sge *sge, u8 valid)
|
||||
{
|
||||
if (sge) {
|
||||
set_64bit_val(wqe, offset,
|
||||
FIELD_PREP(IRDMAQPSQ_FRAG_TO, sge->tag_off));
|
||||
FIELD_PREP(IRDMAQPSQ_FRAG_TO, sge->addr));
|
||||
set_64bit_val(wqe, offset + IRDMA_BYTE_8,
|
||||
FIELD_PREP(IRDMAQPSQ_GEN1_FRAG_LEN, sge->len) |
|
||||
FIELD_PREP(IRDMAQPSQ_GEN1_FRAG_STAG, sge->stag));
|
||||
FIELD_PREP(IRDMAQPSQ_GEN1_FRAG_LEN, sge->length) |
|
||||
FIELD_PREP(IRDMAQPSQ_GEN1_FRAG_STAG, sge->lkey));
|
||||
} else {
|
||||
set_64bit_val(wqe, offset, 0);
|
||||
set_64bit_val(wqe, offset + IRDMA_BYTE_8, 0);
|
||||
@@ -209,8 +209,7 @@ irdma_qp_push_wqe(struct irdma_qp_uk *qp, __le64 * wqe, u16 quanta,
|
||||
if (IRDMA_RING_CURRENT_HEAD(qp->initial_ring) !=
|
||||
IRDMA_RING_CURRENT_TAIL(qp->sq_ring) &&
|
||||
!qp->push_mode) {
|
||||
if (post_sq)
|
||||
irdma_uk_qp_post_wr(qp);
|
||||
irdma_uk_qp_post_wr(qp);
|
||||
} else {
|
||||
push = (__le64 *) ((uintptr_t)qp->push_wqe +
|
||||
(wqe_idx & 0x7) * 0x20);
|
||||
@@ -338,7 +337,7 @@ irdma_uk_rdma_write(struct irdma_qp_uk *qp, struct irdma_post_sq_info *info,
|
||||
return EINVAL;
|
||||
|
||||
for (i = 0; i < op_info->num_lo_sges; i++)
|
||||
total_size += op_info->lo_sg_list[i].len;
|
||||
total_size += op_info->lo_sg_list[i].length;
|
||||
|
||||
read_fence |= info->read_fence;
|
||||
|
||||
@@ -357,7 +356,7 @@ irdma_uk_rdma_write(struct irdma_qp_uk *qp, struct irdma_post_sq_info *info,
|
||||
|
||||
qp->sq_wrtrk_array[wqe_idx].signaled = info->signaled;
|
||||
set_64bit_val(wqe, IRDMA_BYTE_16,
|
||||
FIELD_PREP(IRDMAQPSQ_FRAG_TO, op_info->rem_addr.tag_off));
|
||||
FIELD_PREP(IRDMAQPSQ_FRAG_TO, op_info->rem_addr.addr));
|
||||
|
||||
if (info->imm_data_valid) {
|
||||
set_64bit_val(wqe, IRDMA_BYTE_0,
|
||||
@@ -386,7 +385,7 @@ irdma_uk_rdma_write(struct irdma_qp_uk *qp, struct irdma_post_sq_info *info,
|
||||
++addl_frag_cnt;
|
||||
}
|
||||
|
||||
hdr = FIELD_PREP(IRDMAQPSQ_REMSTAG, op_info->rem_addr.stag) |
|
||||
hdr = FIELD_PREP(IRDMAQPSQ_REMSTAG, op_info->rem_addr.lkey) |
|
||||
FIELD_PREP(IRDMAQPSQ_OPCODE, info->op_type) |
|
||||
FIELD_PREP(IRDMAQPSQ_IMMDATAFLAG, info->imm_data_valid) |
|
||||
FIELD_PREP(IRDMAQPSQ_REPORTRTT, info->report_rtt) |
|
||||
@@ -437,7 +436,7 @@ irdma_uk_rdma_read(struct irdma_qp_uk *qp, struct irdma_post_sq_info *info,
|
||||
return EINVAL;
|
||||
|
||||
for (i = 0; i < op_info->num_lo_sges; i++)
|
||||
total_size += op_info->lo_sg_list[i].len;
|
||||
total_size += op_info->lo_sg_list[i].length;
|
||||
|
||||
ret_code = irdma_fragcnt_to_quanta_sq(op_info->num_lo_sges, &quanta);
|
||||
if (ret_code)
|
||||
@@ -475,8 +474,8 @@ irdma_uk_rdma_read(struct irdma_qp_uk *qp, struct irdma_post_sq_info *info,
|
||||
++addl_frag_cnt;
|
||||
}
|
||||
set_64bit_val(wqe, IRDMA_BYTE_16,
|
||||
FIELD_PREP(IRDMAQPSQ_FRAG_TO, op_info->rem_addr.tag_off));
|
||||
hdr = FIELD_PREP(IRDMAQPSQ_REMSTAG, op_info->rem_addr.stag) |
|
||||
FIELD_PREP(IRDMAQPSQ_FRAG_TO, op_info->rem_addr.addr));
|
||||
hdr = FIELD_PREP(IRDMAQPSQ_REMSTAG, op_info->rem_addr.lkey) |
|
||||
FIELD_PREP(IRDMAQPSQ_REPORTRTT, (info->report_rtt ? 1 : 0)) |
|
||||
FIELD_PREP(IRDMAQPSQ_ADDFRAGCNT, addl_frag_cnt) |
|
||||
FIELD_PREP(IRDMAQPSQ_OPCODE,
|
||||
@@ -525,7 +524,7 @@ irdma_uk_send(struct irdma_qp_uk *qp, struct irdma_post_sq_info *info,
|
||||
return EINVAL;
|
||||
|
||||
for (i = 0; i < op_info->num_sges; i++)
|
||||
total_size += op_info->sg_list[i].len;
|
||||
total_size += op_info->sg_list[i].length;
|
||||
|
||||
if (info->imm_data_valid)
|
||||
frag_cnt = op_info->num_sges + 1;
|
||||
@@ -620,15 +619,15 @@ irdma_set_mw_bind_wqe_gen_1(__le64 * wqe,
|
||||
* @polarity: compatibility parameter
|
||||
*/
|
||||
static void
|
||||
irdma_copy_inline_data_gen_1(u8 *wqe, struct irdma_sge *sge_list,
|
||||
irdma_copy_inline_data_gen_1(u8 *wqe, struct ibv_sge *sge_list,
|
||||
u32 num_sges, u8 polarity)
|
||||
{
|
||||
u32 quanta_bytes_remaining = 16;
|
||||
u32 i;
|
||||
|
||||
for (i = 0; i < num_sges; i++) {
|
||||
u8 *cur_sge = (u8 *)(uintptr_t)sge_list[i].tag_off;
|
||||
u32 sge_len = sge_list[i].len;
|
||||
u8 *cur_sge = (u8 *)(uintptr_t)sge_list[i].addr;
|
||||
u32 sge_len = sge_list[i].length;
|
||||
|
||||
while (sge_len) {
|
||||
u32 bytes_copied;
|
||||
@@ -683,7 +682,7 @@ irdma_set_mw_bind_wqe(__le64 * wqe,
|
||||
* @polarity: polarity of wqe valid bit
|
||||
*/
|
||||
static void
|
||||
irdma_copy_inline_data(u8 *wqe, struct irdma_sge *sge_list,
|
||||
irdma_copy_inline_data(u8 *wqe, struct ibv_sge *sge_list,
|
||||
u32 num_sges, u8 polarity)
|
||||
{
|
||||
u8 inline_valid = polarity << IRDMA_INLINE_VALID_S;
|
||||
@@ -694,8 +693,8 @@ irdma_copy_inline_data(u8 *wqe, struct irdma_sge *sge_list,
|
||||
wqe += 8;
|
||||
|
||||
for (i = 0; i < num_sges; i++) {
|
||||
u8 *cur_sge = (u8 *)(uintptr_t)sge_list[i].tag_off;
|
||||
u32 sge_len = sge_list[i].len;
|
||||
u8 *cur_sge = (u8 *)(uintptr_t)sge_list[i].addr;
|
||||
u32 sge_len = sge_list[i].length;
|
||||
|
||||
while (sge_len) {
|
||||
u32 bytes_copied;
|
||||
@@ -775,7 +774,7 @@ irdma_uk_inline_rdma_write(struct irdma_qp_uk *qp,
|
||||
return EINVAL;
|
||||
|
||||
for (i = 0; i < op_info->num_lo_sges; i++)
|
||||
total_size += op_info->lo_sg_list[i].len;
|
||||
total_size += op_info->lo_sg_list[i].length;
|
||||
|
||||
if (unlikely(total_size > qp->max_inline_data))
|
||||
return EINVAL;
|
||||
@@ -788,9 +787,9 @@ irdma_uk_inline_rdma_write(struct irdma_qp_uk *qp,
|
||||
qp->sq_wrtrk_array[wqe_idx].signaled = info->signaled;
|
||||
read_fence |= info->read_fence;
|
||||
set_64bit_val(wqe, IRDMA_BYTE_16,
|
||||
FIELD_PREP(IRDMAQPSQ_FRAG_TO, op_info->rem_addr.tag_off));
|
||||
FIELD_PREP(IRDMAQPSQ_FRAG_TO, op_info->rem_addr.addr));
|
||||
|
||||
hdr = FIELD_PREP(IRDMAQPSQ_REMSTAG, op_info->rem_addr.stag) |
|
||||
hdr = FIELD_PREP(IRDMAQPSQ_REMSTAG, op_info->rem_addr.lkey) |
|
||||
FIELD_PREP(IRDMAQPSQ_OPCODE, info->op_type) |
|
||||
FIELD_PREP(IRDMAQPSQ_INLINEDATALEN, total_size) |
|
||||
FIELD_PREP(IRDMAQPSQ_REPORTRTT, info->report_rtt ? 1 : 0) |
|
||||
@@ -846,7 +845,7 @@ irdma_uk_inline_send(struct irdma_qp_uk *qp,
|
||||
return EINVAL;
|
||||
|
||||
for (i = 0; i < op_info->num_sges; i++)
|
||||
total_size += op_info->sg_list[i].len;
|
||||
total_size += op_info->sg_list[i].length;
|
||||
|
||||
if (unlikely(total_size > qp->max_inline_data))
|
||||
return EINVAL;
|
||||
@@ -911,7 +910,7 @@ irdma_uk_stag_local_invalidate(struct irdma_qp_uk *qp,
|
||||
u64 hdr;
|
||||
u32 wqe_idx;
|
||||
bool local_fence = false;
|
||||
struct irdma_sge sge = {0};
|
||||
struct ibv_sge sge = {0};
|
||||
u16 quanta = IRDMA_QP_WQE_MIN_QUANTA;
|
||||
|
||||
info->push_wqe = qp->push_db ? true : false;
|
||||
@@ -922,7 +921,7 @@ irdma_uk_stag_local_invalidate(struct irdma_qp_uk *qp,
|
||||
if (!wqe)
|
||||
return ENOSPC;
|
||||
|
||||
sge.stag = op_info->target_stag;
|
||||
sge.lkey = op_info->target_stag;
|
||||
qp->wqe_ops.iw_set_fragment(wqe, IRDMA_BYTE_0, &sge, 0);
|
||||
|
||||
set_64bit_val(wqe, IRDMA_BYTE_16, 0);
|
||||
@@ -1436,8 +1435,7 @@ irdma_uk_cq_poll_cmpl(struct irdma_cq_uk *cq,
|
||||
IRDMA_RING_MOVE_TAIL(cq->cq_ring);
|
||||
set_64bit_val(cq->shadow_area, IRDMA_BYTE_0,
|
||||
IRDMA_RING_CURRENT_HEAD(cq->cq_ring));
|
||||
memset(info, 0,
|
||||
sizeof(struct irdma_cq_poll_info));
|
||||
memset(info, 0, sizeof(*info));
|
||||
return irdma_uk_cq_poll_cmpl(cq, info);
|
||||
}
|
||||
}
|
||||
@@ -1510,7 +1508,6 @@ exit:
|
||||
if (pring && IRDMA_RING_MORE_WORK(*pring))
|
||||
move_cq_head = false;
|
||||
}
|
||||
|
||||
if (move_cq_head) {
|
||||
IRDMA_RING_MOVE_HEAD_NOCHECK(cq->cq_ring);
|
||||
if (!IRDMA_RING_CURRENT_HEAD(cq->cq_ring))
|
||||
@@ -1591,10 +1588,12 @@ irdma_get_wqe_shift(struct irdma_uk_attrs *uk_attrs, u32 sge,
|
||||
int
|
||||
irdma_get_sqdepth(struct irdma_uk_attrs *uk_attrs, u32 sq_size, u8 shift, u32 *sqdepth)
|
||||
{
|
||||
u32 min_size = (u32)uk_attrs->min_hw_wq_size << shift;
|
||||
|
||||
*sqdepth = irdma_round_up_wq((sq_size << shift) + IRDMA_SQ_RSVD);
|
||||
|
||||
if (*sqdepth < ((u32)uk_attrs->min_hw_wq_size << shift))
|
||||
*sqdepth = uk_attrs->min_hw_wq_size << shift;
|
||||
if (*sqdepth < min_size)
|
||||
*sqdepth = min_size;
|
||||
else if (*sqdepth > uk_attrs->max_hw_wq_quanta)
|
||||
return EINVAL;
|
||||
|
||||
@@ -1608,10 +1607,12 @@ irdma_get_sqdepth(struct irdma_uk_attrs *uk_attrs, u32 sq_size, u8 shift, u32 *s
|
||||
int
|
||||
irdma_get_rqdepth(struct irdma_uk_attrs *uk_attrs, u32 rq_size, u8 shift, u32 *rqdepth)
|
||||
{
|
||||
u32 min_size = (u32)uk_attrs->min_hw_wq_size << shift;
|
||||
|
||||
*rqdepth = irdma_round_up_wq((rq_size << shift) + IRDMA_RQ_RSVD);
|
||||
|
||||
if (*rqdepth < ((u32)uk_attrs->min_hw_wq_size << shift))
|
||||
*rqdepth = uk_attrs->min_hw_wq_size << shift;
|
||||
if (*rqdepth < min_size)
|
||||
*rqdepth = min_size;
|
||||
else if (*rqdepth > uk_attrs->max_hw_rq_quanta)
|
||||
return EINVAL;
|
||||
|
||||
@@ -1644,41 +1645,16 @@ irdma_setup_connection_wqes(struct irdma_qp_uk *qp,
|
||||
{
|
||||
u16 move_cnt = 1;
|
||||
|
||||
if (qp->uk_attrs->feature_flags & IRDMA_FEATURE_RTS_AE)
|
||||
if (info->start_wqe_idx)
|
||||
move_cnt = info->start_wqe_idx;
|
||||
else if (qp->uk_attrs->feature_flags & IRDMA_FEATURE_RTS_AE)
|
||||
move_cnt = 3;
|
||||
|
||||
qp->conn_wqes = move_cnt;
|
||||
IRDMA_RING_MOVE_HEAD_BY_COUNT_NOCHECK(qp->sq_ring, move_cnt);
|
||||
IRDMA_RING_MOVE_TAIL_BY_COUNT(qp->sq_ring, move_cnt);
|
||||
IRDMA_RING_MOVE_HEAD_BY_COUNT_NOCHECK(qp->initial_ring, move_cnt);
|
||||
}
|
||||
|
||||
/**
|
||||
* irdma_uk_calc_shift_wq - calculate WQE shift for both SQ and RQ
|
||||
* @ukinfo: qp initialization info
|
||||
* @sq_shift: Returns shift of SQ
|
||||
* @rq_shift: Returns shift of RQ
|
||||
*/
|
||||
void
|
||||
irdma_uk_calc_shift_wq(struct irdma_qp_uk_init_info *ukinfo, u8 *sq_shift,
|
||||
u8 *rq_shift)
|
||||
{
|
||||
bool imm_support = ukinfo->uk_attrs->hw_rev >= IRDMA_GEN_2 ? true : false;
|
||||
|
||||
irdma_get_wqe_shift(ukinfo->uk_attrs,
|
||||
imm_support ? ukinfo->max_sq_frag_cnt + 1 :
|
||||
ukinfo->max_sq_frag_cnt,
|
||||
ukinfo->max_inline_data, sq_shift);
|
||||
|
||||
irdma_get_wqe_shift(ukinfo->uk_attrs, ukinfo->max_rq_frag_cnt, 0,
|
||||
rq_shift);
|
||||
|
||||
if (ukinfo->uk_attrs->hw_rev == IRDMA_GEN_1) {
|
||||
if (ukinfo->abi_ver > 4)
|
||||
*rq_shift = IRDMA_MAX_RQ_WQE_SHIFT_GEN1;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* irdma_uk_calc_depth_shift_sq - calculate depth and shift for SQ size.
|
||||
* @ukinfo: qp initialization info
|
||||
@@ -1786,6 +1762,8 @@ irdma_uk_qp_init(struct irdma_qp_uk *qp, struct irdma_qp_uk_init_info *info)
|
||||
qp->wqe_ops = iw_wqe_uk_ops_gen_1;
|
||||
else
|
||||
qp->wqe_ops = iw_wqe_uk_ops;
|
||||
qp->start_wqe_idx = info->start_wqe_idx;
|
||||
|
||||
return ret_code;
|
||||
}
|
||||
|
||||
|
||||
@@ -48,7 +48,7 @@
|
||||
/**
|
||||
* Driver version
|
||||
*/
|
||||
char libirdma_version[] = "1.2.17-k";
|
||||
char libirdma_version[] = "1.2.36-k";
|
||||
|
||||
unsigned int irdma_dbg;
|
||||
|
||||
|
||||
@@ -96,7 +96,6 @@ struct irdma_cq_buf {
|
||||
LIST_ENTRY(irdma_cq_buf) list;
|
||||
struct irdma_cq_uk cq;
|
||||
struct verbs_mr vmr;
|
||||
size_t buf_size;
|
||||
};
|
||||
|
||||
extern pthread_mutex_t sigusr1_wait_mutex;
|
||||
@@ -142,7 +141,6 @@ struct irdma_uqp {
|
||||
struct ibv_recv_wr *pend_rx_wr;
|
||||
struct irdma_qp_uk qp;
|
||||
enum ibv_qp_type qp_type;
|
||||
struct irdma_sge *recv_sges;
|
||||
};
|
||||
|
||||
/* irdma_uverbs.c */
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*-
|
||||
* SPDX-License-Identifier: GPL-2.0 or Linux-OpenIB
|
||||
*
|
||||
* Copyright (c) 2015 - 2022 Intel Corporation
|
||||
* Copyright (c) 2015 - 2023 Intel Corporation
|
||||
*
|
||||
* This software is available to you under a choice of one of two
|
||||
* licenses. You may choose to be licensed under the terms of the GNU
|
||||
@@ -50,7 +50,7 @@
|
||||
#define irdma_access_privileges u32
|
||||
#define irdma_physical_fragment u64
|
||||
#define irdma_address_list u64 *
|
||||
#define irdma_sgl struct irdma_sge *
|
||||
#define irdma_sgl struct ibv_sge *
|
||||
|
||||
#define IRDMA_MAX_MR_SIZE 0x200000000000ULL
|
||||
|
||||
@@ -80,96 +80,6 @@
|
||||
#define IRDMA_OP_TYPE_REC_IMM 0x3f
|
||||
|
||||
#define IRDMA_FLUSH_MAJOR_ERR 1
|
||||
#define IRDMA_SRQFLUSH_RSVD_MAJOR_ERR 0xfffe
|
||||
|
||||
/* Async Events codes */
|
||||
#define IRDMA_AE_AMP_UNALLOCATED_STAG 0x0102
|
||||
#define IRDMA_AE_AMP_INVALID_STAG 0x0103
|
||||
#define IRDMA_AE_AMP_BAD_QP 0x0104
|
||||
#define IRDMA_AE_AMP_BAD_PD 0x0105
|
||||
#define IRDMA_AE_AMP_BAD_STAG_KEY 0x0106
|
||||
#define IRDMA_AE_AMP_BAD_STAG_INDEX 0x0107
|
||||
#define IRDMA_AE_AMP_BOUNDS_VIOLATION 0x0108
|
||||
#define IRDMA_AE_AMP_RIGHTS_VIOLATION 0x0109
|
||||
#define IRDMA_AE_AMP_TO_WRAP 0x010a
|
||||
#define IRDMA_AE_AMP_FASTREG_VALID_STAG 0x010c
|
||||
#define IRDMA_AE_AMP_FASTREG_MW_STAG 0x010d
|
||||
#define IRDMA_AE_AMP_FASTREG_INVALID_RIGHTS 0x010e
|
||||
#define IRDMA_AE_AMP_FASTREG_INVALID_LENGTH 0x0110
|
||||
#define IRDMA_AE_AMP_INVALIDATE_SHARED 0x0111
|
||||
#define IRDMA_AE_AMP_INVALIDATE_NO_REMOTE_ACCESS_RIGHTS 0x0112
|
||||
#define IRDMA_AE_AMP_INVALIDATE_MR_WITH_BOUND_WINDOWS 0x0113
|
||||
#define IRDMA_AE_AMP_MWBIND_VALID_STAG 0x0114
|
||||
#define IRDMA_AE_AMP_MWBIND_OF_MR_STAG 0x0115
|
||||
#define IRDMA_AE_AMP_MWBIND_TO_ZERO_BASED_STAG 0x0116
|
||||
#define IRDMA_AE_AMP_MWBIND_TO_MW_STAG 0x0117
|
||||
#define IRDMA_AE_AMP_MWBIND_INVALID_RIGHTS 0x0118
|
||||
#define IRDMA_AE_AMP_MWBIND_INVALID_BOUNDS 0x0119
|
||||
#define IRDMA_AE_AMP_MWBIND_TO_INVALID_PARENT 0x011a
|
||||
#define IRDMA_AE_AMP_MWBIND_BIND_DISABLED 0x011b
|
||||
#define IRDMA_AE_PRIV_OPERATION_DENIED 0x011c
|
||||
#define IRDMA_AE_AMP_INVALIDATE_TYPE1_MW 0x011d
|
||||
#define IRDMA_AE_AMP_MWBIND_ZERO_BASED_TYPE1_MW 0x011e
|
||||
#define IRDMA_AE_AMP_FASTREG_INVALID_PBL_HPS_CFG 0x011f
|
||||
#define IRDMA_AE_AMP_MWBIND_WRONG_TYPE 0x0120
|
||||
#define IRDMA_AE_AMP_FASTREG_PBLE_MISMATCH 0x0121
|
||||
#define IRDMA_AE_UDA_XMIT_DGRAM_TOO_LONG 0x0132
|
||||
#define IRDMA_AE_UDA_XMIT_BAD_PD 0x0133
|
||||
#define IRDMA_AE_UDA_XMIT_DGRAM_TOO_SHORT 0x0134
|
||||
#define IRDMA_AE_UDA_L4LEN_INVALID 0x0135
|
||||
#define IRDMA_AE_BAD_CLOSE 0x0201
|
||||
#define IRDMA_AE_RDMAP_ROE_BAD_LLP_CLOSE 0x0202
|
||||
#define IRDMA_AE_CQ_OPERATION_ERROR 0x0203
|
||||
#define IRDMA_AE_RDMA_READ_WHILE_ORD_ZERO 0x0205
|
||||
#define IRDMA_AE_STAG_ZERO_INVALID 0x0206
|
||||
#define IRDMA_AE_IB_RREQ_AND_Q1_FULL 0x0207
|
||||
#define IRDMA_AE_IB_INVALID_REQUEST 0x0208
|
||||
#define IRDMA_AE_WQE_UNEXPECTED_OPCODE 0x020a
|
||||
#define IRDMA_AE_WQE_INVALID_PARAMETER 0x020b
|
||||
#define IRDMA_AE_WQE_INVALID_FRAG_DATA 0x020c
|
||||
#define IRDMA_AE_IB_REMOTE_ACCESS_ERROR 0x020d
|
||||
#define IRDMA_AE_IB_REMOTE_OP_ERROR 0x020e
|
||||
#define IRDMA_AE_WQE_LSMM_TOO_LONG 0x0220
|
||||
#define IRDMA_AE_DDP_INVALID_MSN_GAP_IN_MSN 0x0301
|
||||
#define IRDMA_AE_DDP_UBE_DDP_MESSAGE_TOO_LONG_FOR_AVAILABLE_BUFFER 0x0303
|
||||
#define IRDMA_AE_DDP_UBE_INVALID_DDP_VERSION 0x0304
|
||||
#define IRDMA_AE_DDP_UBE_INVALID_MO 0x0305
|
||||
#define IRDMA_AE_DDP_UBE_INVALID_MSN_NO_BUFFER_AVAILABLE 0x0306
|
||||
#define IRDMA_AE_DDP_UBE_INVALID_QN 0x0307
|
||||
#define IRDMA_AE_DDP_NO_L_BIT 0x0308
|
||||
#define IRDMA_AE_RDMAP_ROE_INVALID_RDMAP_VERSION 0x0311
|
||||
#define IRDMA_AE_RDMAP_ROE_UNEXPECTED_OPCODE 0x0312
|
||||
#define IRDMA_AE_ROE_INVALID_RDMA_READ_REQUEST 0x0313
|
||||
#define IRDMA_AE_ROE_INVALID_RDMA_WRITE_OR_READ_RESP 0x0314
|
||||
#define IRDMA_AE_ROCE_RSP_LENGTH_ERROR 0x0316
|
||||
#define IRDMA_AE_ROCE_EMPTY_MCG 0x0380
|
||||
#define IRDMA_AE_ROCE_BAD_MC_IP_ADDR 0x0381
|
||||
#define IRDMA_AE_ROCE_BAD_MC_QPID 0x0382
|
||||
#define IRDMA_AE_MCG_QP_PROTOCOL_MISMATCH 0x0383
|
||||
#define IRDMA_AE_INVALID_ARP_ENTRY 0x0401
|
||||
#define IRDMA_AE_INVALID_TCP_OPTION_RCVD 0x0402
|
||||
#define IRDMA_AE_STALE_ARP_ENTRY 0x0403
|
||||
#define IRDMA_AE_INVALID_AH_ENTRY 0x0406
|
||||
#define IRDMA_AE_LLP_CLOSE_COMPLETE 0x0501
|
||||
#define IRDMA_AE_LLP_CONNECTION_RESET 0x0502
|
||||
#define IRDMA_AE_LLP_FIN_RECEIVED 0x0503
|
||||
#define IRDMA_AE_LLP_RECEIVED_MARKER_AND_LENGTH_FIELDS_DONT_MATCH 0x0504
|
||||
#define IRDMA_AE_LLP_RECEIVED_MPA_CRC_ERROR 0x0505
|
||||
#define IRDMA_AE_LLP_SEGMENT_TOO_SMALL 0x0507
|
||||
#define IRDMA_AE_LLP_SYN_RECEIVED 0x0508
|
||||
#define IRDMA_AE_LLP_TERMINATE_RECEIVED 0x0509
|
||||
#define IRDMA_AE_LLP_TOO_MANY_RETRIES 0x050a
|
||||
#define IRDMA_AE_LLP_TOO_MANY_KEEPALIVE_RETRIES 0x050b
|
||||
#define IRDMA_AE_LLP_DOUBT_REACHABILITY 0x050c
|
||||
#define IRDMA_AE_LLP_CONNECTION_ESTABLISHED 0x050e
|
||||
#define IRDMA_AE_RESOURCE_EXHAUSTION 0x0520
|
||||
#define IRDMA_AE_RESET_SENT 0x0601
|
||||
#define IRDMA_AE_TERMINATE_SENT 0x0602
|
||||
#define IRDMA_AE_RESET_NOT_SENT 0x0603
|
||||
#define IRDMA_AE_LCE_QP_CATASTROPHIC 0x0700
|
||||
#define IRDMA_AE_LCE_FUNCTION_CATASTROPHIC 0x0701
|
||||
#define IRDMA_AE_LCE_CQ_CATASTROPHIC 0x0702
|
||||
#define IRDMA_AE_QP_SUSPEND_COMPLETE 0x0900
|
||||
|
||||
enum irdma_device_caps_const {
|
||||
IRDMA_WQE_SIZE = 4,
|
||||
@@ -201,8 +111,7 @@ enum irdma_device_caps_const {
|
||||
IRDMA_MAX_OUTBOUND_MSG_SIZE = 65537,
|
||||
/* 64K +1 */
|
||||
IRDMA_MAX_INBOUND_MSG_SIZE = 65537,
|
||||
IRDMA_MAX_PUSH_PAGE_COUNT = 1024,
|
||||
IRDMA_MAX_PE_ENA_VF_COUNT = 32,
|
||||
IRDMA_MAX_PE_ENA_VF_COUNT = 32,
|
||||
IRDMA_MAX_VF_FPM_ID = 47,
|
||||
IRDMA_MAX_SQ_PAYLOAD_SIZE = 2145386496,
|
||||
IRDMA_MAX_INLINE_DATA_SIZE = 101,
|
||||
@@ -229,12 +138,7 @@ enum irdma_flush_opcode {
|
||||
FLUSH_RETRY_EXC_ERR,
|
||||
FLUSH_MW_BIND_ERR,
|
||||
FLUSH_REM_INV_REQ_ERR,
|
||||
};
|
||||
|
||||
enum irdma_qp_event_type {
|
||||
IRDMA_QP_EVENT_CATASTROPHIC,
|
||||
IRDMA_QP_EVENT_ACCESS_ERR,
|
||||
IRDMA_QP_EVENT_REQ_ERR,
|
||||
FLUSH_RNR_RETRY_EXC_ERR,
|
||||
};
|
||||
|
||||
enum irdma_cmpl_status {
|
||||
@@ -282,12 +186,6 @@ struct irdma_cq_uk;
|
||||
struct irdma_qp_uk_init_info;
|
||||
struct irdma_cq_uk_init_info;
|
||||
|
||||
struct irdma_sge {
|
||||
irdma_tagged_offset tag_off;
|
||||
u32 len;
|
||||
irdma_stag stag;
|
||||
};
|
||||
|
||||
struct irdma_ring {
|
||||
volatile u32 head;
|
||||
volatile u32 tail; /* effective tail */
|
||||
@@ -319,13 +217,13 @@ struct irdma_post_rq_info {
|
||||
struct irdma_rdma_write {
|
||||
irdma_sgl lo_sg_list;
|
||||
u32 num_lo_sges;
|
||||
struct irdma_sge rem_addr;
|
||||
struct ibv_sge rem_addr;
|
||||
};
|
||||
|
||||
struct irdma_rdma_read {
|
||||
irdma_sgl lo_sg_list;
|
||||
u32 num_lo_sges;
|
||||
struct irdma_sge rem_addr;
|
||||
struct ibv_sge rem_addr;
|
||||
};
|
||||
|
||||
struct irdma_bind_window {
|
||||
@@ -399,11 +297,6 @@ struct irdma_cq_poll_info {
|
||||
} stat;
|
||||
};
|
||||
|
||||
struct qp_err_code {
|
||||
enum irdma_flush_opcode flush_code;
|
||||
enum irdma_qp_event_type event_type;
|
||||
};
|
||||
|
||||
int irdma_uk_inline_rdma_write(struct irdma_qp_uk *qp,
|
||||
struct irdma_post_sq_info *info, bool post_sq);
|
||||
int irdma_uk_inline_send(struct irdma_qp_uk *qp,
|
||||
@@ -426,9 +319,9 @@ int irdma_uk_stag_local_invalidate(struct irdma_qp_uk *qp,
|
||||
bool post_sq);
|
||||
|
||||
struct irdma_wqe_uk_ops {
|
||||
void (*iw_copy_inline_data)(u8 *dest, struct irdma_sge *sge_list, u32 num_sges, u8 polarity);
|
||||
void (*iw_copy_inline_data)(u8 *dest, struct ibv_sge *sge_list, u32 num_sges, u8 polarity);
|
||||
u16 (*iw_inline_data_size_to_quanta)(u32 data_size);
|
||||
void (*iw_set_fragment)(__le64 *wqe, u32 offset, struct irdma_sge *sge,
|
||||
void (*iw_set_fragment)(__le64 *wqe, u32 offset, struct ibv_sge *sge,
|
||||
u8 valid);
|
||||
void (*iw_set_mw_bind_wqe)(__le64 *wqe,
|
||||
struct irdma_bind_window *op_info);
|
||||
@@ -444,8 +337,6 @@ int irdma_uk_cq_init(struct irdma_cq_uk *cq,
|
||||
struct irdma_cq_uk_init_info *info);
|
||||
int irdma_uk_qp_init(struct irdma_qp_uk *qp,
|
||||
struct irdma_qp_uk_init_info *info);
|
||||
void irdma_uk_calc_shift_wq(struct irdma_qp_uk_init_info *ukinfo, u8 *sq_shift,
|
||||
u8 *rq_shift);
|
||||
int irdma_uk_calc_depth_shift_sq(struct irdma_qp_uk_init_info *ukinfo,
|
||||
u32 *sq_depth, u8 *sq_shift);
|
||||
int irdma_uk_calc_depth_shift_rq(struct irdma_qp_uk_init_info *ukinfo,
|
||||
@@ -494,6 +385,7 @@ struct irdma_qp_uk {
|
||||
u8 rwqe_polarity;
|
||||
u8 rq_wqe_size;
|
||||
u8 rq_wqe_size_multiplier;
|
||||
u8 start_wqe_idx;
|
||||
bool deferred_flag:1;
|
||||
bool push_mode:1; /* whether the last post wqe was pushed */
|
||||
bool push_dropped:1;
|
||||
@@ -541,6 +433,7 @@ struct irdma_qp_uk_init_info {
|
||||
u32 sq_depth;
|
||||
u32 rq_depth;
|
||||
u8 first_sq_wq;
|
||||
u8 start_wqe_idx;
|
||||
u8 type;
|
||||
u8 sq_shift;
|
||||
u8 rq_shift;
|
||||
@@ -574,75 +467,4 @@ int irdma_get_rqdepth(struct irdma_uk_attrs *uk_attrs, u32 rq_size, u8 shift, u3
|
||||
void irdma_qp_push_wqe(struct irdma_qp_uk *qp, __le64 *wqe, u16 quanta,
|
||||
u32 wqe_idx, bool post_sq);
|
||||
void irdma_clr_wqes(struct irdma_qp_uk *qp, u32 qp_wqe_idx);
|
||||
|
||||
static inline struct qp_err_code irdma_ae_to_qp_err_code(u16 ae_id)
|
||||
{
|
||||
struct qp_err_code qp_err = { 0 };
|
||||
|
||||
switch (ae_id) {
|
||||
case IRDMA_AE_AMP_BOUNDS_VIOLATION:
|
||||
case IRDMA_AE_AMP_INVALID_STAG:
|
||||
case IRDMA_AE_AMP_RIGHTS_VIOLATION:
|
||||
case IRDMA_AE_AMP_UNALLOCATED_STAG:
|
||||
case IRDMA_AE_AMP_BAD_PD:
|
||||
case IRDMA_AE_AMP_BAD_QP:
|
||||
case IRDMA_AE_AMP_BAD_STAG_KEY:
|
||||
case IRDMA_AE_AMP_BAD_STAG_INDEX:
|
||||
case IRDMA_AE_AMP_TO_WRAP:
|
||||
case IRDMA_AE_PRIV_OPERATION_DENIED:
|
||||
qp_err.flush_code = FLUSH_PROT_ERR;
|
||||
qp_err.event_type = IRDMA_QP_EVENT_ACCESS_ERR;
|
||||
break;
|
||||
case IRDMA_AE_UDA_XMIT_BAD_PD:
|
||||
case IRDMA_AE_WQE_UNEXPECTED_OPCODE:
|
||||
qp_err.flush_code = FLUSH_LOC_QP_OP_ERR;
|
||||
qp_err.event_type = IRDMA_QP_EVENT_CATASTROPHIC;
|
||||
break;
|
||||
case IRDMA_AE_UDA_XMIT_DGRAM_TOO_SHORT:
|
||||
case IRDMA_AE_UDA_XMIT_DGRAM_TOO_LONG:
|
||||
case IRDMA_AE_UDA_L4LEN_INVALID:
|
||||
case IRDMA_AE_DDP_UBE_INVALID_MO:
|
||||
case IRDMA_AE_DDP_UBE_DDP_MESSAGE_TOO_LONG_FOR_AVAILABLE_BUFFER:
|
||||
qp_err.flush_code = FLUSH_LOC_LEN_ERR;
|
||||
qp_err.event_type = IRDMA_QP_EVENT_CATASTROPHIC;
|
||||
break;
|
||||
case IRDMA_AE_AMP_INVALIDATE_NO_REMOTE_ACCESS_RIGHTS:
|
||||
case IRDMA_AE_IB_REMOTE_ACCESS_ERROR:
|
||||
qp_err.flush_code = FLUSH_REM_ACCESS_ERR;
|
||||
qp_err.event_type = IRDMA_QP_EVENT_ACCESS_ERR;
|
||||
break;
|
||||
case IRDMA_AE_AMP_MWBIND_INVALID_RIGHTS:
|
||||
case IRDMA_AE_AMP_MWBIND_BIND_DISABLED:
|
||||
case IRDMA_AE_AMP_MWBIND_INVALID_BOUNDS:
|
||||
case IRDMA_AE_AMP_MWBIND_VALID_STAG:
|
||||
qp_err.flush_code = FLUSH_MW_BIND_ERR;
|
||||
qp_err.event_type = IRDMA_QP_EVENT_ACCESS_ERR;
|
||||
break;
|
||||
case IRDMA_AE_LLP_TOO_MANY_RETRIES:
|
||||
qp_err.flush_code = FLUSH_RETRY_EXC_ERR;
|
||||
qp_err.event_type = IRDMA_QP_EVENT_CATASTROPHIC;
|
||||
break;
|
||||
case IRDMA_AE_IB_INVALID_REQUEST:
|
||||
qp_err.flush_code = FLUSH_REM_INV_REQ_ERR;
|
||||
qp_err.event_type = IRDMA_QP_EVENT_REQ_ERR;
|
||||
break;
|
||||
case IRDMA_AE_LLP_SEGMENT_TOO_SMALL:
|
||||
case IRDMA_AE_LLP_RECEIVED_MPA_CRC_ERROR:
|
||||
case IRDMA_AE_ROCE_RSP_LENGTH_ERROR:
|
||||
case IRDMA_AE_IB_REMOTE_OP_ERROR:
|
||||
qp_err.flush_code = FLUSH_REM_OP_ERR;
|
||||
qp_err.event_type = IRDMA_QP_EVENT_CATASTROPHIC;
|
||||
break;
|
||||
case IRDMA_AE_LCE_QP_CATASTROPHIC:
|
||||
qp_err.flush_code = FLUSH_FATAL_ERR;
|
||||
qp_err.event_type = IRDMA_QP_EVENT_CATASTROPHIC;
|
||||
break;
|
||||
default:
|
||||
qp_err.flush_code = FLUSH_GENERAL_ERR;
|
||||
qp_err.event_type = IRDMA_QP_EVENT_CATASTROPHIC;
|
||||
break;
|
||||
}
|
||||
|
||||
return qp_err;
|
||||
}
|
||||
#endif /* IRDMA_USER_H */
|
||||
@@ -152,6 +152,7 @@ irdma_ualloc_pd(struct ibv_context *context)
|
||||
|
||||
err_free:
|
||||
free(iwupd);
|
||||
|
||||
errno = err;
|
||||
return NULL;
|
||||
}
|
||||
@@ -163,7 +164,6 @@ err_free:
|
||||
int
|
||||
irdma_ufree_pd(struct ibv_pd *pd)
|
||||
{
|
||||
struct irdma_uvcontext *iwvctx = container_of(pd->context, struct irdma_uvcontext, ibv_ctx);
|
||||
struct irdma_upd *iwupd;
|
||||
int ret;
|
||||
|
||||
@@ -374,12 +374,12 @@ irdma_free_hw_buf(void *buf, size_t size)
|
||||
* @cqe_64byte_ena: enable 64byte cqe
|
||||
*/
|
||||
static inline int
|
||||
get_cq_size(int ncqe, u8 hw_rev, bool cqe_64byte_ena)
|
||||
get_cq_size(int ncqe, u8 hw_rev)
|
||||
{
|
||||
ncqe++;
|
||||
|
||||
/* Completions with immediate require 1 extra entry */
|
||||
if (!cqe_64byte_ena && hw_rev > IRDMA_GEN_1)
|
||||
if (hw_rev > IRDMA_GEN_1)
|
||||
ncqe *= 2;
|
||||
|
||||
if (ncqe < IRDMA_U_MINCQ_SIZE)
|
||||
@@ -388,11 +388,8 @@ get_cq_size(int ncqe, u8 hw_rev, bool cqe_64byte_ena)
|
||||
return ncqe;
|
||||
}
|
||||
|
||||
static inline size_t get_cq_total_bytes(u32 cq_size, bool cqe_64byte_ena){
|
||||
if (cqe_64byte_ena)
|
||||
return roundup(cq_size * sizeof(struct irdma_extended_cqe), IRDMA_HW_PAGE_SIZE);
|
||||
else
|
||||
return roundup(cq_size * sizeof(struct irdma_cqe), IRDMA_HW_PAGE_SIZE);
|
||||
static inline size_t get_cq_total_bytes(u32 cq_size) {
|
||||
return roundup(cq_size * sizeof(struct irdma_cqe), IRDMA_HW_PAGE_SIZE);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -420,7 +417,6 @@ ucreate_cq(struct ibv_context *context,
|
||||
u32 cq_pages;
|
||||
int ret, ncqe;
|
||||
u8 hw_rev;
|
||||
bool cqe_64byte_ena;
|
||||
|
||||
iwvctx = container_of(context, struct irdma_uvcontext, ibv_ctx);
|
||||
uk_attrs = &iwvctx->uk_attrs;
|
||||
@@ -454,11 +450,10 @@ ucreate_cq(struct ibv_context *context,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
cqe_64byte_ena = uk_attrs->feature_flags & IRDMA_FEATURE_64_BYTE_CQE ? true : false;
|
||||
info.cq_size = get_cq_size(attr_ex->cqe, hw_rev, cqe_64byte_ena);
|
||||
info.cq_size = get_cq_size(attr_ex->cqe, hw_rev);
|
||||
total_size = get_cq_total_bytes(info.cq_size);
|
||||
iwucq->comp_vector = attr_ex->comp_vector;
|
||||
LIST_INIT(&iwucq->resize_list);
|
||||
total_size = get_cq_total_bytes(info.cq_size, cqe_64byte_ena);
|
||||
cq_pages = total_size >> IRDMA_HW_PAGE_SHIFT;
|
||||
|
||||
if (!(uk_attrs->feature_flags & IRDMA_FEATURE_CQ_RESIZE))
|
||||
@@ -528,8 +523,6 @@ ucreate_cq(struct ibv_context *context,
|
||||
info.cq_id = resp.cq_id;
|
||||
/* Do not report the CQE's reserved for immediate and burned by HW */
|
||||
iwucq->verbs_cq.cq.cqe = ncqe;
|
||||
if (cqe_64byte_ena)
|
||||
info.avoid_mem_cflct = true;
|
||||
info.cqe_alloc_db = (u32 *)((u8 *)iwvctx->db + IRDMA_DB_CQ_OFFSET);
|
||||
irdma_uk_cq_init(&iwucq->cq, &info);
|
||||
return &iwucq->verbs_cq.cq_ex;
|
||||
@@ -585,7 +578,7 @@ static void
|
||||
irdma_free_cq_buf(struct irdma_cq_buf *cq_buf)
|
||||
{
|
||||
ibv_cmd_dereg_mr(&cq_buf->vmr.ibv_mr);
|
||||
irdma_free_hw_buf(cq_buf->cq.cq_base, cq_buf->buf_size);
|
||||
irdma_free_hw_buf(cq_buf->cq.cq_base, get_cq_total_bytes(cq_buf->cq.cq_size));
|
||||
free(cq_buf);
|
||||
}
|
||||
|
||||
@@ -1322,6 +1315,8 @@ irdma_vmapped_qp(struct irdma_uqp *iwuqp, struct ibv_pd *pd,
|
||||
|
||||
cmd.user_wqe_bufs = (__u64) ((uintptr_t)info->sq);
|
||||
cmd.user_compl_ctx = (__u64) (uintptr_t)&iwuqp->qp;
|
||||
cmd.comp_mask |= IRDMA_CREATE_QP_USE_START_WQE_IDX;
|
||||
|
||||
ret = ibv_cmd_create_qp(pd, &iwuqp->ibv_qp, attr, &cmd.ibv_cmd,
|
||||
sizeof(cmd), &resp.ibv_resp,
|
||||
sizeof(struct irdma_ucreate_qp_resp));
|
||||
@@ -1331,6 +1326,8 @@ irdma_vmapped_qp(struct irdma_uqp *iwuqp, struct ibv_pd *pd,
|
||||
info->sq_size = resp.actual_sq_size;
|
||||
info->rq_size = resp.actual_rq_size;
|
||||
info->first_sq_wq = legacy_mode ? 1 : resp.lsmm;
|
||||
if (resp.comp_mask & IRDMA_CREATE_QP_USE_START_WQE_IDX)
|
||||
info->start_wqe_idx = resp.start_wqe_idx;
|
||||
info->qp_caps = resp.qp_caps;
|
||||
info->qp_id = resp.qp_id;
|
||||
iwuqp->irdma_drv_opt = resp.irdma_drv_opt;
|
||||
@@ -1379,6 +1376,8 @@ irdma_ucreate_qp(struct ibv_pd *pd,
|
||||
|
||||
if (attr->cap.max_send_sge > uk_attrs->max_hw_wq_frags ||
|
||||
attr->cap.max_recv_sge > uk_attrs->max_hw_wq_frags ||
|
||||
attr->cap.max_send_wr > uk_attrs->max_hw_wq_quanta ||
|
||||
attr->cap.max_recv_wr > uk_attrs->max_hw_rq_quanta ||
|
||||
attr->cap.max_inline_data > uk_attrs->max_hw_inline) {
|
||||
errno = EINVAL;
|
||||
return NULL;
|
||||
@@ -1430,18 +1429,12 @@ irdma_ucreate_qp(struct ibv_pd *pd,
|
||||
attr->cap.max_recv_wr = info.rq_size;
|
||||
}
|
||||
|
||||
iwuqp->recv_sges = calloc(attr->cap.max_recv_sge, sizeof(*iwuqp->recv_sges));
|
||||
if (!iwuqp->recv_sges) {
|
||||
status = errno; /* preserve errno */
|
||||
goto err_destroy_lock;
|
||||
}
|
||||
|
||||
info.wqe_alloc_db = (u32 *)iwvctx->db;
|
||||
info.legacy_mode = iwvctx->legacy_mode;
|
||||
info.sq_wrtrk_array = calloc(info.sq_depth, sizeof(*info.sq_wrtrk_array));
|
||||
if (!info.sq_wrtrk_array) {
|
||||
status = errno; /* preserve errno */
|
||||
goto err_free_rsges;
|
||||
goto err_destroy_lock;
|
||||
}
|
||||
|
||||
info.rq_wrid_array = calloc(info.rq_depth, sizeof(*info.rq_wrid_array));
|
||||
@@ -1475,8 +1468,6 @@ err_free_rq_wrid:
|
||||
free(info.rq_wrid_array);
|
||||
err_free_sq_wrtrk:
|
||||
free(info.sq_wrtrk_array);
|
||||
err_free_rsges:
|
||||
free(iwuqp->recv_sges);
|
||||
err_destroy_lock:
|
||||
pthread_spin_destroy(&iwuqp->lock);
|
||||
err_free_qp:
|
||||
@@ -1635,7 +1626,6 @@ irdma_udestroy_qp(struct ibv_qp *qp)
|
||||
free(iwuqp->qp.rq_wrid_array);
|
||||
|
||||
irdma_free_hw_buf(iwuqp->qp.sq_base, iwuqp->buf_size);
|
||||
free(iwuqp->recv_sges);
|
||||
free(iwuqp);
|
||||
return 0;
|
||||
|
||||
@@ -1645,26 +1635,6 @@ err:
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* irdma_copy_sg_list - copy sg list for qp
|
||||
* @sg_list: copied into sg_list
|
||||
* @sgl: copy from sgl
|
||||
* @num_sges: count of sg entries
|
||||
* @max_sges: count of max supported sg entries
|
||||
*/
|
||||
static void
|
||||
irdma_copy_sg_list(struct irdma_sge *sg_list, struct ibv_sge *sgl,
|
||||
int num_sges)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < num_sges; i++) {
|
||||
sg_list[i].tag_off = sgl[i].addr;
|
||||
sg_list[i].len = sgl[i].length;
|
||||
sg_list[i].stag = sgl[i].lkey;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* calc_type2_mw_stag - calculate type 2 MW stag
|
||||
* @rkey: desired rkey of the MW
|
||||
@@ -1743,7 +1713,7 @@ irdma_upost_send(struct ibv_qp *ib_qp, struct ibv_send_wr *ib_wr,
|
||||
info.stag_to_inv = ib_wr->imm_data;
|
||||
}
|
||||
info.op.send.num_sges = ib_wr->num_sge;
|
||||
info.op.send.sg_list = (struct irdma_sge *)ib_wr->sg_list;
|
||||
info.op.send.sg_list = (struct ibv_sge *)ib_wr->sg_list;
|
||||
if (ib_qp->qp_type == IBV_QPT_UD) {
|
||||
struct irdma_uah *ah = container_of(ib_wr->wr.ud.ah,
|
||||
struct irdma_uah, ibv_ah);
|
||||
@@ -1774,9 +1744,9 @@ irdma_upost_send(struct ibv_qp *ib_qp, struct ibv_send_wr *ib_wr,
|
||||
info.op_type = IRDMA_OP_TYPE_RDMA_WRITE;
|
||||
|
||||
info.op.rdma_write.num_lo_sges = ib_wr->num_sge;
|
||||
info.op.rdma_write.lo_sg_list = (void *)ib_wr->sg_list;
|
||||
info.op.rdma_write.rem_addr.tag_off = ib_wr->wr.rdma.remote_addr;
|
||||
info.op.rdma_write.rem_addr.stag = ib_wr->wr.rdma.rkey;
|
||||
info.op.rdma_write.lo_sg_list = ib_wr->sg_list;
|
||||
info.op.rdma_write.rem_addr.addr = ib_wr->wr.rdma.remote_addr;
|
||||
info.op.rdma_write.rem_addr.lkey = ib_wr->wr.rdma.rkey;
|
||||
if (ib_wr->send_flags & IBV_SEND_INLINE)
|
||||
err = irdma_uk_inline_rdma_write(&iwuqp->qp, &info, false);
|
||||
else
|
||||
@@ -1788,10 +1758,10 @@ irdma_upost_send(struct ibv_qp *ib_qp, struct ibv_send_wr *ib_wr,
|
||||
break;
|
||||
}
|
||||
info.op_type = IRDMA_OP_TYPE_RDMA_READ;
|
||||
info.op.rdma_read.rem_addr.tag_off = ib_wr->wr.rdma.remote_addr;
|
||||
info.op.rdma_read.rem_addr.stag = ib_wr->wr.rdma.rkey;
|
||||
info.op.rdma_read.rem_addr.addr = ib_wr->wr.rdma.remote_addr;
|
||||
info.op.rdma_read.rem_addr.lkey = ib_wr->wr.rdma.rkey;
|
||||
|
||||
info.op.rdma_read.lo_sg_list = (void *)ib_wr->sg_list;
|
||||
info.op.rdma_read.lo_sg_list = ib_wr->sg_list;
|
||||
info.op.rdma_read.num_lo_sges = ib_wr->num_sge;
|
||||
err = irdma_uk_rdma_read(&iwuqp->qp, &info, false, false);
|
||||
break;
|
||||
@@ -1873,14 +1843,11 @@ irdma_upost_recv(struct ibv_qp *ib_qp, struct ibv_recv_wr *ib_wr,
|
||||
struct ibv_recv_wr **bad_wr)
|
||||
{
|
||||
struct irdma_post_rq_info post_recv = {};
|
||||
struct irdma_sge *sg_list;
|
||||
struct irdma_uqp *iwuqp;
|
||||
bool reflush = false;
|
||||
int err = 0;
|
||||
|
||||
iwuqp = container_of(ib_qp, struct irdma_uqp, ibv_qp);
|
||||
sg_list = iwuqp->recv_sges;
|
||||
|
||||
err = pthread_spin_lock(&iwuqp->lock);
|
||||
if (err)
|
||||
return err;
|
||||
@@ -1897,8 +1864,7 @@ irdma_upost_recv(struct ibv_qp *ib_qp, struct ibv_recv_wr *ib_wr,
|
||||
}
|
||||
post_recv.num_sges = ib_wr->num_sge;
|
||||
post_recv.wr_id = ib_wr->wr_id;
|
||||
irdma_copy_sg_list(sg_list, ib_wr->sg_list, ib_wr->num_sge);
|
||||
post_recv.sg_list = sg_list;
|
||||
post_recv.sg_list = ib_wr->sg_list;
|
||||
err = irdma_uk_post_receive(&iwuqp->qp, &post_recv);
|
||||
if (err) {
|
||||
*bad_wr = ib_wr;
|
||||
@@ -2022,7 +1988,6 @@ irdma_uresize_cq(struct ibv_cq *cq, int cqe)
|
||||
u32 cq_pages;
|
||||
int cqe_needed;
|
||||
int ret = 0;
|
||||
bool cqe_64byte_ena;
|
||||
|
||||
iwucq = container_of(cq, struct irdma_ucq, verbs_cq.cq);
|
||||
iwvctx = container_of(cq->context, struct irdma_uvcontext, ibv_ctx);
|
||||
@@ -2034,14 +1999,11 @@ irdma_uresize_cq(struct ibv_cq *cq, int cqe)
|
||||
if (cqe < uk_attrs->min_hw_cq_size || cqe > uk_attrs->max_hw_cq_size - 1)
|
||||
return EINVAL;
|
||||
|
||||
cqe_64byte_ena = uk_attrs->feature_flags & IRDMA_FEATURE_64_BYTE_CQE ? true : false;
|
||||
|
||||
cqe_needed = get_cq_size(cqe, uk_attrs->hw_rev, cqe_64byte_ena);
|
||||
|
||||
cqe_needed = get_cq_size(cqe, uk_attrs->hw_rev);
|
||||
if (cqe_needed == iwucq->cq.cq_size)
|
||||
return 0;
|
||||
|
||||
cq_size = get_cq_total_bytes(cqe_needed, cqe_64byte_ena);
|
||||
cq_size = get_cq_total_bytes(cqe_needed);
|
||||
cq_pages = cq_size >> IRDMA_HW_PAGE_SHIFT;
|
||||
cq_base = irdma_alloc_hw_buf(cq_size);
|
||||
if (!cq_base)
|
||||
@@ -2077,7 +2039,6 @@ irdma_uresize_cq(struct ibv_cq *cq, int cqe)
|
||||
goto err_resize;
|
||||
|
||||
memcpy(&cq_buf->cq, &iwucq->cq, sizeof(cq_buf->cq));
|
||||
cq_buf->buf_size = cq_size;
|
||||
cq_buf->vmr = iwucq->vmr;
|
||||
iwucq->vmr = new_mr;
|
||||
irdma_uk_cq_resize(&iwucq->cq, cq_base, cqe_needed);
|
||||
|
||||
@@ -77,7 +77,6 @@
|
||||
/* constants */
|
||||
#define STATS_TIMER_DELAY 60000
|
||||
|
||||
/* a couple of linux size defines */
|
||||
#define BIT_ULL(a) (1ULL << (a))
|
||||
#define min(a, b) ((a) > (b) ? (b) : (a))
|
||||
#ifndef likely
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
$FreeBSD$
|
||||
|
||||
sendmail 8.17.1
|
||||
sendmail 8.18.1
|
||||
originals can be found at: ftp://ftp.sendmail.org/pub/sendmail/
|
||||
|
||||
For the import of sendmail, the following directories were renamed:
|
||||
@@ -102,4 +102,4 @@ infrastructure in FreeBSD:
|
||||
usr.sbin/mailwrapper/Makefile
|
||||
|
||||
[email protected]
|
||||
31-January-2022
|
||||
07-February-2024
|
||||
@@ -25,7 +25,7 @@ This list is not guaranteed to be complete.
|
||||
For Linux the default is to use fcntl() for file locking. However,
|
||||
this does not work with Berkeley DB 5.x and probably later.
|
||||
Switching to flock(), i.e., compile with -DHASFLOCK fixes this
|
||||
(however, the have been problems with flock() on some Linux
|
||||
(however, there have been problems with flock() on some Linux
|
||||
versions). Alternatively, use CDB or an earlier BDB version.
|
||||
|
||||
* Delivery to programs that generate too much output may cause problems
|
||||
@@ -105,11 +105,6 @@ Kresolve sequence dnsmx canon
|
||||
DSN does not contain the illegal address, but only the valid
|
||||
address(es).
|
||||
|
||||
* \231 considered harmful.
|
||||
|
||||
Header addresses that have the \231 character (and possibly others
|
||||
in the range \201 - \237) behave in odd and usually unexpected ways.
|
||||
|
||||
* AuthRealm for Cyrus SASL may not work as expected. The man page
|
||||
and the actual usage for sasl_server_new() seem to differ.
|
||||
Feedback for the "correct" usage is welcome, a patch to match
|
||||
@@ -178,11 +173,11 @@ Kresolve sequence dnsmx canon
|
||||
|
||||
* Client ignores SIZE parameter.
|
||||
|
||||
When sendmail acts as client and the server specifies a limit
|
||||
for the mail size, sendmail will ignore this and try to send the
|
||||
mail anyway. The server will usually reject the MAIL command
|
||||
which specifies the size of the message and hence this problem
|
||||
is not significant.
|
||||
When sendmail acts as client and the server specifies a limit for
|
||||
the mail size, sendmail will ignore this and try to send the mail
|
||||
anyway (unless _FFR_CLIENT_SIZE is used). The server will usually
|
||||
reject the MAIL command which specifies the size of the message
|
||||
and hence this problem is not significant.
|
||||
|
||||
* Paths to programs being executed and the mode of program files are
|
||||
not checked. Essentially, the RunProgramInUnsafeDirPath and
|
||||
|
||||
+619
-6
@@ -187,6 +187,625 @@ mk6wxhyuojEHuR7it6IU5BP8vaAGrL1jb1c2EeAe+pdJwpAb1Aq6MU6uWqOGup8t
|
||||
=xY3m
|
||||
-----END PGP PUBLIC KEY BLOCK-----
|
||||
|
||||
pub rsa4096/0xC4065A87C71F6844 2024-01-02 [SC]
|
||||
Key fingerprint = 8AB0 63D7 A4C5 939D A9C0 1E38 C406 5A87 C71F 6844
|
||||
uid [ultimate] Sendmail Signing Key/2024 <[email protected]>
|
||||
sub rsa4096/0x8DBCFBC42AF9E161 2024-01-02 [E]
|
||||
Key fingerprint = 2B52 755B 17D4 44EB EC39 5497 8DBC FBC4 2AF9 E161
|
||||
|
||||
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
||||
|
||||
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
|
||||
=2S83
|
||||
-----END PGP PUBLIC KEY BLOCK-----
|
||||
|
||||
pub rsa4096/0xCFF9F96740ED9550 2023-01-12 [SC]
|
||||
Key fingerprint = 8186 4A03 75F2 7810 64FE 8E4D CFF9 F967 40ED 9550
|
||||
uid [ full ] Sendmail Signing Key/2023 <[email protected]>
|
||||
sub rsa4096/0x592DCD45F765BAB2 2023-01-12 [E]
|
||||
|
||||
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
||||
|
||||
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
|
||||
kYi0
|
||||
=c0eH
|
||||
-----END PGP PUBLIC KEY BLOCK-----
|
||||
|
||||
pub 4096R/81D9210A 2022-01-22
|
||||
Key fingerprint = 6327 DDCB 5E7E 80E4 987E A3B7 FD79 DC0C 81D9 210A
|
||||
uid Sendmail Signing Key/2022 <[email protected]>
|
||||
sub 4096R/03142938 2022-01-22
|
||||
|
||||
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
||||
|
||||
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
|
||||
0Kb4rGd12E5b+czXoxg=
|
||||
=LSBA
|
||||
-----END PGP PUBLIC KEY BLOCK-----
|
||||
|
||||
pub 4096R/4BEE1BEE 2021-01-24
|
||||
Key fingerprint = F4CE 2263 2102 53D6 A9F9 79B0 4C66 EA8D 4BEE 1BEE
|
||||
@@ -363,7 +982,6 @@ ra/bqVWSpZTlHZ0xT9seCUSs1urxGw9Z
|
||||
=3HCo
|
||||
-----END PGP PUBLIC KEY BLOCK-----
|
||||
|
||||
|
||||
pub rsa4096/0xD583210EF51471A7 2020-04-08 [SC]
|
||||
Key fingerprint = ADFD B709 FE1E A682 E585 5971 D583 210E F514 71A7
|
||||
uid [ full ] Sendmail Signing Key/2020 <[email protected]>
|
||||
@@ -557,7 +1175,6 @@ gmOJ78JKVfONBpmdVsw/emTMU5I/C/8m9l0nO0P4Q6diao23krgWk73x7dBoBqDn
|
||||
=jgHV
|
||||
-----END PGP PUBLIC KEY BLOCK-----
|
||||
|
||||
|
||||
pub rsa4096/0x09E01FA03C0C504E 2019-01-09 [SC]
|
||||
Key fingerprint = 50A3 0309 8EA2 DD7B CBEE 2ADA 09E0 1FA0 3C0C 504E
|
||||
uid Sendmail Signing Key/2019 <[email protected]>
|
||||
@@ -739,7 +1356,6 @@ HcRQfq7rqZkS3NE+iD9D/lUyXVYfH9A=
|
||||
=jN/3
|
||||
-----END PGP PUBLIC KEY BLOCK-----
|
||||
|
||||
|
||||
pub 4096R/0xF06059FD5DC7CC3F 2018-04-24 [SC]
|
||||
Key fingerprint = A687 3D24 A4D6 D628 4AE4 2A75 F060 59FD 5DC7 CC3F
|
||||
uid Sendmail Signing Key/2018 <[email protected]>
|
||||
@@ -883,7 +1499,6 @@ fvZ+LS/6hJ9C77uOaBqoDPmtpn0WDqc3oDeT81Ans73BZhwhFAjzpHp+XnJQ
|
||||
=K0Kz
|
||||
-----END PGP PUBLIC KEY BLOCK-----
|
||||
|
||||
|
||||
pub 4096R/6BF726AD 2016-12-31
|
||||
Key fingerprint = 3C8A 1E8E 7F44 CADE 114F ED46 4BC9 BDA6 6BF7 26AD
|
||||
uid Sendmail Signing Key/2017 <[email protected]>
|
||||
@@ -1069,7 +1684,6 @@ FtJxkIHVIx/VvvBqS3HEm8QCRvr+o10/Ue7NljolDV13B7fljxgvLFyJ8T91jWsz
|
||||
=Lt+h
|
||||
-----END PGP PUBLIC KEY BLOCK-----
|
||||
|
||||
|
||||
pub 2048R/29FB03DE 2016-01-04
|
||||
fingerprint: 0F5C 96AE C8E6 9E9C 8E54 2E5C 6D4C D194 29FB 03DE
|
||||
uid Sendmail Signing Key/2016 <[email protected]>
|
||||
@@ -1269,7 +1883,6 @@ j68I
|
||||
=MdUt
|
||||
-----END PGP PUBLIC KEY BLOCK-----
|
||||
|
||||
|
||||
pub 2048R/0xAAF5B5DE05BDCC53 2015-01-02
|
||||
fingerprint: 30BC A747 05FA 4154 5573 1D7B AAF5 B5DE 05BD CC53
|
||||
uid Sendmail Signing Key/2015 <[email protected]>
|
||||
|
||||
+16
-10
@@ -4,11 +4,12 @@
|
||||
This directory has the latest sendmail(TM) software from Proofpoint, Inc.
|
||||
|
||||
Report any bugs to [email protected]
|
||||
where YYYY is the current year, e.g., 2005.
|
||||
where YYYY is the current year, e.g., 2023.
|
||||
|
||||
There is a web site at http://www.sendmail.org/ -- see that site for
|
||||
There is a web site at https://www.sendmail.org/ -- see that site for
|
||||
the latest updates.
|
||||
|
||||
|
||||
+--------------+
|
||||
| INTRODUCTION |
|
||||
+--------------+
|
||||
@@ -40,6 +41,7 @@ the latest updates.
|
||||
Sendmail is a trademark of Proofpoint, Inc.
|
||||
US Patent Numbers 6865671, 6986037.
|
||||
|
||||
|
||||
+-----------------------+
|
||||
| DIRECTORY PERMISSIONS |
|
||||
+-----------------------+
|
||||
@@ -197,14 +199,6 @@ There are other files you should read. Rooted in this directory are:
|
||||
|
||||
This sets a word in a smaller pointsize.
|
||||
|
||||
- with new groff versions (1.18 seems affected)
|
||||
|
||||
GROFF_NO_SGR=1
|
||||
|
||||
needs to be set, e.g., in doc/op/Makefile:
|
||||
|
||||
ROFF_CMD= GROFF_NO_SGR=1 groff
|
||||
|
||||
|
||||
+--------------+
|
||||
| RELATED RFCS |
|
||||
@@ -248,6 +242,13 @@ Important RFCs for electronic mail are:
|
||||
RFC2822 Internet Message Format
|
||||
RFC2852 Deliver By SMTP Service Extension
|
||||
RFC2920 SMTP Service Extension for Command Pipelining
|
||||
RFC5321 Simple Mail Transfer Protocol
|
||||
RFC5322 Internet Message Format
|
||||
RFC6530 Overview and Framework for Internationalized Email
|
||||
RFC6531 SMTP Extension for Internationalized Email
|
||||
RFC6532 Internationalized Email Headers
|
||||
RFC6533 Internationalized Delivery Status and Disposition Notifications
|
||||
RFC8461 SMTP MTA Strict Transport Security (MTA-STS)
|
||||
|
||||
Other standards that may be of interest (but which are less directly
|
||||
relevant to sendmail) are:
|
||||
@@ -325,6 +326,10 @@ DB 2.X and 3.X. If you are upgrading from one of those versions, you must
|
||||
recreate your database file(s). Do this by rebuilding all maps with
|
||||
makemap and rebuilding the alias file with newaliases.
|
||||
|
||||
File locking using fcntl() does not interoperate with Berkeley DB
|
||||
5.x (and probably later). Use CDB, flock() (-DHASFLOCK), or an
|
||||
earlier Berkeley DB version.
|
||||
|
||||
|
||||
+--------------------+
|
||||
| HOST NAME SERVICES |
|
||||
@@ -391,6 +396,7 @@ CommuniGate Pro
|
||||
in .mc file if you have compiled sendmail with Cyrus SASL
|
||||
and you communicate with CommuniGate Pro servers.
|
||||
|
||||
|
||||
+---------------------+
|
||||
| DIRECTORY STRUCTURE |
|
||||
+---------------------+
|
||||
|
||||
+195
-20
@@ -5,6 +5,187 @@ This listing shows the version of the sendmail binary, the version
|
||||
of the sendmail configuration files, the date of release, and a
|
||||
summary of the changes in that release.
|
||||
|
||||
|
||||
8.18.1/8.18.1 2024/01/31
|
||||
sendmail is now stricter in following the RFCs and rejects
|
||||
some invalid input with respect to line endings
|
||||
and pipelining:
|
||||
- Prevent transaction stuffing by ensuring SMTP clients
|
||||
wait for the HELO/EHLO and DATA response before sending
|
||||
further SMTP commands. This can be disabled using
|
||||
the new srv_features option 'F'. Issue reported by
|
||||
Yepeng Pan and Christian Rossow from CISPA Helmholtz
|
||||
Center for Information Security.
|
||||
- Accept only CRLF . CRLF as end of an SMTP message
|
||||
as required by the RFCs, which can disabled by the
|
||||
new srv_features option 'O'.
|
||||
- Do not accept a CR or LF except in the combination
|
||||
CRLF (as required by the RFCs). These checks can
|
||||
be disabled by the new srv_features options
|
||||
'U' and 'G', respectively. In this case it is
|
||||
suggested to use 'u2' and 'g2' instead so the server
|
||||
replaces offending bare CR or bare LF with a space.
|
||||
It is recommended to only turn these protections off
|
||||
for trusted networks due to the potential for abuse.
|
||||
Full DANE support is available if OpenSSL versions 1.1.1 or 3.x
|
||||
are used, i.e., TLSA RR 2-x-y and 3-x-y are supported
|
||||
as required by RFC 7672.
|
||||
OpenSSL version 3.0.x is supported. Note: OpenSSL 3 loads by
|
||||
default an openssl.cnf file from a location specified
|
||||
in the library which may cause unwanted behaviour
|
||||
in sendmail. Hence sendmail sets the environment
|
||||
variable OPENSSL_CONF to /etc/mail/sendmail.ossl
|
||||
to override the default. The file name can be
|
||||
changed by defining confOPENSSL_CNF in the mc file;
|
||||
using an empty value prevents setting OPENSSL_CONF.
|
||||
Note: referring to a file which does not exist does
|
||||
not cause an an error.
|
||||
Two new values have been added for {verify}:
|
||||
"DANE_TEMP": DANE verification failed temporarily.
|
||||
"DANE_NOTLS": DANE was required but STARTTLS was not
|
||||
offered by the server.
|
||||
The default rules return a temporary error for these
|
||||
cases, so delivery is not attempted.
|
||||
If the TLS setup code in the client fails and DANE requirements
|
||||
exist then {verify} will be set to "DANE_TEMP" thus
|
||||
preventing delivery by default.
|
||||
DANE related logging has been slightly changed for clarification:
|
||||
"DANE configured in DNS but no STARTTLS available"
|
||||
changed to
|
||||
"DANE configured in DNS but STARTTLS not offered"
|
||||
When the compile time option USE_EAI is enabled, vacation could
|
||||
fail to respond when it should (the code change in
|
||||
8.17.2 was incomplete). Problem reported by Alex
|
||||
Hautequest.
|
||||
If SMTPUTF8 BODY=7BIT are used as parameters for the MAIL command
|
||||
the parsing of UTF8 addresses could fail (USE_EAI).
|
||||
If a reply to a previous RCPT was received while sending
|
||||
another RCPT in pipelining mode then parts of the
|
||||
reply could have been assigned to the wrong RCPT.
|
||||
New DontBlameSendmail option CertOwner to relax requirement
|
||||
for certificate public and private key ownership.
|
||||
Based on suggestion from Marius Strobl of the
|
||||
FreeBSD project.
|
||||
clt_features was not checked for connections via Unix domain
|
||||
sockets.
|
||||
CONFIG: FEATURE(`enhdnsbl') did not handle multiple replies
|
||||
from DNS lookups thus potentially causing random
|
||||
"false negatives".
|
||||
Note: the fix creates an incompatibility:
|
||||
the arguments must not have a trailing dot anymore
|
||||
because the -a. option has been removed (as it only
|
||||
applies to the entire result, not individual values).
|
||||
CONFIG: New FEATURE(`fips3') for basic FIPS support in OpenSSL 3.
|
||||
VACATION: Add support for Return-Path header to set sender
|
||||
to match OpenBSD and NetBSD functionality.
|
||||
VACATION: Honor RFC3834 and avoid an auto-reply if
|
||||
'Auto-Submitted: no' is found in the headers to
|
||||
match OpenBSD and NetBSD functionality.
|
||||
VACATION: Avoid an auto-reply if a 'List-Id:' is found in
|
||||
the headers to match OpenBSD functionality.
|
||||
VACATION: Add support for $SUBJECT in .vacation.msg which
|
||||
is replaced with the first line of the subject of the
|
||||
original message to match OpenBSD and NetBSD
|
||||
functionality.
|
||||
Portability:
|
||||
Add support for Darwin 23.
|
||||
New Files:
|
||||
cf/feature/fips3.m4
|
||||
devtools/OS/Darwin.23.x
|
||||
|
||||
8.17.2/8.17.2 2023/06/03
|
||||
Make sure DANE checks (if enabled) are performed even if
|
||||
CACertPath or CACertFile are not set or unusable.
|
||||
Note: if the code to set up TLS in the client fails, then
|
||||
{verify} will be set to TEMP but DANE requirements
|
||||
will be ignored, i.e., by default mail will be sent
|
||||
without STARTTLS. This can be changed via a
|
||||
LOCAL_TLS_SERVER ruleset.
|
||||
Pass server name to clt_features ruleset instead of client
|
||||
name to account for limitations in macro availability
|
||||
described below in CONFIG section. This may break
|
||||
custom clt_features rulesets which expect to receive
|
||||
the client name as input.
|
||||
Fix a regression introduced in 8.17.1: aliases file which
|
||||
contain continuation lines caused parsing errors.
|
||||
Add an FFR (for future release) compile time option _FFR_LOG_STAGE
|
||||
to log the protocol stage as stage= for some errors during
|
||||
delivery attempts to make troubleshooting simpler. This
|
||||
new logging may be enabled in a future release.
|
||||
When EAI is enabled, milters also got the arguments of MAIL/RCPT
|
||||
commands in argv[0] for xxfi_envfrom()/xxfi_envrcpt()
|
||||
callbacks instead of just the mail address.
|
||||
Problem reported by Dilyan Palauzo.
|
||||
When EAI is enabled, mailq prints UTF-8 addresses as such
|
||||
if SMTPUTF8 was used.
|
||||
When EAI is enabled, the $h macro is now in the correct format.
|
||||
Previously this could cause wrong values for relay=
|
||||
in log entries and the mailer argument vector.
|
||||
When the compile time option USE_EAI is enabled, vacation could
|
||||
fail to respond when it should. Problem reported by
|
||||
Alex Hautequest.
|
||||
When EAI was enabled, header truncation might not have been
|
||||
logged even when it happened. Problem reported by
|
||||
Werner Wiethege.
|
||||
Handle a possible change in an upcoming release of Cyrus-SASL
|
||||
(2.1.28) by changing the definition of an internal flag.
|
||||
Patch from Dilyan Palauzo.
|
||||
Avoid an assertion failure when an smtps connection is made
|
||||
to the server and a milter is unavailable.
|
||||
Problem reported by Dilyan Palauzo.
|
||||
Fixed some spelling errors in documentation and comments,
|
||||
based on a codespell report by Jens Schleusener
|
||||
of fossies.org.
|
||||
The result of try_tls is now logged using status= instead
|
||||
of reject=.
|
||||
If tls_rcpt rejected the delivery of a recipient then a bogus
|
||||
dsn= entry might have been logged under some circumstances.
|
||||
If a server replied with 421 to a RCPT command then a bogus reply=
|
||||
might have been logged.
|
||||
When quoting the value for ${currHeader} avoid causing a syntax
|
||||
error (Unbalanced '"') when truncating a header value
|
||||
which is too long. Problem reported by Werner Wiethege.
|
||||
Reduce the performance impact of a change introduced in
|
||||
8.12.9: the default for MaxMimeHeaderLength was
|
||||
set to 2048/1024. Problem reported by Tabata
|
||||
Shintaro of Internet Initiative Japan Inc.
|
||||
CONFIG: The default clt_features ruleset tried to access
|
||||
${server_name} and ${server_addr} which are not set
|
||||
when the ruleset is invoked. Only the server name
|
||||
is available which is passed as an argument.
|
||||
CONFIG: Properly quote host variable to prevent cf build
|
||||
breakage when a hostname contains 'dnl'. Problem
|
||||
reported by Maxim Shalomikhin of Kaspersky.
|
||||
DEVTOOLS: Add configure.sh support for BSD's mandoc as an
|
||||
alternative man page formatting tool.
|
||||
DOC: Document that USAGE is a possible value for {verify}.
|
||||
LIBMILTER: The macros for the EOH and EOM callbacks are
|
||||
sent in reverse order which means accessing macros
|
||||
in the EOM callback got the macro for the EOH
|
||||
callback. Store those macros in the expected order
|
||||
in libmilter. Note: this does not affect sendmail
|
||||
because the macros for both callbacks are the same
|
||||
because the message is sent to libmilter after it
|
||||
is completely read by sendmail. Fix and problem
|
||||
report from David Buergin.
|
||||
Portability:
|
||||
Make use of IN_LOOPBACK, if defined, to determine if
|
||||
using a loopback address. Patch from Mike Karels of
|
||||
FreeBSD.
|
||||
On Linux use gethostbyname2(3) if glibc 2.19 or newer
|
||||
is used to avoid potential problems with IPv6 lookups.
|
||||
Patch from Werner Wiethege.
|
||||
Add support for Darwin 21 and Darwin 22.
|
||||
Solaris 12 has been renamed to Solaris 11.4, hence
|
||||
adapt a condition for sigwait(2) taking one argument.
|
||||
Patch from John Beck.
|
||||
New Files:
|
||||
devtools/M4/UNIX/sharedlib.m4
|
||||
devtools/OS/Darwin.21.x
|
||||
devtools/OS/Darwin.22.x
|
||||
sendmail/sched.c
|
||||
libsm/notify.h
|
||||
|
||||
8.17.1/8.17.1 2021/08/17
|
||||
Deprecation notice: due to compatibility problems with some
|
||||
third party code, we plan to finally switch from K&R
|
||||
@@ -37,6 +218,9 @@ summary of the changes in that release.
|
||||
in the SMTP client per server. Currently only two
|
||||
flags are available: D/M to disable DANE/MTA-STS,
|
||||
respectively.
|
||||
New compile time option NO_EOH_FIELDS to disable the special
|
||||
meaning of the headers Message: and Text: to denote the
|
||||
end of the message header.
|
||||
Avoid leaking session macros for an envelope between
|
||||
delivery attempts to different servers. This problem
|
||||
could have affected check_compat.
|
||||
@@ -76,10 +260,17 @@ summary of the changes in that release.
|
||||
properly, as the persistent macro applies to all
|
||||
RCPTs and hence implicitly to all destinations (servers).
|
||||
The option TLSFallbacktoClear should be used if needed.
|
||||
CONTRIB: AuthRealm.p0 has been modified for 8.16.1 by Anne Bennett.
|
||||
CONTRIB: Added cidrexpand -O option for suppressing duplicates from
|
||||
a CIDR expansion that overlaps a later entry and -S option
|
||||
for skipping comments exactly like makemap does.
|
||||
MAIL.LOCAL: Enhance some error messages to simplify
|
||||
troubleshooting.
|
||||
Portability:
|
||||
Add support for Darwin 19 & 20.
|
||||
Use proper FreeBSD version define to allow for cross
|
||||
compiling. Fix from Brooks Davis of the FreeBSD
|
||||
project.
|
||||
NOTE: File locking using fcntl() does not interoperate
|
||||
with Berkeley DB 5.x (and probably later). Use
|
||||
CDB, flock() (-DHASFLOCK), or an earlier Berkeley
|
||||
@@ -104,22 +295,6 @@ summary of the changes in that release.
|
||||
libsmutil/t-lockfile-0.sh
|
||||
libsmutil/t-maplock-0.sh
|
||||
|
||||
8.16.2/8.16.2 202X/XX/XX
|
||||
New compile time option NO_EOH_FIELDS to disable the special
|
||||
meaning of the headers Message: and Text: to denote the
|
||||
end of the message header.
|
||||
CONTRIB: AuthRealm.p0 has been modified for 8.16.1 by Anne Bennett.
|
||||
CONTRIB: Added cidrexpand -O option for suppressing duplicates from
|
||||
a CIDR expansion that overlaps a later entry and -S option
|
||||
for skipping comments exactly like makemap does.
|
||||
Portability:
|
||||
Add support for Darwin 19 (Mac OS X 10.15).
|
||||
Use proper FreeBSD version define to allow for cross
|
||||
compiling. Fix from Brooks Davis of the FreeBSD
|
||||
project.
|
||||
New Files:
|
||||
devtools/OS/Darwin.19.x
|
||||
|
||||
8.16.1/8.16.1 2020/07/05
|
||||
SECURITY: If sendmail tried to reuse an SMTP session which had
|
||||
already been closed by the server, then the connection
|
||||
@@ -5392,7 +5567,7 @@ summary of the changes in that release.
|
||||
characters (in LMTP mode), mail.local split the incoming
|
||||
line up into 2046-character output lines (excluding the
|
||||
newline). If an input line was 2047 characters long
|
||||
(excluding CR-LF) and the last character was a '.',
|
||||
(excluding CRLF) and the last character was a '.',
|
||||
mail.local saw it as the end of input, transferred it to the
|
||||
user mailbox and tried to write an `ok' back to sendmail.
|
||||
If the message was much longer, both sendmail and
|
||||
@@ -7675,7 +7850,7 @@ summary of the changes in that release.
|
||||
files that are group writable are considered "unsafe" -- that
|
||||
is, programs and files referenced from such files are not
|
||||
valid recipients.
|
||||
Delete bogosity test for FallBackMX host; this prevented it to be a
|
||||
Delete bogosity test for FallBackMXhost; this prevented it to be a
|
||||
name that was not in DNS or was a domain-literal. Problem
|
||||
noted by Tom May.
|
||||
Change the introduction to error messages to more clearly delineate
|
||||
@@ -8414,7 +8589,7 @@ summary of the changes in that release.
|
||||
should show the pathname rather than hex bytes.
|
||||
Restore ``-ba'' mode -- this reads a file from stdin and parses
|
||||
the header for envelope sender information and uses
|
||||
CR-LF as message terminators. It was thought to be
|
||||
CRLF as message terminators. It was thought to be
|
||||
obsolete (used only for Arpanet NCP protocols), but it
|
||||
turns out that the UK ``Grey Book'' protocols require
|
||||
that functionality.
|
||||
@@ -10742,7 +10917,7 @@ summary of the changes in that release.
|
||||
as well as the effective. The program test/t_setreuid.c
|
||||
will test to see if your implementation of setreuid(2)
|
||||
is appropriately functional.
|
||||
The FallBackMX (option V) handling failed to properly identify
|
||||
The FallBackMXhost (option V) handling failed to properly identify
|
||||
fallback to yourself -- most of the code was there,
|
||||
but it wasn't being enabled. Problem noted by Murray
|
||||
Kucherawy of the University of Waterloo.
|
||||
|
||||
@@ -1301,6 +1301,8 @@ dnsbl Turns on rejection, discarding, or quarantining of hosts
|
||||
definition from `host'. Set the DNSBL_MAP_OPT mc option
|
||||
to add additional options to the map specification used.
|
||||
|
||||
Note: currently only IPv4 addresses are checked.
|
||||
|
||||
Some DNS based rejection lists cause failures if asked
|
||||
for AAAA records. If your sendmail version is compiled
|
||||
with IPv6 support (NETINET6) and you experience this
|
||||
@@ -1326,10 +1328,10 @@ enhdnsbl Enhanced version of dnsbl (see above). Further arguments
|
||||
compared with the supplied argument(s), and only if a match
|
||||
occurs an error is generated. For example,
|
||||
|
||||
FEATURE(`enhdnsbl', `dnsbl.example.com', `', `t', `127.0.0.2.')
|
||||
FEATURE(`enhdnsbl', `dnsbl.example.com', `', `t', `127.0.0.2')
|
||||
|
||||
will reject the e-mail if the lookup returns the value
|
||||
``127.0.0.2.'', or generate a 451 response if the lookup
|
||||
``127.0.0.2'', or generate a 451 response if the lookup
|
||||
temporarily failed. The arguments can contain metasymbols
|
||||
as they are allowed in the LHS of rules. As the example
|
||||
shows, the default values are also used if an empty argument,
|
||||
@@ -1616,6 +1618,12 @@ sts Experimental support for Strict Transport Security
|
||||
for the default value).
|
||||
For more information see doc/op/op.me.
|
||||
|
||||
fips3 Basic support for FIPS in OpenSSL 3 by setting
|
||||
the environment variables OPENSSL_CONF and
|
||||
OPENSSL_MODULES to the first and second argument,
|
||||
respectively. For details, see the file and
|
||||
the OpenSSL documentation.
|
||||
|
||||
+-------+
|
||||
| HACKS |
|
||||
+-------+
|
||||
@@ -1688,6 +1696,7 @@ The macro LOCAL_UUCP can be used to add rules into the generated
|
||||
cf file at the place where MAILER(`uucp') inserts its rules. This
|
||||
should only be used if really necessary.
|
||||
|
||||
|
||||
+--------------------+
|
||||
| USING UUCP MAILERS |
|
||||
+--------------------+
|
||||
@@ -3183,8 +3192,8 @@ VERIFY:bits verification must have succeeded and ${cipher_bits} must
|
||||
ENCR:bits ${cipher_bits} must be greater than or equal bits.
|
||||
|
||||
The RHS can optionally be prefixed by TEMP+ or PERM+ to select a temporary
|
||||
or permanent error. The default is a temporary error code (403 4.7.0)
|
||||
unless the macro TLS_PERM_ERR is set during generation of the .cf file.
|
||||
or permanent error. The default is a temporary error code unless
|
||||
the macro TLS_PERM_ERR is set during generation of the .cf file.
|
||||
|
||||
If a certain level of encryption is required, then it might also be
|
||||
possible that this level is provided by the security layer from a SASL
|
||||
@@ -3256,9 +3265,10 @@ default TLS options are not modified.
|
||||
About 2): the rulesets try_tls, srv_features, and clt_features can
|
||||
be used together with the access map. Entries for the access map
|
||||
must be tagged with Try_TLS, Srv_Features, Clt_Features and refer
|
||||
to the hostname or IP address of the connecting system. A default
|
||||
case can be specified by using just the tag. For example, the
|
||||
following entries in the access map:
|
||||
to the hostname or IP address of the connecting system (the latter
|
||||
is not available for clt_features). A default case can be specified
|
||||
by using just the tag. For example, the following entries in the
|
||||
access map:
|
||||
|
||||
Try_TLS:broken.server NO
|
||||
Srv_Features:my.domain v
|
||||
@@ -3376,6 +3386,7 @@ or FEATURE(`authinfo') must be used which provides a separate map.
|
||||
Notice: It is not checked whether the map is actually
|
||||
group/world-unreadable, this is left to the user.
|
||||
|
||||
|
||||
+--------------------------------+
|
||||
| ADDING NEW MAILERS OR RULESETS |
|
||||
+--------------------------------+
|
||||
@@ -3461,6 +3472,7 @@ groups can be defined using the command:
|
||||
|
||||
For details about queue groups, please see doc/op/op.{me,ps,txt}.
|
||||
|
||||
|
||||
+-------------------------------+
|
||||
| NON-SMTP BASED CONFIGURATIONS |
|
||||
+-------------------------------+
|
||||
@@ -4406,6 +4418,9 @@ confCERT_FINGERPRINT_ALGORITHM CertFingerprintAlgorithm
|
||||
confSSL_ENGINE SSLEngine [undefined] Name of SSLEngine.
|
||||
confSSL_ENGINE_PATH SSLEnginePath [undefined] Path to dynamic library
|
||||
for SSLEngine.
|
||||
confOPENSSL_CNF [/etc/mail/sendmail.ossl] Set the
|
||||
environment variable OPENSSL_CONF.
|
||||
An empty value disables setting it.
|
||||
confNICE_QUEUE_RUN NiceQueueRun [undefined] If set, the priority of
|
||||
queue runners is set the given value
|
||||
(nice(3)).
|
||||
|
||||
@@ -16,8 +16,8 @@
|
||||
#####
|
||||
##### SENDMAIL CONFIGURATION FILE
|
||||
#####
|
||||
##### built by [email protected] on Sun Aug 15 23:05:00 PDT 2021
|
||||
##### in /var/tmp/ca/sm8.head/sendmail/OpenSource/sendmail-8.17.1/cf/cf
|
||||
##### built by [email protected] on Tue Jan 30 22:39:25 PST 2024
|
||||
##### in /export/jenkins/jenkins3/workspace/pps-sendmail/OpenSource/sendmail-8.18.1/cf/cf
|
||||
##### using ../ as configuration include directory
|
||||
#####
|
||||
######################################################################
|
||||
@@ -111,11 +111,13 @@ Kdequote dequote
|
||||
DnMAILER-DAEMON
|
||||
|
||||
|
||||
|
||||
D{MTAHost}[127.0.0.1]
|
||||
|
||||
EOPENSSL_CONF=/etc/mail/sendmail.ossl
|
||||
|
||||
# Configuration version number
|
||||
DZ8.17.1/Submit
|
||||
DZ8.18.1/Submit
|
||||
|
||||
|
||||
###############
|
||||
@@ -1248,6 +1250,7 @@ Stry_tls
|
||||
|
||||
|
||||
|
||||
|
||||
######################################################################
|
||||
### tls_rcpt: is connection with server "good" enough?
|
||||
### (done in client, per recipient)
|
||||
@@ -1256,7 +1259,10 @@ Stry_tls
|
||||
### $1: recipient
|
||||
######################################################################
|
||||
Stls_rcpt
|
||||
|
||||
R$* $: $1 $| $&{verify}
|
||||
R$* $| DANE_NOTLS $#error $@ 4.7.0 $: "454 DANE: missing STARTTLS."
|
||||
R$* $| DANE_TEMP $#error $@ 4.7.0 $: "454 DANE check failed temporarily."
|
||||
R$* $| DANE_FAIL $#error $@ 4.7.0 $: "454 DANE check failed."
|
||||
|
||||
######################################################################
|
||||
### tls_client: is connection with client "good" enough?
|
||||
@@ -1288,7 +1294,6 @@ R$* $@ $>"TLS_connection" $1
|
||||
######################################################################
|
||||
STLS_connection
|
||||
RSOFTWARE $#error $@ 4.7.0 $: "454 TLS handshake failed."
|
||||
RDANE_FAIL $#error $@ 4.7.0 $: "454 DANE check failed."
|
||||
RPROTOCOL $#error $@ 4.7.0 $: "454 STARTTLS failed."
|
||||
RCONFIG $#error $@ 4.7.0 $: "454 STARTTLS temporarily not possible."
|
||||
|
||||
|
||||
@@ -13,5 +13,5 @@ divert(0)dnl
|
||||
VERSIONID(`$Id: check_cert_altnames.m4 1.0 2019-01-01 01:01:01 ca Exp $')
|
||||
divert(-1)
|
||||
define(`_FFR_TLS_ALTNAMES', `1')
|
||||
divert(6)dnl
|
||||
LOCAL_CONFIG
|
||||
O SetCertAltnames=true
|
||||
@@ -17,7 +17,7 @@ VERSIONID(`$Id: enhdnsbl.m4,v 1.13 2013-11-22 20:51:11 ca Exp $')
|
||||
LOCAL_CONFIG
|
||||
define(`_EDNSBL_R_',`')dnl
|
||||
# map for enhanced DNS based blocklist lookups
|
||||
Kednsbl dns -R A -a. -T<TMP> -r`'ifdef(`EDNSBL_TO',`EDNSBL_TO',`5')
|
||||
Kednsbl dns -R A -T<TMP> -z -Z32 -r`'ifdef(`EDNSBL_TO',`EDNSBL_TO',`5')
|
||||
')
|
||||
divert(-1)
|
||||
define(`_EDNSBL_SRV_', `_ARG_')dnl
|
||||
@@ -39,15 +39,15 @@ R<?>OK $: OKSOFAR
|
||||
ifelse(len(X`'_ARG3_),`1',
|
||||
`R<?>$+<TMP> $: TMPOK',
|
||||
`R<?>$+<TMP> $#error $@ 4.4.3 $: _EDNSBL_MSG_TMP_')
|
||||
R<?>_EDNSBL_MATCH_ _EDNSBL_ACTION_ $: _EDNSBL_MSG_
|
||||
R<?>$* patsubst(_EDNSBL_MATCH_, `\.$', `') $* _EDNSBL_ACTION_ $: _EDNSBL_MSG_
|
||||
ifelse(len(X`'_ARG5_),`1',`dnl',
|
||||
`R<?>_ARG5_ _EDNSBL_ACTION_ $: _EDNSBL_MSG_')
|
||||
`R<?>$* patsubst(_ARG5_, `\.$', `') $* _EDNSBL_ACTION_ $: _EDNSBL_MSG_')
|
||||
ifelse(len(X`'_ARG6_),`1',`dnl',
|
||||
`R<?>_ARG6_ _EDNSBL_ACTION_ $: _EDNSBL_MSG_')
|
||||
`R<?>$* patsubst(_ARG6_, `\.$', `') $* _EDNSBL_ACTION_ $: _EDNSBL_MSG_')
|
||||
ifelse(len(X`'_ARG7_),`1',`dnl',
|
||||
`R<?>_ARG7_ _EDNSBL_ACTION_ $: _EDNSBL_MSG_')
|
||||
`R<?>$* patsubst(_ARG7_, `\.$', `') $* _EDNSBL_ACTION_ $: _EDNSBL_MSG_')
|
||||
ifelse(len(X`'_ARG8_),`1',`dnl',
|
||||
`R<?>_ARG8_ _EDNSBL_ACTION_ $: _EDNSBL_MSG_')
|
||||
`R<?>$* patsubst(_ARG8_, `\.$', `') $* _EDNSBL_ACTION_ $: _EDNSBL_MSG_')
|
||||
ifelse(len(X`'_ARG9_),`1',`dnl',
|
||||
`R<?>_ARG9_ _EDNSBL_ACTION_ $: _EDNSBL_MSG_')
|
||||
`R<?>$* patsubst(_ARG9_, `\.$', `') $* _EDNSBL_ACTION_ $: _EDNSBL_MSG_')
|
||||
divert(-1)
|
||||
Loaded 100 of 395 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user