Vendor import of expat 2.4.3.
This commit is contained in:
parent
987ba809b8
commit
f83ac37f1e
2
COPYING
2
COPYING
@ -1,5 +1,5 @@
|
||||
Copyright (c) 1998-2000 Thai Open Source Software Center Ltd and Clark Cooper
|
||||
Copyright (c) 2001-2017 Expat maintainers
|
||||
Copyright (c) 2001-2019 Expat maintainers
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
|
282
Changes
282
Changes
@ -2,7 +2,283 @@ 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.2.9 Wed Septemper 25 2019
|
||||
Release 2.4.3 Sun January 16 2022
|
||||
Security fixes:
|
||||
#531 #534 CVE-2021-45960 -- Fix issues with left shifts by >=29 places
|
||||
resulting in
|
||||
a) realloc acting as free
|
||||
b) realloc allocating too few bytes
|
||||
c) undefined behavior
|
||||
depending on architecture and precise value
|
||||
for XML documents with >=2^27+1 prefixed attributes
|
||||
on a single XML tag a la
|
||||
"<r xmlns:a='[..]' a:a123='[..]' [..] />"
|
||||
where XML_ParserCreateNS is used to create the parser
|
||||
(which needs argument "-n" when running xmlwf).
|
||||
Impact is denial of service, or more.
|
||||
#532 #538 CVE-2021-46143 (ZDI-CAN-16157) -- Fix integer overflow
|
||||
on variable m_groupSize in function doProlog leading
|
||||
to realloc acting as free.
|
||||
Impact is denial of service or more.
|
||||
#539 CVE-2022-22822 to CVE-2022-22827 -- Prevent integer overflows
|
||||
near memory allocation at multiple places. Mitre assigned
|
||||
a dedicated CVE for each involved internal C function:
|
||||
- CVE-2022-22822 for function addBinding
|
||||
- CVE-2022-22823 for function build_model
|
||||
- CVE-2022-22824 for function defineAttribute
|
||||
- CVE-2022-22825 for function lookup
|
||||
- CVE-2022-22826 for function nextScaffoldPart
|
||||
- CVE-2022-22827 for function storeAtts
|
||||
Impact is denial of service or more.
|
||||
|
||||
Other changes:
|
||||
#535 CMake: Make call to file(GENERATE [..]) work for CMake <3.19
|
||||
#541 Autotools|CMake: MinGW: Make run.sh(.in) work for Cygwin
|
||||
and MSYS2 by not going through Wine on these platforms
|
||||
#527 #528 Address compiler warnings
|
||||
#533 #543 Version info bumped from 9:2:8 to 9:3:8;
|
||||
see https://verbump.de/ for what these numbers do
|
||||
|
||||
Infrastructure:
|
||||
#536 CI: Check for realistic minimum CMake version
|
||||
#529 #539 CI: Cover compilation with -m32
|
||||
#529 CI: Store coverage reports as artifacts for download
|
||||
#528 CI: Upgrade Clang from 11 to 13
|
||||
|
||||
Special thanks to:
|
||||
An anonymous whitehat
|
||||
Christopher Degawa
|
||||
J. Peter Mugaas
|
||||
Tyson Smith
|
||||
and
|
||||
GCC Farm Project
|
||||
Trend Micro Zero Day Initiative
|
||||
|
||||
Release 2.4.2 Sun December 19 2021
|
||||
Other changes:
|
||||
#509 #510 Link againgst libm for function "isnan"
|
||||
#513 #514 Include expat_config.h as early as possible
|
||||
#498 Autotools: Include files with release archives:
|
||||
- buildconf.sh
|
||||
- fuzz/*.c
|
||||
#507 #519 Autotools: Sync CMake templates
|
||||
#495 #524 CMake: MinGW: Fix pkg-config section "Libs" for
|
||||
- non-release build types (e.g. -DCMAKE_BUILD_TYPE=Debug)
|
||||
- multi-config CMake generators (e.g. Ninja Multi-Config)
|
||||
#502 #503 docs: Document that function XML_GetBuffer may return NULL
|
||||
when asking for a buffer of 0 (zero) bytes size
|
||||
#522 #523 docs: Fix return value docs for both
|
||||
XML_SetBillionLaughsAttackProtection* functions
|
||||
#525 #526 Version info bumped from 9:1:8 to 9:2:8;
|
||||
see https://verbump.de/ for what these numbers do
|
||||
|
||||
Special thanks to:
|
||||
Dong-hee Na
|
||||
Joergen Ibsen
|
||||
Kai Pastor
|
||||
|
||||
Release 2.4.1 Sun May 23 2021
|
||||
Bug fixes:
|
||||
#488 #490 Autotools: Fix installed header expat_config.h for multilib
|
||||
systems; regression introduced in 2.4.0 by pull request #486
|
||||
|
||||
Other changes:
|
||||
#491 #492 Version info bumped from 9:0:8 to 9:1:8;
|
||||
see https://verbump.de/ for what these numbers do
|
||||
|
||||
Special thanks to:
|
||||
Gentoo's QA check "multilib_check_headers"
|
||||
|
||||
Release 2.4.0 Sun May 23 2021
|
||||
Security fixes:
|
||||
#34 #466 #484 CVE-2013-0340/CWE-776 -- Protect against billion laughs attacks
|
||||
(denial-of-service; flavors targeting CPU time or RAM or both,
|
||||
leveraging general entities or parameter entities or both)
|
||||
by tracking and limiting the input amplification factor
|
||||
(<amplification> := (<direct> + <indirect>) / <direct>).
|
||||
By conservative default, amplification up to a factor of 100.0
|
||||
is tolerated and rejection only starts after 8 MiB of output bytes
|
||||
(=<direct> + <indirect>) have been processed.
|
||||
The fix adds the following to the API:
|
||||
- A new error code XML_ERROR_AMPLIFICATION_LIMIT_BREACH to
|
||||
signals this specific condition.
|
||||
- Two new API functions ..
|
||||
- XML_SetBillionLaughsAttackProtectionMaximumAmplification and
|
||||
- XML_SetBillionLaughsAttackProtectionActivationThreshold
|
||||
.. to further tighten billion laughs protection parameters
|
||||
when desired. Please see file "doc/reference.html" for details.
|
||||
If you ever need to increase the defaults for non-attack XML
|
||||
payload, please file a bug report with libexpat.
|
||||
- Two new XML_FEATURE_* constants ..
|
||||
- that can be queried using the XML_GetFeatureList function, and
|
||||
- that are shown in "xmlwf -v" output.
|
||||
- Two new environment variable switches ..
|
||||
- EXPAT_ACCOUNTING_DEBUG=(0|1|2|3) and
|
||||
- EXPAT_ENTITY_DEBUG=(0|1)
|
||||
.. for runtime debugging of accounting and entity processing.
|
||||
Specific behavior of these values may change in the future.
|
||||
- Two new command line arguments "-a FACTOR" and "-b BYTES"
|
||||
for xmlwf to further tighten billion laughs protection
|
||||
parameters when desired.
|
||||
If you ever need to increase the defaults for non-attack XML
|
||||
payload, please file a bug report with libexpat.
|
||||
|
||||
Bug fixes:
|
||||
#332 #470 For (non-default) compilation with -DEXPAT_MIN_SIZE=ON (CMake)
|
||||
or CPPFLAGS=-DXML_MIN_SIZE (GNU Autotools): Fix segfault
|
||||
for UTF-16 payloads containing CDATA sections.
|
||||
#485 #486 Autotools: Fix generated CMake files for non-64bit and
|
||||
non-Linux platforms (e.g. macOS and MinGW in particular)
|
||||
that were introduced with release 2.3.0
|
||||
|
||||
Other changes:
|
||||
#468 #469 xmlwf: Improve help output and the xmlwf man page
|
||||
#463 xmlwf: Improve maintainability through some refactoring
|
||||
#477 xmlwf: Fix man page DocBook validity
|
||||
#458 #459 CMake: Support absolute paths for both CMAKE_INSTALL_LIBDIR
|
||||
and CMAKE_INSTALL_INCLUDEDIR
|
||||
#471 #481 CMake: Add support for standard variable BUILD_SHARED_LIBS
|
||||
#457 Unexpose symbol _INTERNAL_trim_to_complete_utf8_characters
|
||||
#467 Resolve macro HAVE_EXPAT_CONFIG_H
|
||||
#472 Delete unused legacy helper file "conftools/PrintPath"
|
||||
#473 #483 Improve attribution
|
||||
#464 #465 #477 doc/reference.html: Fix XHTML validity
|
||||
#475 #478 doc/reference.html: Replace the 90s look by OK.css
|
||||
#479 Version info bumped from 8:0:7 to 9:0:8
|
||||
due to addition of new symbols and error codes;
|
||||
see https://verbump.de/ for what these numbers do
|
||||
|
||||
Infrastructure:
|
||||
#456 CI: Enable periodic runs
|
||||
#457 CI: Start covering the list of exported symbols
|
||||
#474 CI: Isolate coverage task
|
||||
#476 #482 CI: Adapt to breaking changes in image "ubuntu-18.04"
|
||||
#477 CI: Cover well-formedness and DocBook/XHTML validity
|
||||
of doc/reference.html and doc/xmlwf.xml
|
||||
|
||||
Special thanks to:
|
||||
Dimitry Andric
|
||||
Eero Helenius
|
||||
Nick Wellnhofer
|
||||
Rhodri James
|
||||
Tomas Korbar
|
||||
Yury Gribov
|
||||
and
|
||||
Clang LeakSan
|
||||
JetBrains
|
||||
OSS-Fuzz
|
||||
|
||||
Release 2.3.0 Thu March 25 2021
|
||||
Bug fixes:
|
||||
#438 When calling XML_ParseBuffer without a prior successful call to
|
||||
XML_GetBuffer as a user, no longer trigger undefined behavior
|
||||
(by adding an integer to a NULL pointer) but rather return
|
||||
XML_STATUS_ERROR and set the error code to (new) code
|
||||
XML_ERROR_NO_BUFFER. Found by UBSan (UndefinedBehaviorSanitizer)
|
||||
of Clang 11 (but not Clang 9).
|
||||
#444 xmlwf: Exit status 2 was used for both:
|
||||
- malformed input files (documented) and
|
||||
- invalid command-line arguments (undocumented).
|
||||
The case of invalid command-line arguments now
|
||||
has its own exit status 4, resolving the ambiguity.
|
||||
|
||||
Other changes:
|
||||
#439 xmlwf: Add argument -k to allow continuing after
|
||||
non-fatal errors
|
||||
#439 xmlwf: Add section about exit status to the -h help output
|
||||
#422 #426 #447 Windows: Drop support for Visual Studio <=14.0/2015
|
||||
#434 Windows: CMake: Detect unsupported Visual Studio at
|
||||
configure time (rather than at compile time)
|
||||
#382 #428 testrunner: Make verbose mode (argument "-v") report
|
||||
about passed tests, and make default mode report about
|
||||
failures, as well.
|
||||
#442 CMake: Call "enable_language(CXX)" prior to tinkering
|
||||
with CMAKE_CXX_* variables
|
||||
#448 Document use of libexpat from a CMake-based project
|
||||
#451 Autotools: Install CMake files as generated by CMake 3.19.6
|
||||
so that users with "find_package(expat [..] CONFIG [..])"
|
||||
are served on distributions that are *not* using the CMake
|
||||
build system inside for libexpat packaging
|
||||
#436 #437 Autotools: Drop obsolescent macro AC_HEADER_STDC
|
||||
#450 #452 Autotools: Resolve use of obsolete macro AC_CONFIG_HEADER
|
||||
#441 Address compiler warnings
|
||||
#443 Version info bumped from 7:12:6 to 8:0:7
|
||||
due to addition of error code XML_ERROR_NO_BUFFER
|
||||
(see https://verbump.de/ for what these numbers do)
|
||||
|
||||
Infrastructure:
|
||||
#435 #446 Replace Travis CI by GitHub Actions
|
||||
|
||||
Special thanks to:
|
||||
Alexander Richardson
|
||||
Oleksandr Popovych
|
||||
Thomas Beutlich
|
||||
Tim Bray
|
||||
and
|
||||
Clang LeakSan, Clang 11 UBSan and the Clang team
|
||||
|
||||
Release 2.2.10 Sat October 3 2020
|
||||
Bug fixes:
|
||||
#390 #395 #398 Fix undefined behavior during parsing caused by
|
||||
pointer arithmetic with NULL pointers
|
||||
#404 #405 Fix reading uninitialized variable during parsing
|
||||
#406 xmlwf: Add missing check for malloc NULL return
|
||||
|
||||
Other changes:
|
||||
#396 Windows: Drop support for Visual Studio <=8.0/2005
|
||||
#409 Windows: Add missing file "Changes" to the installer
|
||||
to fix compilation with CMake from installed sources
|
||||
#403 xmlwf: Document exit codes in xmlwf manpage and
|
||||
exit with code 3 (rather than code 1) for output errors
|
||||
when used with "-d DIRECTORY"
|
||||
#356 #359 MinGW: Provide declaration of rand_s for mingwrt <5.3.0
|
||||
#383 #392 Autotools: Use -Werror while configure tests the compiler
|
||||
for supported compile flags to avoid false positives
|
||||
#383 #393 #394 Autotools: Improve handling of user (C|CPP|CXX|LD)FLAGS,
|
||||
e.g. ensure that they have the last word over flags added
|
||||
while running ./configure
|
||||
#360 CMake: Create libexpatw.{dll,so} and expatw.pc (with emphasis
|
||||
on suffix "w") with -DEXPAT_CHAR_TYPE=(ushort|wchar_t)
|
||||
#360 CMake: Detect and deny unsupported build combinations
|
||||
involving -DEXPAT_CHAR_TYPE=(ushort|wchar_t)
|
||||
#360 CMake: Install pre-compiled shipped xmlwf.1 manpage in case
|
||||
of -DEXPAT_BUILD_DOCS=OFF
|
||||
#375 #380 #419 CMake: Fix use of Expat by means of add_subdirectory
|
||||
#407 #408 CMake: Keep expat target name constant at "expat"
|
||||
(i.e. refrain from using the target name to control
|
||||
build artifact filenames)
|
||||
#385 CMake: Fix compilation with -DEXPAT_SHARED_LIBS=OFF for
|
||||
Windows
|
||||
CMake: Expose man page compilation as target "xmlwf-manpage"
|
||||
#413 #414 CMake: Introduce option EXPAT_BUILD_PKGCONFIG
|
||||
to control generation of pkg-config file "expat.pc"
|
||||
#424 CMake: Add minimalistic support for building binary packages
|
||||
with CMake target "package"; based on CPack
|
||||
#366 CMake: Add option -DEXPAT_OSSFUZZ_BUILD=(ON|OFF) with
|
||||
default OFF to build fuzzer code against OSS-Fuzz and
|
||||
related environment variable LIB_FUZZING_ENGINE
|
||||
#354 Fix testsuite for -DEXPAT_DTD=OFF and -DEXPAT_NS=OFF, each
|
||||
#354 #355 ..
|
||||
#356 #412 Address compiler warnings
|
||||
#368 #369 Address pngcheck warnings with doc/*.png images
|
||||
#425 Version info bumped from 7:11:6 to 7:12:6
|
||||
|
||||
Special thanks to:
|
||||
asavah
|
||||
Ben Wagner
|
||||
Bhargava Shastry
|
||||
Frank Landgraf
|
||||
Jeffrey Walton
|
||||
Joe Orton
|
||||
Kleber Tarcísio
|
||||
Ma Lin
|
||||
Maciej Sroczyński
|
||||
Mohammed Khajapasha
|
||||
Vadim Zeitlin
|
||||
and
|
||||
Cppcheck 2.0 and the Cppcheck team
|
||||
|
||||
Release 2.2.9 Wed September 25 2019
|
||||
Other changes:
|
||||
examples: Drop executable bits from elements.c
|
||||
#349 Windows: Change the name of the Windows DLLs from expat*.dll
|
||||
@ -17,7 +293,7 @@ Release 2.2.9 Wed Septemper 25 2019
|
||||
Special thanks to:
|
||||
Ben Wagner
|
||||
|
||||
Release 2.2.8 Fri Septemper 13 2019
|
||||
Release 2.2.8 Fri September 13 2019
|
||||
Security fixes:
|
||||
#317 #318 CVE-2019-15903 -- Fix heap overflow triggered by
|
||||
XML_GetCurrentLineNumber (or XML_GetCurrentColumnNumber),
|
||||
@ -115,10 +391,10 @@ Release 2.2.8 Fri Septemper 13 2019
|
||||
Special thanks to:
|
||||
David Loffredo
|
||||
Joonun Jang
|
||||
Khajapasha Mohammed
|
||||
Kishore Kunche
|
||||
Marco Maggi
|
||||
Mitch Phillips
|
||||
Mohammed Khajapasha
|
||||
Rolf Ade
|
||||
xantares
|
||||
Zhongyuan Zhou
|
||||
|
25
Makefile.am
25
Makefile.am
@ -6,7 +6,8 @@
|
||||
# \___/_/\_\ .__/ \__,_|\__|
|
||||
# |_| XML parser
|
||||
#
|
||||
# Copyright (c) 2017 Expat development team
|
||||
# Copyright (c) 2017-2021 Sebastian Pipping <sebastian@pipping.org>
|
||||
# Copyright (c) 2018 KangLin <kl222@126.com>
|
||||
# Licensed under the MIT license:
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
@ -53,13 +54,28 @@ pkgconfig_DATA = expat.pc
|
||||
pkgconfigdir = $(libdir)/pkgconfig
|
||||
|
||||
|
||||
dist_cmake_DATA = \
|
||||
cmake/autotools/expat.cmake
|
||||
|
||||
nodist_cmake_DATA = \
|
||||
cmake/autotools/expat-config-version.cmake \
|
||||
cmake/autotools/expat-noconfig.cmake \
|
||||
cmake/expat-config.cmake
|
||||
|
||||
cmakedir = $(libdir)/cmake/expat-@PACKAGE_VERSION@
|
||||
|
||||
|
||||
_EXTRA_DIST_CMAKE = \
|
||||
cmake/expat-config.cmake.in \
|
||||
cmake/autotools/expat-noconfig__linux.cmake.in \
|
||||
cmake/autotools/expat-noconfig__macos.cmake.in \
|
||||
cmake/autotools/expat-noconfig__windows.cmake.in \
|
||||
cmake/autotools/expat-package-init.cmake \
|
||||
cmake/mingw-toolchain.cmake \
|
||||
\
|
||||
CMakeLists.txt \
|
||||
CMake.README \
|
||||
ConfigureChecks.cmake \
|
||||
expat.pc.cmake \
|
||||
expat_config.h.cmake
|
||||
|
||||
_EXTRA_DIST_WINDOWS = \
|
||||
@ -74,11 +90,14 @@ EXTRA_DIST = \
|
||||
\
|
||||
conftools/expat.m4 \
|
||||
conftools/get-version.sh \
|
||||
conftools/PrintPath \
|
||||
\
|
||||
fuzz/xml_parsebuffer_fuzzer.c \
|
||||
fuzz/xml_parse_fuzzer.c \
|
||||
\
|
||||
xmlwf/xmlwf_helpgen.py \
|
||||
xmlwf/xmlwf_helpgen.sh \
|
||||
\
|
||||
buildconf.sh \
|
||||
Changes \
|
||||
README.md \
|
||||
\
|
||||
|
161
Makefile.in
161
Makefile.in
@ -1,7 +1,7 @@
|
||||
# Makefile.in generated by automake 1.16.1 from Makefile.am.
|
||||
# Makefile.in generated by automake 1.16.5 from Makefile.am.
|
||||
# @configure_input@
|
||||
|
||||
# Copyright (C) 1994-2018 Free Software Foundation, Inc.
|
||||
# Copyright (C) 1994-2021 Free Software Foundation, Inc.
|
||||
|
||||
# This Makefile.in is free software; the Free Software Foundation
|
||||
# gives unlimited permission to copy and/or distribute it,
|
||||
@ -22,7 +22,8 @@
|
||||
# \___/_/\_\ .__/ \__,_|\__|
|
||||
# |_| XML parser
|
||||
#
|
||||
# Copyright (c) 2017 Expat development team
|
||||
# Copyright (c) 2017-2021 Sebastian Pipping <sebastian@pipping.org>
|
||||
# Copyright (c) 2018 KangLin <kl222@126.com>
|
||||
# Licensed under the MIT license:
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
@ -138,12 +139,14 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
|
||||
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
||||
$(ACLOCAL_M4)
|
||||
DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \
|
||||
$(am__configure_deps) $(am__DIST_COMMON)
|
||||
$(am__configure_deps) $(dist_cmake_DATA) $(am__DIST_COMMON)
|
||||
am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
|
||||
configure.lineno config.status.lineno
|
||||
mkinstalldirs = $(install_sh) -d
|
||||
CONFIG_HEADER = expat_config.h
|
||||
CONFIG_CLEAN_FILES = expat.pc run.sh
|
||||
CONFIG_CLEAN_FILES = expat.pc cmake/expat-config.cmake \
|
||||
cmake/autotools/expat-config-version.cmake \
|
||||
cmake/autotools/expat-noconfig.cmake run.sh
|
||||
CONFIG_CLEAN_VPATH_FILES =
|
||||
AM_V_P = $(am__v_P_@AM_V@)
|
||||
am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
|
||||
@ -199,8 +202,9 @@ am__uninstall_files_from_dir = { \
|
||||
|| { echo " ( cd '$$dir' && rm -f" $$files ")"; \
|
||||
$(am__cd) "$$dir" && rm -f $$files; }; \
|
||||
}
|
||||
am__installdirs = "$(DESTDIR)$(pkgconfigdir)"
|
||||
DATA = $(pkgconfig_DATA)
|
||||
am__installdirs = "$(DESTDIR)$(cmakedir)" "$(DESTDIR)$(cmakedir)" \
|
||||
"$(DESTDIR)$(pkgconfigdir)"
|
||||
DATA = $(dist_cmake_DATA) $(nodist_cmake_DATA) $(pkgconfig_DATA)
|
||||
RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \
|
||||
distclean-recursive maintainer-clean-recursive
|
||||
am__recursive_targets = \
|
||||
@ -209,8 +213,8 @@ am__recursive_targets = \
|
||||
$(am__extra_recursive_targets)
|
||||
AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
|
||||
cscope distdir distdir-am dist dist-all distcheck
|
||||
am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \
|
||||
$(LISP)expat_config.h.in
|
||||
am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) \
|
||||
expat_config.h.in
|
||||
# Read a list of newline-separated strings from the standard input,
|
||||
# and print each of them once, without duplicates. Input order is
|
||||
# *not* preserved.
|
||||
@ -227,18 +231,17 @@ am__define_uniq_tagged_files = \
|
||||
unique=`for i in $$list; do \
|
||||
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
||||
done | $(am__uniquify_input)`
|
||||
ETAGS = etags
|
||||
CTAGS = ctags
|
||||
CSCOPE = cscope
|
||||
DIST_SUBDIRS = lib examples tests xmlwf doc
|
||||
am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/expat.pc.in \
|
||||
$(srcdir)/expat_config.h.in $(srcdir)/run.sh.in \
|
||||
$(top_srcdir)/cmake/autotools/expat-config-version.cmake.in \
|
||||
$(top_srcdir)/cmake/expat-config.cmake.in \
|
||||
$(top_srcdir)/conftools/ar-lib $(top_srcdir)/conftools/compile \
|
||||
$(top_srcdir)/conftools/config.guess \
|
||||
$(top_srcdir)/conftools/config.sub \
|
||||
$(top_srcdir)/conftools/install-sh \
|
||||
$(top_srcdir)/conftools/ltmain.sh \
|
||||
$(top_srcdir)/conftools/missing AUTHORS COPYING \
|
||||
$(top_srcdir)/conftools/missing AUTHORS COPYING README.md \
|
||||
conftools/ar-lib conftools/compile conftools/config.guess \
|
||||
conftools/config.sub conftools/depcomp conftools/install-sh \
|
||||
conftools/ltmain.sh conftools/missing
|
||||
@ -281,13 +284,19 @@ DIST_ARCHIVES = $(distdir).tar.gz $(distdir).tar.bz2 $(distdir).tar.lz \
|
||||
$(distdir).tar.xz
|
||||
GZIP_ENV = --best
|
||||
DIST_TARGETS = dist-lzip dist-xz dist-bzip2 dist-gzip
|
||||
# Exists only to be overridden by the user if desired.
|
||||
AM_DISTCHECK_DVI_TARGET = dvi
|
||||
distuninstallcheck_listfiles = find . -type f -print
|
||||
am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \
|
||||
| sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$'
|
||||
distcleancheck_listfiles = find . -type f -print
|
||||
ACLOCAL = @ACLOCAL@
|
||||
AMTAR = @AMTAR@
|
||||
AM_CFLAGS = @AM_CFLAGS@
|
||||
AM_CPPFLAGS = @AM_CPPFLAGS@
|
||||
AM_CXXFLAGS = @AM_CXXFLAGS@
|
||||
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
|
||||
AM_LDFLAGS = @AM_LDFLAGS@
|
||||
AR = @AR@
|
||||
AS = @AS@
|
||||
AUTOCONF = @AUTOCONF@
|
||||
@ -297,8 +306,9 @@ AWK = @AWK@
|
||||
CC = @CC@
|
||||
CCDEPMODE = @CCDEPMODE@
|
||||
CFLAGS = @CFLAGS@
|
||||
CPP = @CPP@
|
||||
CPPFLAGS = @CPPFLAGS@
|
||||
CSCOPE = @CSCOPE@
|
||||
CTAGS = @CTAGS@
|
||||
CXX = @CXX@
|
||||
CXXCPP = @CXXCPP@
|
||||
CXXDEPMODE = @CXXDEPMODE@
|
||||
@ -314,7 +324,15 @@ ECHO_C = @ECHO_C@
|
||||
ECHO_N = @ECHO_N@
|
||||
ECHO_T = @ECHO_T@
|
||||
EGREP = @EGREP@
|
||||
ETAGS = @ETAGS@
|
||||
EXEEXT = @EXEEXT@
|
||||
EXPAT_ATTR_INFO = @EXPAT_ATTR_INFO@
|
||||
EXPAT_CHAR_TYPE = @EXPAT_CHAR_TYPE@
|
||||
EXPAT_CONTEXT_BYTES = @EXPAT_CONTEXT_BYTES@
|
||||
EXPAT_DTD = @EXPAT_DTD@
|
||||
EXPAT_LARGE_SIZE = @EXPAT_LARGE_SIZE@
|
||||
EXPAT_MIN_SIZE = @EXPAT_MIN_SIZE@
|
||||
EXPAT_NS = @EXPAT_NS@
|
||||
FGREP = @FGREP@
|
||||
FILEMAP = @FILEMAP@
|
||||
GREP = @GREP@
|
||||
@ -327,6 +345,8 @@ LD = @LD@
|
||||
LDFLAGS = @LDFLAGS@
|
||||
LIBAGE = @LIBAGE@
|
||||
LIBCURRENT = @LIBCURRENT@
|
||||
LIBDIR_BASENAME = @LIBDIR_BASENAME@
|
||||
LIBM = @LIBM@
|
||||
LIBOBJS = @LIBOBJS@
|
||||
LIBREVISION = @LIBREVISION@
|
||||
LIBS = @LIBS@
|
||||
@ -356,6 +376,9 @@ RANLIB = @RANLIB@
|
||||
SED = @SED@
|
||||
SET_MAKE = @SET_MAKE@
|
||||
SHELL = @SHELL@
|
||||
SO_MAJOR = @SO_MAJOR@
|
||||
SO_MINOR = @SO_MINOR@
|
||||
SO_PATCH = @SO_PATCH@
|
||||
STRIP = @STRIP@
|
||||
VERSION = @VERSION@
|
||||
abs_builddir = @abs_builddir@
|
||||
@ -366,6 +389,7 @@ ac_ct_AR = @ac_ct_AR@
|
||||
ac_ct_CC = @ac_ct_CC@
|
||||
ac_ct_CXX = @ac_ct_CXX@
|
||||
ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
|
||||
ac_cv_sizeof_void_p = @ac_cv_sizeof_void_p@
|
||||
am__include = @am__include@
|
||||
am__leading_dot = @am__leading_dot@
|
||||
am__quote = @am__quote@
|
||||
@ -403,6 +427,7 @@ pdfdir = @pdfdir@
|
||||
prefix = @prefix@
|
||||
program_transform_name = @program_transform_name@
|
||||
psdir = @psdir@
|
||||
runstatedir = @runstatedir@
|
||||
sbindir = @sbindir@
|
||||
sharedstatedir = @sharedstatedir@
|
||||
srcdir = @srcdir@
|
||||
@ -423,13 +448,26 @@ LIBTOOLFLAGS = --verbose
|
||||
SUBDIRS = lib $(am__append_1) $(am__append_2) $(am__append_3)
|
||||
pkgconfig_DATA = expat.pc
|
||||
pkgconfigdir = $(libdir)/pkgconfig
|
||||
dist_cmake_DATA = \
|
||||
cmake/autotools/expat.cmake
|
||||
|
||||
nodist_cmake_DATA = \
|
||||
cmake/autotools/expat-config-version.cmake \
|
||||
cmake/autotools/expat-noconfig.cmake \
|
||||
cmake/expat-config.cmake
|
||||
|
||||
cmakedir = $(libdir)/cmake/expat-@PACKAGE_VERSION@
|
||||
_EXTRA_DIST_CMAKE = \
|
||||
cmake/expat-config.cmake.in \
|
||||
cmake/autotools/expat-noconfig__linux.cmake.in \
|
||||
cmake/autotools/expat-noconfig__macos.cmake.in \
|
||||
cmake/autotools/expat-noconfig__windows.cmake.in \
|
||||
cmake/autotools/expat-package-init.cmake \
|
||||
cmake/mingw-toolchain.cmake \
|
||||
\
|
||||
CMakeLists.txt \
|
||||
CMake.README \
|
||||
ConfigureChecks.cmake \
|
||||
expat.pc.cmake \
|
||||
expat_config.h.cmake
|
||||
|
||||
_EXTRA_DIST_WINDOWS = \
|
||||
@ -444,11 +482,14 @@ EXTRA_DIST = \
|
||||
\
|
||||
conftools/expat.m4 \
|
||||
conftools/get-version.sh \
|
||||
conftools/PrintPath \
|
||||
\
|
||||
fuzz/xml_parsebuffer_fuzzer.c \
|
||||
fuzz/xml_parse_fuzzer.c \
|
||||
\
|
||||
xmlwf/xmlwf_helpgen.py \
|
||||
xmlwf/xmlwf_helpgen.sh \
|
||||
\
|
||||
buildconf.sh \
|
||||
Changes \
|
||||
README.md \
|
||||
\
|
||||
@ -509,6 +550,12 @@ distclean-hdr:
|
||||
-rm -f expat_config.h stamp-h1
|
||||
expat.pc: $(top_builddir)/config.status $(srcdir)/expat.pc.in
|
||||
cd $(top_builddir) && $(SHELL) ./config.status $@
|
||||
cmake/expat-config.cmake: $(top_builddir)/config.status $(top_srcdir)/cmake/expat-config.cmake.in
|
||||
cd $(top_builddir) && $(SHELL) ./config.status $@
|
||||
cmake/autotools/expat-config-version.cmake: $(top_builddir)/config.status $(top_srcdir)/cmake/autotools/expat-config-version.cmake.in
|
||||
cd $(top_builddir) && $(SHELL) ./config.status $@
|
||||
cmake/autotools/expat-noconfig.cmake: $(top_builddir)/config.status
|
||||
cd $(top_builddir) && $(SHELL) ./config.status $@
|
||||
run.sh: $(top_builddir)/config.status $(srcdir)/run.sh.in
|
||||
cd $(top_builddir) && $(SHELL) ./config.status $@
|
||||
|
||||
@ -520,6 +567,48 @@ clean-libtool:
|
||||
|
||||
distclean-libtool:
|
||||
-rm -f libtool config.lt
|
||||
install-dist_cmakeDATA: $(dist_cmake_DATA)
|
||||
@$(NORMAL_INSTALL)
|
||||
@list='$(dist_cmake_DATA)'; test -n "$(cmakedir)" || list=; \
|
||||
if test -n "$$list"; then \
|
||||
echo " $(MKDIR_P) '$(DESTDIR)$(cmakedir)'"; \
|
||||
$(MKDIR_P) "$(DESTDIR)$(cmakedir)" || exit 1; \
|
||||
fi; \
|
||||
for p in $$list; do \
|
||||
if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
|
||||
echo "$$d$$p"; \
|
||||
done | $(am__base_list) | \
|
||||
while read files; do \
|
||||
echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(cmakedir)'"; \
|
||||
$(INSTALL_DATA) $$files "$(DESTDIR)$(cmakedir)" || exit $$?; \
|
||||
done
|
||||
|
||||
uninstall-dist_cmakeDATA:
|
||||
@$(NORMAL_UNINSTALL)
|
||||
@list='$(dist_cmake_DATA)'; test -n "$(cmakedir)" || list=; \
|
||||
files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
|
||||
dir='$(DESTDIR)$(cmakedir)'; $(am__uninstall_files_from_dir)
|
||||
install-nodist_cmakeDATA: $(nodist_cmake_DATA)
|
||||
@$(NORMAL_INSTALL)
|
||||
@list='$(nodist_cmake_DATA)'; test -n "$(cmakedir)" || list=; \
|
||||
if test -n "$$list"; then \
|
||||
echo " $(MKDIR_P) '$(DESTDIR)$(cmakedir)'"; \
|
||||
$(MKDIR_P) "$(DESTDIR)$(cmakedir)" || exit 1; \
|
||||
fi; \
|
||||
for p in $$list; do \
|
||||
if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
|
||||
echo "$$d$$p"; \
|
||||
done | $(am__base_list) | \
|
||||
while read files; do \
|
||||
echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(cmakedir)'"; \
|
||||
$(INSTALL_DATA) $$files "$(DESTDIR)$(cmakedir)" || exit $$?; \
|
||||
done
|
||||
|
||||
uninstall-nodist_cmakeDATA:
|
||||
@$(NORMAL_UNINSTALL)
|
||||
@list='$(nodist_cmake_DATA)'; test -n "$(cmakedir)" || list=; \
|
||||
files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
|
||||
dir='$(DESTDIR)$(cmakedir)'; $(am__uninstall_files_from_dir)
|
||||
install-pkgconfigDATA: $(pkgconfig_DATA)
|
||||
@$(NORMAL_INSTALL)
|
||||
@list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \
|
||||
@ -647,7 +736,6 @@ cscopelist-am: $(am__tagged_files)
|
||||
distclean-tags:
|
||||
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
|
||||
-rm -f cscope.out cscope.in.out cscope.po.out cscope.files
|
||||
|
||||
distdir: $(BUILT_SOURCES)
|
||||
$(MAKE) $(AM_MAKEFLAGS) distdir-am
|
||||
|
||||
@ -728,6 +816,10 @@ dist-xz: distdir
|
||||
tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz
|
||||
$(am__post_remove_distdir)
|
||||
|
||||
dist-zstd: distdir
|
||||
tardir=$(distdir) && $(am__tar) | zstd -c $${ZSTD_CLEVEL-$${ZSTD_OPT--19}} >$(distdir).tar.zst
|
||||
$(am__post_remove_distdir)
|
||||
|
||||
dist-tarZ: distdir
|
||||
@echo WARNING: "Support for distribution archives compressed with" \
|
||||
"legacy program 'compress' is deprecated." >&2
|
||||
@ -770,6 +862,8 @@ distcheck: dist
|
||||
eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\
|
||||
*.zip*) \
|
||||
unzip $(distdir).zip ;;\
|
||||
*.tar.zst*) \
|
||||
zstd -dc $(distdir).tar.zst | $(am__untar) ;;\
|
||||
esac
|
||||
chmod -R a-w $(distdir)
|
||||
chmod u+w $(distdir)
|
||||
@ -785,7 +879,7 @@ distcheck: dist
|
||||
$(DISTCHECK_CONFIGURE_FLAGS) \
|
||||
--srcdir=../.. --prefix="$$dc_install_base" \
|
||||
&& $(MAKE) $(AM_MAKEFLAGS) \
|
||||
&& $(MAKE) $(AM_MAKEFLAGS) dvi \
|
||||
&& $(MAKE) $(AM_MAKEFLAGS) $(AM_DISTCHECK_DVI_TARGET) \
|
||||
&& $(MAKE) $(AM_MAKEFLAGS) check \
|
||||
&& $(MAKE) $(AM_MAKEFLAGS) install \
|
||||
&& $(MAKE) $(AM_MAKEFLAGS) installcheck \
|
||||
@ -841,7 +935,7 @@ check: check-recursive
|
||||
all-am: Makefile $(DATA) expat_config.h
|
||||
installdirs: installdirs-recursive
|
||||
installdirs-am:
|
||||
for dir in "$(DESTDIR)$(pkgconfigdir)"; do \
|
||||
for dir in "$(DESTDIR)$(cmakedir)" "$(DESTDIR)$(cmakedir)" "$(DESTDIR)$(pkgconfigdir)"; do \
|
||||
test -z "$$dir" || $(MKDIR_P) "$$dir"; \
|
||||
done
|
||||
install: install-recursive
|
||||
@ -896,7 +990,8 @@ info: info-recursive
|
||||
|
||||
info-am:
|
||||
|
||||
install-data-am: install-pkgconfigDATA
|
||||
install-data-am: install-dist_cmakeDATA install-nodist_cmakeDATA \
|
||||
install-pkgconfigDATA
|
||||
|
||||
install-dvi: install-dvi-recursive
|
||||
|
||||
@ -942,7 +1037,8 @@ ps: ps-recursive
|
||||
|
||||
ps-am:
|
||||
|
||||
uninstall-am: uninstall-pkgconfigDATA
|
||||
uninstall-am: uninstall-dist_cmakeDATA uninstall-nodist_cmakeDATA \
|
||||
uninstall-pkgconfigDATA
|
||||
|
||||
.MAKE: $(am__recursive_targets) all install-am install-strip
|
||||
|
||||
@ -950,18 +1046,21 @@ uninstall-am: uninstall-pkgconfigDATA
|
||||
am--refresh check check-am clean clean-cscope clean-generic \
|
||||
clean-libtool cscope cscopelist-am ctags ctags-am dist \
|
||||
dist-all dist-bzip2 dist-gzip dist-lzip dist-shar dist-tarZ \
|
||||
dist-xz dist-zip distcheck distclean distclean-generic \
|
||||
distclean-hdr distclean-libtool distclean-tags distcleancheck \
|
||||
distdir distuninstallcheck dvi dvi-am html html-am info \
|
||||
info-am install install-am install-data install-data-am \
|
||||
dist-xz dist-zip dist-zstd distcheck distclean \
|
||||
distclean-generic distclean-hdr distclean-libtool \
|
||||
distclean-tags distcleancheck distdir distuninstallcheck dvi \
|
||||
dvi-am html html-am info info-am install install-am \
|
||||
install-data install-data-am install-dist_cmakeDATA \
|
||||
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-pkgconfigDATA \
|
||||
install-ps install-ps-am install-strip installcheck \
|
||||
installcheck-am installdirs installdirs-am maintainer-clean \
|
||||
maintainer-clean-generic mostlyclean mostlyclean-generic \
|
||||
mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \
|
||||
uninstall-am uninstall-pkgconfigDATA
|
||||
install-man install-nodist_cmakeDATA install-pdf \
|
||||
install-pdf-am install-pkgconfigDATA install-ps install-ps-am \
|
||||
install-strip installcheck installcheck-am installdirs \
|
||||
installdirs-am maintainer-clean maintainer-clean-generic \
|
||||
mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \
|
||||
ps ps-am tags tags-am uninstall uninstall-am \
|
||||
uninstall-dist_cmakeDATA uninstall-nodist_cmakeDATA \
|
||||
uninstall-pkgconfigDATA
|
||||
|
||||
.PRECIOUS: Makefile
|
||||
|
||||
|
97
README.md
97
README.md
@ -1,12 +1,14 @@
|
||||
[![Travis CI Build Status](https://travis-ci.org/libexpat/libexpat.svg?branch=master)](https://travis-ci.org/libexpat/libexpat)
|
||||
[![Run Linux Travis CI tasks](https://github.com/libexpat/libexpat/actions/workflows/linux.yml/badge.svg)](https://github.com/libexpat/libexpat/actions/workflows/linux.yml)
|
||||
[![AppVeyor Build Status](https://ci.appveyor.com/api/projects/status/github/libexpat/libexpat?svg=true)](https://ci.appveyor.com/project/libexpat/libexpat)
|
||||
[![Packaging status](https://repology.org/badge/tiny-repos/expat.svg)](https://repology.org/metapackage/expat/versions)
|
||||
[![Downloads SourceForge](https://img.shields.io/sourceforge/dt/expat?label=Downloads%20SourceForge)](https://sourceforge.net/projects/expat/files/)
|
||||
[![Downloads GitHub](https://img.shields.io/github/downloads/libexpat/libexpat/total?label=Downloads%20GitHub)](https://github.com/libexpat/libexpat/releases)
|
||||
|
||||
|
||||
# Expat, Release 2.2.9
|
||||
# Expat, Release 2.4.3
|
||||
|
||||
This is Expat, a C library for parsing XML, started by
|
||||
[James Clark](https://en.wikipedia.org/wiki/James_Clark_(programmer)) in 1997.
|
||||
[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
|
||||
are called when the parser discovers the associated structures in the
|
||||
@ -14,13 +16,14 @@ document being parsed. A start tag is an example of the kind of
|
||||
structures for which you may register handlers.
|
||||
|
||||
Expat supports the following compilers:
|
||||
|
||||
- GNU GCC >=4.5
|
||||
- LLVM Clang >=3.5
|
||||
- Microsoft Visual Studio >=8.0/2005
|
||||
- Microsoft Visual Studio >=15.0/2017 (rolling `${today} minus 5 years`)
|
||||
|
||||
Windows users should use the
|
||||
[`expat_win32` package](https://sourceforge.net/projects/expat/files/expat_win32/),
|
||||
which includes both precompiled libraries and executables, and source code for
|
||||
Windows users can use the
|
||||
[`expat-win32bin-*.*.*.{exe,zip}` download](https://github.com/libexpat/libexpat/releases),
|
||||
which includes both pre-compiled libraries and executables, and source code for
|
||||
developers.
|
||||
|
||||
Expat is [free software](https://www.gnu.org/philosophy/free-sw.en.html).
|
||||
@ -30,6 +33,67 @@ contained in the file
|
||||
distributed with this package.
|
||||
This license is the same as the MIT/X Consortium license.
|
||||
|
||||
|
||||
## Using libexpat in your CMake-Based Project
|
||||
|
||||
There are two ways of using libexpat with CMake:
|
||||
|
||||
### a) Module Mode
|
||||
|
||||
This approach leverages CMake's own [module `FindEXPAT`](https://cmake.org/cmake/help/latest/module/FindEXPAT.html).
|
||||
|
||||
Notice the *uppercase* `EXPAT` in the following example:
|
||||
|
||||
```cmake
|
||||
cmake_minimum_required(VERSION 3.0) # or 3.10, see below
|
||||
|
||||
project(hello VERSION 1.0.0)
|
||||
|
||||
find_package(EXPAT 2.2.8 MODULE REQUIRED)
|
||||
|
||||
add_executable(hello
|
||||
hello.c
|
||||
)
|
||||
|
||||
# a) for CMake >=3.10 (see CMake's FindEXPAT docs)
|
||||
target_link_libraries(hello PUBLIC EXPAT::EXPAT)
|
||||
|
||||
# b) for CMake >=3.0
|
||||
target_include_directories(hello PRIVATE ${EXPAT_INCLUDE_DIRS})
|
||||
target_link_libraries(hello PUBLIC ${EXPAT_LIBRARIES})
|
||||
```
|
||||
|
||||
### b) Config Mode
|
||||
|
||||
This approach requires files from…
|
||||
|
||||
- libexpat >=2.2.8 where packaging uses the CMake build system
|
||||
or
|
||||
- libexpat >=2.3.0 where packaging uses the GNU Autotools build system
|
||||
on Linux
|
||||
or
|
||||
- libexpat >=2.4.0 where packaging uses the GNU Autotools build system
|
||||
on macOS or MinGW.
|
||||
|
||||
Notice the *lowercase* `expat` in the following example:
|
||||
|
||||
```cmake
|
||||
cmake_minimum_required(VERSION 3.0)
|
||||
|
||||
project(hello VERSION 1.0.0)
|
||||
|
||||
find_package(expat 2.2.8 CONFIG REQUIRED char dtd ns)
|
||||
|
||||
add_executable(hello
|
||||
hello.c
|
||||
)
|
||||
|
||||
target_link_libraries(hello PUBLIC expat::expat)
|
||||
```
|
||||
|
||||
|
||||
## Building from a Git Clone
|
||||
|
||||
If you are building Expat from a check-out from the
|
||||
[Git repository](https://github.com/libexpat/libexpat/),
|
||||
you need to run a script that generates the configure script using the
|
||||
@ -43,6 +107,11 @@ autoconf 2.58 or newer. Run the script like this:
|
||||
Once this has been done, follow the same instructions as for building
|
||||
from a source distribution.
|
||||
|
||||
|
||||
## Building from a Source Distribution
|
||||
|
||||
### a) Building with the configure script (i.e. GNU Autotools)
|
||||
|
||||
To build Expat from a source distribution, you first run the
|
||||
configuration shell script in the top level distribution directory:
|
||||
|
||||
@ -132,8 +201,14 @@ A reference manual is available in the file `doc/reference.html` in this
|
||||
distribution.
|
||||
|
||||
|
||||
The CMake build system is still *experimental* and will replace the primary
|
||||
### b) Building with CMake
|
||||
|
||||
The CMake build system is still *experimental* and may replace the primary
|
||||
build system based on GNU Autotools at some point when it is ready.
|
||||
|
||||
|
||||
#### Available Options
|
||||
|
||||
For an idea of the available (non-advanced) options for building with CMake:
|
||||
|
||||
```console
|
||||
@ -156,6 +231,9 @@ EXPAT_BUILD_EXAMPLES:BOOL=ON
|
||||
// build fuzzers for the expat library
|
||||
EXPAT_BUILD_FUZZERS:BOOL=OFF
|
||||
|
||||
// build pkg-config file
|
||||
EXPAT_BUILD_PKGCONFIG:BOOL=ON
|
||||
|
||||
// build the tests for expat library
|
||||
EXPAT_BUILD_TESTS:BOOL=ON
|
||||
|
||||
@ -171,6 +249,9 @@ EXPAT_ENABLE_INSTALL:BOOL=ON
|
||||
// Use /MT flag (static CRT) when compiling in MSVC
|
||||
EXPAT_MSVC_STATIC_CRT:BOOL=OFF
|
||||
|
||||
// build fuzzers via ossfuzz for the expat library
|
||||
EXPAT_OSSFUZZ_BUILD:BOOL=OFF
|
||||
|
||||
// build a shared expat library
|
||||
EXPAT_SHARED_LIBS:BOOL=ON
|
||||
|
||||
|
55
buildconf.sh
Executable file
55
buildconf.sh
Executable file
@ -0,0 +1,55 @@
|
||||
#! /usr/bin/env bash
|
||||
# __ __ _
|
||||
# ___\ \/ /_ __ __ _| |_
|
||||
# / _ \\ /| '_ \ / _` | __|
|
||||
# | __// \| |_) | (_| | |_
|
||||
# \___/_/\_\ .__/ \__,_|\__|
|
||||
# |_| XML parser
|
||||
#
|
||||
# Copyright (c) 2017-2021 Sebastian Pipping <sebastian@pipping.org>
|
||||
# Copyright (c) 2018 Marco Maggi <marco.maggi-ipsu@poste.it>
|
||||
# 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.
|
||||
|
||||
set -e
|
||||
|
||||
# File expat_config.h.in (as generated by autoheader by autoreconf) contains
|
||||
# macro SIZEOF_VOID_P which is (1) not really needed by Expat as of today and
|
||||
# (2) a problem to "multilib" systems with one shared installed
|
||||
# /usr/include/expat_config.h for two Expats with different "void *" sizes
|
||||
# installed in e.g. /usr/lib32 and /usr/lib64. Hence we patch macro
|
||||
# SIZEOF_VOID_P out of template expat_config.h.in so that configure will
|
||||
# not put SIZEOF_VOID_P in the eventual expat_config.h.
|
||||
patch_expat_config_h_in() {
|
||||
local filename="$1"
|
||||
local sizeof_void_p_line_number="$(fgrep -n SIZEOF_VOID_P "${filename}" | awk -F: '{print $1}')"
|
||||
[[ ${sizeof_void_p_line_number} =~ ^[0-9]+$ ]] # cheap assert
|
||||
local first_line_to_delete=$(( sizeof_void_p_line_number - 1 ))
|
||||
local last_line_to_delete=$(( sizeof_void_p_line_number + 1 ))
|
||||
# Note: Avoiding "sed -i" only for macOS portability.
|
||||
local tempfile="$(mktemp)"
|
||||
sed "${first_line_to_delete},${last_line_to_delete}d" "${filename}" > "${tempfile}"
|
||||
mv "${tempfile}" "${filename}"
|
||||
}
|
||||
|
||||
autoreconf --warnings=all --install --verbose "$@"
|
||||
|
||||
patch_expat_config_h_in expat_config.h.in
|
166
configure.ac
166
configure.ac
@ -1,21 +1,54 @@
|
||||
dnl configuration script for expat
|
||||
dnl Process this file with autoconf to produce a configure script.
|
||||
dnl __ __ _
|
||||
dnl ___\ \/ /_ __ __ _| |_
|
||||
dnl / _ \\ /| '_ \ / _` | __|
|
||||
dnl | __// \| |_) | (_| | |_
|
||||
dnl \___/_/\_\ .__/ \__,_|\__|
|
||||
dnl |_| XML parser
|
||||
dnl
|
||||
dnl Copyright 2000 Clark Cooper
|
||||
dnl Copyright (c) 2000 Clark Cooper <coopercc@users.sourceforge.net>
|
||||
dnl Copyright (c) 2000-2005 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
|
||||
dnl Copyright (c) 2001-2003 Greg Stein <gstein@users.sourceforge.net>
|
||||
dnl Copyright (c) 2006-2012 Karl Waclawek <karl@waclawek.net>
|
||||
dnl Copyright (c) 2016-2022 Sebastian Pipping <sebastian@pipping.org>
|
||||
dnl Copyright (c) 2017 S. P. Zeidler <spz@netbsd.org>
|
||||
dnl Copyright (c) 2017 Stephen Groat <stephen@groat.us>
|
||||
dnl Copyright (c) 2017-2020 Joe Orton <jorton@redhat.com>
|
||||
dnl Copyright (c) 2018 Yury Gribov <tetra2005@gmail.com>
|
||||
dnl Copyright (c) 2018 Benjamin Peterson <benjamin@python.org>
|
||||
dnl Copyright (c) 2018 Marco Maggi <marco.maggi-ipsu@poste.it>
|
||||
dnl Copyright (c) 2018 KangLin <kl222@126.com>
|
||||
dnl Copyright (c) 2019 Mohammed Khajapasha <mohammed.khajapasha@intel.com>
|
||||
dnl Copyright (c) 2019 Kishore Kunche <kishore.kunche@intel.com>
|
||||
dnl Copyright (c) 2020 Jeffrey Walton <noloader@gmail.com>
|
||||
dnl Licensed under the MIT license:
|
||||
dnl
|
||||
dnl This file is part of EXPAT.
|
||||
dnl Permission is hereby granted, free of charge, to any person obtaining
|
||||
dnl a copy of this software and associated documentation files (the
|
||||
dnl "Software"), to deal in the Software without restriction, including
|
||||
dnl without limitation the rights to use, copy, modify, merge, publish,
|
||||
dnl distribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
dnl persons to whom the Software is furnished to do so, subject to the
|
||||
dnl following conditions:
|
||||
dnl
|
||||
dnl EXPAT is free software; you can redistribute it and/or modify it
|
||||
dnl under the terms of the License (based on the MIT/X license) contained
|
||||
dnl in the file COPYING that comes with this distribution.
|
||||
dnl The above copyright notice and this permission notice shall be included
|
||||
dnl in all copies or substantial portions of the Software.
|
||||
dnl
|
||||
dnl THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
dnl EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
dnl MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
||||
dnl NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||
dnl DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
dnl OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||
dnl USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
dnl Ensure that Expat is configured with autoconf 2.69 or newer.
|
||||
AC_PREREQ(2.69)
|
||||
AC_PREREQ([2.69])
|
||||
|
||||
dnl Get the version number of Expat, using m4's esyscmd() command to run
|
||||
dnl the command at m4-generation time. This allows us to create an m4
|
||||
dnl symbol holding the correct version number. AC_INIT() requires the
|
||||
dnl symbol holding the correct version number. AC_INIT requires the
|
||||
dnl version number at m4-time, rather than when ./configure is run, so
|
||||
dnl all this must happen as part of m4, not as part of the shell code
|
||||
dnl contained in ./configure.
|
||||
@ -27,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, [expat-bugs@libexpat.org])
|
||||
m4_undefine([expat_version])
|
||||
|
||||
AC_CONFIG_SRCDIR([Makefile.in])
|
||||
@ -48,12 +81,11 @@ dnl
|
||||
dnl If the API changes incompatibly set LIBAGE back to 0
|
||||
dnl
|
||||
|
||||
LIBCURRENT=7 # sync
|
||||
LIBREVISION=11 # with
|
||||
LIBAGE=6 # CMakeLists.txt!
|
||||
LIBCURRENT=9 # sync
|
||||
LIBREVISION=3 # with
|
||||
LIBAGE=8 # CMakeLists.txt!
|
||||
|
||||
AX_APPEND_FLAG([-DHAVE_EXPAT_CONFIG_H], [CPPFLAGS])
|
||||
AC_CONFIG_HEADER([expat_config.h])
|
||||
AC_CONFIG_HEADERS([expat_config.h])
|
||||
|
||||
AM_PROG_AR
|
||||
AC_PROG_INSTALL
|
||||
@ -69,30 +101,32 @@ AC_SUBST(LIBAGE)
|
||||
|
||||
AC_LANG([C])
|
||||
AC_PROG_CC_C99
|
||||
|
||||
AS_IF([test "$GCC" = yes],
|
||||
[AX_APPEND_COMPILE_FLAGS([-Wall -Wextra], [CFLAGS])
|
||||
[AX_APPEND_COMPILE_FLAGS([-Wall -Wextra], [AM_CFLAGS])
|
||||
dnl Be careful about adding the -fexceptions option; some versions of
|
||||
dnl GCC don't support it and it causes extra warnings that are only
|
||||
dnl distracting; avoid.
|
||||
AX_APPEND_COMPILE_FLAGS([-fexceptions], [CFLAGS])
|
||||
AX_APPEND_COMPILE_FLAGS([-fno-strict-aliasing -Wmissing-prototypes -Wstrict-prototypes], [CFLAGS])
|
||||
AX_APPEND_COMPILE_FLAGS([-pedantic -Wduplicated-cond -Wduplicated-branches -Wlogical-op], [CFLAGS])
|
||||
AX_APPEND_COMPILE_FLAGS([-Wrestrict -Wnull-dereference -Wjump-misses-init -Wdouble-promotion], [CFLAGS])
|
||||
AX_APPEND_COMPILE_FLAGS([-Wshadow -Wformat=2 -Wmisleading-indentation], [CFLAGS])])
|
||||
AX_APPEND_COMPILE_FLAGS([-fexceptions], [AM_CFLAGS])
|
||||
AX_APPEND_COMPILE_FLAGS([-fno-strict-aliasing -Wmissing-prototypes -Wstrict-prototypes], [AM_CFLAGS])
|
||||
AX_APPEND_COMPILE_FLAGS([-pedantic -Wduplicated-cond -Wduplicated-branches -Wlogical-op], [AM_CFLAGS])
|
||||
AX_APPEND_COMPILE_FLAGS([-Wrestrict -Wnull-dereference -Wjump-misses-init -Wdouble-promotion], [AM_CFLAGS])
|
||||
AX_APPEND_COMPILE_FLAGS([-Wshadow -Wformat=2 -Wno-pedantic-ms-format -Wmisleading-indentation], [AM_CFLAGS])])
|
||||
|
||||
AC_LANG_PUSH([C++])
|
||||
AC_PROG_CXX
|
||||
|
||||
AS_IF([test "$GCC" = yes],
|
||||
[AX_APPEND_COMPILE_FLAGS([-Wall -Wextra], [CXXFLAGS])
|
||||
[AX_APPEND_COMPILE_FLAGS([-Wall -Wextra], [AM_CXXFLAGS])
|
||||
dnl Be careful about adding the -fexceptions option; some versions of
|
||||
dnl GCC don't support it and it causes extra warnings that are only
|
||||
dnl distracting; avoid.
|
||||
AX_APPEND_COMPILE_FLAGS([-fexceptions], [CXXFLAGS])
|
||||
AX_APPEND_COMPILE_FLAGS([-fno-strict-aliasing], [CXXFLAGS])])
|
||||
AX_APPEND_COMPILE_FLAGS([-fexceptions], [AM_CXXFLAGS])
|
||||
AX_APPEND_COMPILE_FLAGS([-fno-strict-aliasing], [AM_CXXFLAGS])])
|
||||
AC_LANG_POP([C++])
|
||||
|
||||
AS_IF([test "$GCC" = yes],
|
||||
[AX_APPEND_LINK_FLAGS([-fno-strict-aliasing],[LDFLAGS])])
|
||||
[AX_APPEND_LINK_FLAGS([-fno-strict-aliasing],[AM_LDFLAGS])])
|
||||
|
||||
dnl patching ${archive_cmds} to affect generation of file "libtool" to fix linking with clang (issue #312)
|
||||
AS_CASE(["$LD"],[*clang*],
|
||||
@ -100,11 +134,8 @@ AS_CASE(["$LD"],[*clang*],
|
||||
[*linux*],[archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'])])
|
||||
|
||||
EXPATCFG_COMPILER_SUPPORTS_VISIBILITY([
|
||||
AX_APPEND_FLAG([-fvisibility=hidden], [CFLAGS])
|
||||
AX_APPEND_FLAG([-DXML_ENABLE_VISIBILITY=1], [CFLAGS])])
|
||||
|
||||
dnl Checks for header files.
|
||||
AC_HEADER_STDC
|
||||
AX_APPEND_FLAG([-fvisibility=hidden], [AM_CFLAGS])
|
||||
AX_APPEND_FLAG([-DXML_ENABLE_VISIBILITY=1], [AM_CPPFLAGS])])
|
||||
|
||||
dnl Checks for typedefs, structures, and compiler characteristics.
|
||||
|
||||
@ -149,8 +180,13 @@ AS_CASE("${host_os}",
|
||||
AC_MSG_NOTICE([detected OS: MinGW])])
|
||||
AM_CONDITIONAL([MINGW], [test x${EXPATCFG_ON_MINGW} = xyes])
|
||||
|
||||
dnl Note: Prefix "_INTERNAL_" here means exclusive use inside of file configure.ac
|
||||
AM_CONDITIONAL([UNICODE], [echo -- "${CPPFLAGS}${CFLAGS}" | ${FGREP} XML_UNICODE >/dev/null])
|
||||
AM_CONDITIONAL([_INTERNAL_UNICODE_WCHAR_T], [echo -- "${CPPFLAGS}${CFLAGS}" | ${FGREP} XML_UNICODE_WCHAR_T >/dev/null])
|
||||
AM_CONDITIONAL([_INTERNAL_MIN_SIZE], [echo -- "${CPPFLAGS}${CFLAGS}" | ${FGREP} XML_MIN_SIZE >/dev/null])
|
||||
AM_CONDITIONAL([_INTERNAL_LARGE_SIZE], [echo -- "${CPPFLAGS}${CFLAGS}" | ${FGREP} XML_LARGE_SIZE >/dev/null])
|
||||
|
||||
LT_LIB_M
|
||||
|
||||
AC_ARG_WITH([libbsd],
|
||||
[AS_HELP_STRING([--with-libbsd], [utilize libbsd (for arc4random_buf)])],
|
||||
@ -307,8 +343,67 @@ AS_IF([test "x${DOCBOOK_TO_MAN}" != x -a "x$with_docbook" != xno],
|
||||
|
||||
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
|
||||
dnl that are either set to "" when enabled or to "#" when disabled
|
||||
dnl (because they are used to dynamically comment out certain things)
|
||||
AS_IF([test "x${enable_xml_attr_info}" = xyes],
|
||||
[EXPAT_ATTR_INFO=ON],
|
||||
[EXPAT_ATTR_INFO=OFF])
|
||||
EXPAT_DTD=ON
|
||||
AS_IF([test "x${_INTERNAL_LARGE_SIZE_TRUE}" = x],
|
||||
[EXPAT_LARGE_SIZE=ON],
|
||||
[EXPAT_LARGE_SIZE=OFF])
|
||||
AS_IF([test "x${_INTERNAL_MIN_SIZE_TRUE}" = x],
|
||||
[EXPAT_MIN_SIZE=ON],
|
||||
[EXPAT_MIN_SIZE=OFF])
|
||||
EXPAT_NS=ON
|
||||
AS_IF([test "x${enable_xml_context}" != xno],
|
||||
[EXPAT_CONTEXT_BYTES=${enable_xml_context}],
|
||||
[EXPAT_CONTEXT_BYTES=OFF])
|
||||
AS_IF([test "x${UNICODE_TRUE}" = x],
|
||||
[AS_IF(
|
||||
[test "x${_INTERNAL_UNICODE_WCHAR_T_TRUE}" = x],
|
||||
[EXPAT_CHAR_TYPE=wchar_t],
|
||||
[EXPAT_CHAR_TYPE=ushort])],
|
||||
[EXPAT_CHAR_TYPE=char])
|
||||
PACKAGE_INIT="${srcdir}"/cmake/autotools/expat-package-init.cmake
|
||||
LIBDIR_BASENAME="$(basename "${libdir}")"
|
||||
SO_MAJOR="$(expr "${LIBCURRENT}" - "${LIBAGE}")"
|
||||
SO_MINOR="${LIBAGE}"
|
||||
SO_PATCH="${LIBREVISION}"
|
||||
AC_CHECK_SIZEOF([void *]) # sets ac_cv_sizeof_void_p
|
||||
AC_SUBST([EXPAT_ATTR_INFO])
|
||||
AC_SUBST([EXPAT_DTD])
|
||||
AC_SUBST([EXPAT_LARGE_SIZE])
|
||||
AC_SUBST([EXPAT_MIN_SIZE])
|
||||
AC_SUBST([EXPAT_NS])
|
||||
AC_SUBST([EXPAT_CONTEXT_BYTES])
|
||||
AC_SUBST([EXPAT_CHAR_TYPE])
|
||||
AC_SUBST_FILE([PACKAGE_INIT])
|
||||
AC_SUBST([LIBDIR_BASENAME])
|
||||
AC_SUBST([SO_MAJOR])
|
||||
AC_SUBST([SO_MINOR])
|
||||
AC_SUBST([SO_PATCH])
|
||||
AC_SUBST([ac_cv_sizeof_void_p])
|
||||
|
||||
|
||||
dnl write the Automake flags we set
|
||||
AC_SUBST([AM_CPPFLAGS])
|
||||
AC_SUBST([AM_CFLAGS])
|
||||
AC_SUBST([AM_CXXFLAGS])
|
||||
AC_SUBST([AM_LDFLAGS])
|
||||
|
||||
AS_CASE("${host_os}",
|
||||
[darwin*], [CMAKE_NOCONFIG_SOURCE=cmake/autotools/expat-noconfig__macos.cmake.in],
|
||||
[mingw*], [CMAKE_NOCONFIG_SOURCE=cmake/autotools/expat-noconfig__windows.cmake.in],
|
||||
[CMAKE_NOCONFIG_SOURCE=cmake/autotools/expat-noconfig__linux.cmake.in])
|
||||
AC_CONFIG_FILES([Makefile]
|
||||
[expat.pc]
|
||||
[cmake/expat-config.cmake]
|
||||
[cmake/autotools/expat-config-version.cmake]
|
||||
[cmake/autotools/expat-noconfig.cmake:${CMAKE_NOCONFIG_SOURCE}]
|
||||
[doc/Makefile]
|
||||
[examples/Makefile]
|
||||
[lib/Makefile]
|
||||
@ -317,3 +412,18 @@ AC_CONFIG_FILES([Makefile]
|
||||
[xmlwf/Makefile])
|
||||
AC_CONFIG_FILES([run.sh], [chmod +x run.sh])
|
||||
AC_OUTPUT
|
||||
|
||||
|
||||
AC_MSG_NOTICE([
|
||||
|
||||
Automake flags (can be overridden by user flags):
|
||||
[AM_CPPFLAGS]: ${AM_CPPFLAGS}
|
||||
[AM_CFLAGS]: ${AM_CFLAGS}
|
||||
[AM_CXXFLAGS]: ${AM_CXXFLAGS}
|
||||
[AM_LDFLAGS]: ${AM_LDFLAGS}
|
||||
|
||||
User flags (override Automake flags on conflict):
|
||||
CPPFLAGS: ${CPPFLAGS}
|
||||
CFLAGS: ${CFLAGS}
|
||||
CXXFLAGS: ${CXXFLAGS}
|
||||
LDFLAGS: ${LDFLAGS}])
|
||||
|
@ -6,7 +6,9 @@
|
||||
# \___/_/\_\ .__/ \__,_|\__|
|
||||
# |_| XML parser
|
||||
#
|
||||
# Copyright (c) 2017 Expat development team
|
||||
# Copyright (c) 2017-2021 Sebastian Pipping <sebastian@pipping.org>
|
||||
# Copyright (c) 2017 Stephen Groat <stephen@groat.us>
|
||||
# Copyright (c) 2017 Joe Orton <jorton@redhat.com>
|
||||
# Licensed under the MIT license:
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
@ -52,7 +54,7 @@ clean-local-check:
|
||||
$(RM) xmlwf.1
|
||||
|
||||
EXTRA_DIST = \
|
||||
expat.png \
|
||||
ok.min.css \
|
||||
reference.html \
|
||||
style.css \
|
||||
valid-xhtml10.png \
|
||||
|
@ -1,7 +1,7 @@
|
||||
# Makefile.in generated by automake 1.16.1 from Makefile.am.
|
||||
# Makefile.in generated by automake 1.16.5 from Makefile.am.
|
||||
# @configure_input@
|
||||
|
||||
# Copyright (C) 1994-2018 Free Software Foundation, Inc.
|
||||
# Copyright (C) 1994-2021 Free Software Foundation, Inc.
|
||||
|
||||
# This Makefile.in is free software; the Free Software Foundation
|
||||
# gives unlimited permission to copy and/or distribute it,
|
||||
@ -22,7 +22,9 @@
|
||||
# \___/_/\_\ .__/ \__,_|\__|
|
||||
# |_| XML parser
|
||||
#
|
||||
# Copyright (c) 2017 Expat development team
|
||||
# Copyright (c) 2017-2021 Sebastian Pipping <sebastian@pipping.org>
|
||||
# Copyright (c) 2017 Stephen Groat <stephen@groat.us>
|
||||
# Copyright (c) 2017 Joe Orton <jorton@redhat.com>
|
||||
# Licensed under the MIT license:
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
@ -193,7 +195,11 @@ am__DIST_COMMON = $(dist_man_MANS) $(srcdir)/Makefile.in
|
||||
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
||||
ACLOCAL = @ACLOCAL@
|
||||
AMTAR = @AMTAR@
|
||||
AM_CFLAGS = @AM_CFLAGS@
|
||||
AM_CPPFLAGS = @AM_CPPFLAGS@
|
||||
AM_CXXFLAGS = @AM_CXXFLAGS@
|
||||
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
|
||||
AM_LDFLAGS = @AM_LDFLAGS@
|
||||
AR = @AR@
|
||||
AS = @AS@
|
||||
AUTOCONF = @AUTOCONF@
|
||||
@ -203,8 +209,9 @@ AWK = @AWK@
|
||||
CC = @CC@
|
||||
CCDEPMODE = @CCDEPMODE@
|
||||
CFLAGS = @CFLAGS@
|
||||
CPP = @CPP@
|
||||
CPPFLAGS = @CPPFLAGS@
|
||||
CSCOPE = @CSCOPE@
|
||||
CTAGS = @CTAGS@
|
||||
CXX = @CXX@
|
||||
CXXCPP = @CXXCPP@
|
||||
CXXDEPMODE = @CXXDEPMODE@
|
||||
@ -220,7 +227,15 @@ ECHO_C = @ECHO_C@
|
||||
ECHO_N = @ECHO_N@
|
||||
ECHO_T = @ECHO_T@
|
||||
EGREP = @EGREP@
|
||||
ETAGS = @ETAGS@
|
||||
EXEEXT = @EXEEXT@
|
||||
EXPAT_ATTR_INFO = @EXPAT_ATTR_INFO@
|
||||
EXPAT_CHAR_TYPE = @EXPAT_CHAR_TYPE@
|
||||
EXPAT_CONTEXT_BYTES = @EXPAT_CONTEXT_BYTES@
|
||||
EXPAT_DTD = @EXPAT_DTD@
|
||||
EXPAT_LARGE_SIZE = @EXPAT_LARGE_SIZE@
|
||||
EXPAT_MIN_SIZE = @EXPAT_MIN_SIZE@
|
||||
EXPAT_NS = @EXPAT_NS@
|
||||
FGREP = @FGREP@
|
||||
FILEMAP = @FILEMAP@
|
||||
GREP = @GREP@
|
||||
@ -233,6 +248,8 @@ LD = @LD@
|
||||
LDFLAGS = @LDFLAGS@
|
||||
LIBAGE = @LIBAGE@
|
||||
LIBCURRENT = @LIBCURRENT@
|
||||
LIBDIR_BASENAME = @LIBDIR_BASENAME@
|
||||
LIBM = @LIBM@
|
||||
LIBOBJS = @LIBOBJS@
|
||||
LIBREVISION = @LIBREVISION@
|
||||
LIBS = @LIBS@
|
||||
@ -262,6 +279,9 @@ RANLIB = @RANLIB@
|
||||
SED = @SED@
|
||||
SET_MAKE = @SET_MAKE@
|
||||
SHELL = @SHELL@
|
||||
SO_MAJOR = @SO_MAJOR@
|
||||
SO_MINOR = @SO_MINOR@
|
||||
SO_PATCH = @SO_PATCH@
|
||||
STRIP = @STRIP@
|
||||
VERSION = @VERSION@
|
||||
abs_builddir = @abs_builddir@
|
||||
@ -272,6 +292,7 @@ ac_ct_AR = @ac_ct_AR@
|
||||
ac_ct_CC = @ac_ct_CC@
|
||||
ac_ct_CXX = @ac_ct_CXX@
|
||||
ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
|
||||
ac_cv_sizeof_void_p = @ac_cv_sizeof_void_p@
|
||||
am__include = @am__include@
|
||||
am__leading_dot = @am__leading_dot@
|
||||
am__quote = @am__quote@
|
||||
@ -309,6 +330,7 @@ pdfdir = @pdfdir@
|
||||
prefix = @prefix@
|
||||
program_transform_name = @program_transform_name@
|
||||
psdir = @psdir@
|
||||
runstatedir = @runstatedir@
|
||||
sbindir = @sbindir@
|
||||
sharedstatedir = @sharedstatedir@
|
||||
srcdir = @srcdir@
|
||||
@ -319,7 +341,7 @@ top_builddir = @top_builddir@
|
||||
top_srcdir = @top_srcdir@
|
||||
@WITH_DOCBOOK_TRUE@dist_man_MANS = xmlwf.1
|
||||
EXTRA_DIST = \
|
||||
expat.png \
|
||||
ok.min.css \
|
||||
reference.html \
|
||||
style.css \
|
||||
valid-xhtml10.png \
|
||||
@ -413,7 +435,6 @@ ctags CTAGS:
|
||||
cscope cscopelist:
|
||||
|
||||
@WITH_DOCBOOK_TRUE@dist-hook:
|
||||
|
||||
distdir: $(BUILT_SOURCES)
|
||||
$(MAKE) $(AM_MAKEFLAGS) distdir-am
|
||||
|
||||
|
BIN
doc/expat.png
BIN
doc/expat.png
Binary file not shown.
Before Width: | Height: | Size: 1.0 KiB |
2
doc/ok.min.css
vendored
Normal file
2
doc/ok.min.css
vendored
Normal file
File diff suppressed because one or more lines are too long
@ -3,26 +3,55 @@
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||
<html>
|
||||
<head>
|
||||
<!-- Copyright 1999,2000 Clark Cooper <coopercc@netheaven.com>
|
||||
All rights reserved.
|
||||
This is free software. You may distribute or modify according to
|
||||
the terms of the MIT/X License -->
|
||||
<!--
|
||||
__ __ _
|
||||
___\ \/ /_ __ __ _| |_
|
||||
/ _ \\ /| '_ \ / _` | __|
|
||||
| __// \| |_) | (_| | |_
|
||||
\___/_/\_\ .__/ \__,_|\__|
|
||||
|_| XML parser
|
||||
|
||||
Copyright (c) 2000 Clark Cooper <coopercc@users.sourceforge.net>
|
||||
Copyright (c) 2000-2004 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
|
||||
Copyright (c) 2002-2012 Karl Waclawek <karl@waclawek.net>
|
||||
Copyright (c) 2017-2022 Sebastian Pipping <sebastian@pipping.org>
|
||||
Copyright (c) 2017 Jakub Wilk <jwilk@jwilk.net>
|
||||
Copyright (c) 2021 Tomas Korbar <tkorbar@redhat.com>
|
||||
Copyright (c) 2021 Nicolas Cavallari <nicolas.cavallari@green-communications.fr>
|
||||
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.
|
||||
-->
|
||||
<title>Expat XML Parser</title>
|
||||
<meta name="author" content="Clark Cooper, coopercc@netheaven.com" />
|
||||
<meta http-equiv="Content-Style-Type" content="text/css" />
|
||||
<link href="ok.min.css" rel="stylesheet" type="text/css" />
|
||||
<link href="style.css" rel="stylesheet" type="text/css" />
|
||||
</head>
|
||||
<body>
|
||||
<table cellspacing="0" cellpadding="0" width="100%">
|
||||
<tr>
|
||||
<td class="corner"><img src="expat.png" alt="(Expat logo)" /></td>
|
||||
<td class="banner"><h1>The Expat XML Parser</h1></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="releaseno">Release 2.0.1</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
</table>
|
||||
<div>
|
||||
<h1>
|
||||
The Expat XML Parser
|
||||
<small>Release 2.4.3</small>
|
||||
</h1>
|
||||
</div>
|
||||
<div class="content">
|
||||
|
||||
<p>Expat is a library, written in C, for parsing XML documents. It's
|
||||
@ -120,6 +149,13 @@ interface.</p>
|
||||
<li><a href="#XML_GetInputContext">XML_GetInputContext</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>
|
||||
<a href="#billion-laughs">Billion Laughs Attack Protection</a>
|
||||
<ul>
|
||||
<li><a href="#XML_SetBillionLaughsAttackProtectionMaximumAmplification">XML_SetBillionLaughsAttackProtectionMaximumAmplification</a></li>
|
||||
<li><a href="#XML_SetBillionLaughsAttackProtectionActivationThreshold">XML_SetBillionLaughsAttackProtectionActivationThreshold</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href="#miscellaneous">Miscellaneous Functions</a>
|
||||
<ul>
|
||||
<li><a href="#XML_SetUserData">XML_SetUserData</a></li>
|
||||
@ -900,7 +936,8 @@ whether the parse can be resumed in the future.</p>
|
||||
|
||||
<h3><a name="creation">Parser Creation</a></h3>
|
||||
|
||||
<pre class="fcndec" id="XML_ParserCreate">
|
||||
<h4 id="XML_ParserCreate">XML_ParserCreate</h4>
|
||||
<pre class="fcndec">
|
||||
XML_Parser XMLCALL
|
||||
XML_ParserCreate(const XML_Char *encoding);
|
||||
</pre>
|
||||
@ -917,7 +954,8 @@ encoding declaration. There are four built-in encodings:
|
||||
Any other value will invoke a call to the UnknownEncodingHandler.
|
||||
</div>
|
||||
|
||||
<pre class="fcndec" id="XML_ParserCreateNS">
|
||||
<h4 id="XML_ParserCreateNS">XML_ParserCreateNS</h4>
|
||||
<pre class="fcndec">
|
||||
XML_Parser XMLCALL
|
||||
XML_ParserCreateNS(const XML_Char *encoding,
|
||||
XML_Char sep);
|
||||
@ -936,7 +974,8 @@ the local part will be concatenated without any separator - this is intended
|
||||
to support RDF processors. It is a programming error to use the null separator
|
||||
with <a href= "#XML_SetReturnNSTriplet">namespace triplets</a>.</div>
|
||||
|
||||
<pre class="fcndec" id="XML_ParserCreate_MM">
|
||||
<h4 id="XML_ParserCreate_MM">XML_ParserCreate_MM</h4>
|
||||
<pre class="fcndec">
|
||||
XML_Parser XMLCALL
|
||||
XML_ParserCreate_MM(const XML_Char *encoding,
|
||||
const XML_Memory_Handling_Suite *ms,
|
||||
@ -958,7 +997,8 @@ 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>
|
||||
|
||||
<pre class="fcndec" id="XML_ExternalEntityParserCreate">
|
||||
<h4 id="XML_ExternalEntityParserCreate">XML_ExternalEntityParserCreate</h4>
|
||||
<pre class="fcndec">
|
||||
XML_Parser XMLCALL
|
||||
XML_ExternalEntityParserCreate(XML_Parser p,
|
||||
const XML_Char *context,
|
||||
@ -974,7 +1014,8 @@ changing functions on this parser (unless you want it to act
|
||||
differently than the parent parser).
|
||||
</div>
|
||||
|
||||
<pre class="fcndec" id="XML_ParserFree">
|
||||
<h4 id="XML_ParserFree">XML_ParserFree</h4>
|
||||
<pre class="fcndec">
|
||||
void XMLCALL
|
||||
XML_ParserFree(XML_Parser p);
|
||||
</pre>
|
||||
@ -983,7 +1024,8 @@ Free memory used by the parser. Your application is responsible for
|
||||
freeing any memory associated with <a href="#userdata">user data</a>.
|
||||
</div>
|
||||
|
||||
<pre class="fcndec" id="XML_ParserReset">
|
||||
<h4 id="XML_ParserReset">XML_ParserReset</h4>
|
||||
<pre class="fcndec">
|
||||
XML_Bool XMLCALL
|
||||
XML_ParserReset(XML_Parser p,
|
||||
const XML_Char *encoding);
|
||||
@ -1014,7 +1056,7 @@ if they apply to the parser created by
|
||||
<code><a href= "#XML_ExternalEntityParserCreate"
|
||||
>XML_ExternalEntityParserCreate</a></code>.</p>
|
||||
|
||||
<p>Note: the <code>len</code> argument passed to these functions
|
||||
<p>Note: The <code>len</code> argument passed to these functions
|
||||
should be considerably less than the maximum value for an integer,
|
||||
as it could create an integer overflow situation if the added
|
||||
lengths of a buffer and the unprocessed portion of the previous buffer
|
||||
@ -1022,7 +1064,8 @@ 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>
|
||||
|
||||
<pre class="fcndec" id="XML_Parse">
|
||||
<h4 id="XML_Parse">XML_Parse</h4>
|
||||
<pre class="fcndec">
|
||||
enum XML_Status XMLCALL
|
||||
XML_Parse(XML_Parser p,
|
||||
const char *s,
|
||||
@ -1049,7 +1092,8 @@ If a parse error occurred, it returns <code>XML_STATUS_ERROR</code>.
|
||||
Otherwise it returns <code>XML_STATUS_OK</code> value.
|
||||
</div>
|
||||
|
||||
<pre class="fcndec" id="XML_ParseBuffer">
|
||||
<h4 id="XML_ParseBuffer">XML_ParseBuffer</h4>
|
||||
<pre class="fcndec">
|
||||
enum XML_Status XMLCALL
|
||||
XML_ParseBuffer(XML_Parser p,
|
||||
int len,
|
||||
@ -1063,7 +1107,8 @@ buffer from Expat with the <code><a href= "#XML_GetBuffer"
|
||||
copying of the input.
|
||||
</div>
|
||||
|
||||
<pre class="fcndec" id="XML_GetBuffer">
|
||||
<h4 id="XML_GetBuffer">XML_GetBuffer</h4>
|
||||
<pre class="fcndec">
|
||||
void * XMLCALL
|
||||
XML_GetBuffer(XML_Parser p,
|
||||
int len);
|
||||
@ -1071,7 +1116,8 @@ XML_GetBuffer(XML_Parser p,
|
||||
<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. This has to be called prior to every call to
|
||||
this buffer. A NULL 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:
|
||||
|
||||
@ -1098,7 +1144,8 @@ for (;;) {
|
||||
</pre>
|
||||
</div>
|
||||
|
||||
<pre class="fcndec" id="XML_StopParser">
|
||||
<h4 id="XML_StopParser">XML_StopParser</h4>
|
||||
<pre class="fcndec">
|
||||
enum XML_Status XMLCALL
|
||||
XML_StopParser(XML_Parser p,
|
||||
XML_Bool resumable);
|
||||
@ -1111,7 +1158,7 @@ XML_StopParser(XML_Parser p,
|
||||
call-back handler, except when aborting (when <code>resumable</code>
|
||||
is <code>XML_FALSE</code>) an already suspended parser. Some
|
||||
call-backs may still follow because they would otherwise get
|
||||
lost, including
|
||||
lost, including</p>
|
||||
<ul>
|
||||
<li> the end element handler for empty elements when stopped in the
|
||||
start element handler,</li>
|
||||
@ -1120,7 +1167,7 @@ lost, including
|
||||
<li> the character data handler when stopped in the character data handler
|
||||
while making multiple call-backs on a contiguous chunk of characters,</li>
|
||||
</ul>
|
||||
and possibly others.</p>
|
||||
<p>and possibly others.</p>
|
||||
|
||||
<p>This can be called from most handlers, including DTD related
|
||||
call-backs, except when parsing an external parameter entity and
|
||||
@ -1166,7 +1213,8 @@ implementation of that handler to call <code><a href=
|
||||
<p>New in Expat 1.95.8.</p>
|
||||
</div>
|
||||
|
||||
<pre class="fcndec" id="XML_ResumeParser">
|
||||
<h4 id="XML_ResumeParser">XML_ResumeParser</h4>
|
||||
<pre class="fcndec">
|
||||
enum XML_Status XMLCALL
|
||||
XML_ResumeParser(XML_Parser p);
|
||||
</pre>
|
||||
@ -1191,7 +1239,8 @@ appropriate moment.</p>
|
||||
<p>New in Expat 1.95.8.</p>
|
||||
</div>
|
||||
|
||||
<pre class="fcndec" id="XML_GetParsingStatus">
|
||||
<h4 id="XML_GetParsingStatus">XML_GetParsingStatus</h4>
|
||||
<pre class="fcndec">
|
||||
void XMLCALL
|
||||
XML_GetParsingStatus(XML_Parser p,
|
||||
XML_ParsingStatus *status);
|
||||
@ -1240,7 +1289,8 @@ Note that you'll receive them in this form independent of the original
|
||||
encoding of the document.</p>
|
||||
|
||||
<div class="handler">
|
||||
<pre class="setter" id="XML_SetStartElementHandler">
|
||||
<h4 id="XML_SetStartElementHandler">XML_SetStartElementHandler</h4>
|
||||
<pre class="setter">
|
||||
void XMLCALL
|
||||
XML_SetStartElementHandler(XML_Parser p,
|
||||
XML_StartElementHandler start);
|
||||
@ -1261,7 +1311,8 @@ by a null pointer.</p>
|
||||
</div>
|
||||
|
||||
<div class="handler">
|
||||
<pre class="setter" id="XML_SetEndElementHandler">
|
||||
<h4 id="XML_SetEndElementHandler">XML_SetEndElementHandler</h4>
|
||||
<pre class="setter">
|
||||
void XMLCALL
|
||||
XML_SetEndElementHandler(XML_Parser p,
|
||||
XML_EndElementHandler);
|
||||
@ -1276,7 +1327,8 @@ generates a call to both start and end handlers.</p>
|
||||
</div>
|
||||
|
||||
<div class="handler">
|
||||
<pre class="setter" id="XML_SetElementHandler">
|
||||
<h4 id="XML_SetElementHandler">XML_SetElementHandler</h4>
|
||||
<pre class="setter">
|
||||
void XMLCALL
|
||||
XML_SetElementHandler(XML_Parser p,
|
||||
XML_StartElementHandler start,
|
||||
@ -1286,7 +1338,8 @@ XML_SetElementHandler(XML_Parser p,
|
||||
</div>
|
||||
|
||||
<div class="handler">
|
||||
<pre class="setter" id="XML_SetCharacterDataHandler">
|
||||
<h4 id="XML_SetCharacterDataHandler">XML_SetCharacterDataHandler</h4>
|
||||
<pre class="setter">
|
||||
void XMLCALL
|
||||
XML_SetCharacterDataHandler(XML_Parser p,
|
||||
XML_CharacterDataHandler charhndl)
|
||||
@ -1298,7 +1351,7 @@ typedef void
|
||||
int len);
|
||||
</pre>
|
||||
<p>Set a text handler. The string your handler receives
|
||||
is <em>NOT nul-terminated</em>. You have to use the length argument
|
||||
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
|
||||
@ -1309,7 +1362,8 @@ will continue calling back until the end of the block is reached.</p>
|
||||
</div>
|
||||
|
||||
<div class="handler">
|
||||
<pre class="setter" id="XML_SetProcessingInstructionHandler">
|
||||
<h4 id="XML_SetProcessingInstructionHandler">XML_SetProcessingInstructionHandler</h4>
|
||||
<pre class="setter">
|
||||
void XMLCALL
|
||||
XML_SetProcessingInstructionHandler(XML_Parser p,
|
||||
XML_ProcessingInstructionHandler proc)
|
||||
@ -1327,7 +1381,8 @@ it after skipping all whitespace after the initial word.</p>
|
||||
</div>
|
||||
|
||||
<div class="handler">
|
||||
<pre class="setter" id="XML_SetCommentHandler">
|
||||
<h4 id="XML_SetCommentHandler">XML_SetCommentHandler</h4>
|
||||
<pre class="setter">
|
||||
void XMLCALL
|
||||
XML_SetCommentHandler(XML_Parser p,
|
||||
XML_CommentHandler cmnt)
|
||||
@ -1342,7 +1397,8 @@ delimiters.</p>
|
||||
</div>
|
||||
|
||||
<div class="handler">
|
||||
<pre class="setter" id="XML_SetStartCdataSectionHandler">
|
||||
<h4 id="XML_SetStartCdataSectionHandler">XML_SetStartCdataSectionHandler</h4>
|
||||
<pre class="setter">
|
||||
void XMLCALL
|
||||
XML_SetStartCdataSectionHandler(XML_Parser p,
|
||||
XML_StartCdataSectionHandler start);
|
||||
@ -1355,7 +1411,8 @@ typedef void
|
||||
</div>
|
||||
|
||||
<div class="handler">
|
||||
<pre class="setter" id="XML_SetEndCdataSectionHandler">
|
||||
<h4 id="XML_SetEndCdataSectionHandler">XML_SetEndCdataSectionHandler</h4>
|
||||
<pre class="setter">
|
||||
void XMLCALL
|
||||
XML_SetEndCdataSectionHandler(XML_Parser p,
|
||||
XML_EndCdataSectionHandler end);
|
||||
@ -1368,7 +1425,8 @@ typedef void
|
||||
</div>
|
||||
|
||||
<div class="handler">
|
||||
<pre class="setter" id="XML_SetCdataSectionHandler">
|
||||
<h4 id="XML_SetCdataSectionHandler">XML_SetCdataSectionHandler</h4>
|
||||
<pre class="setter">
|
||||
void XMLCALL
|
||||
XML_SetCdataSectionHandler(XML_Parser p,
|
||||
XML_StartCdataSectionHandler start,
|
||||
@ -1378,7 +1436,8 @@ XML_SetCdataSectionHandler(XML_Parser p,
|
||||
</div>
|
||||
|
||||
<div class="handler">
|
||||
<pre class="setter" id="XML_SetDefaultHandler">
|
||||
<h4 id="XML_SetDefaultHandler">XML_SetDefaultHandler</h4>
|
||||
<pre class="setter">
|
||||
void XMLCALL
|
||||
XML_SetDefaultHandler(XML_Parser p,
|
||||
XML_DefaultHandler hndl)
|
||||
@ -1409,7 +1468,8 @@ href="#XML_DefaultCurrent">XML_DefaultCurrent</a></code>.</p>
|
||||
</div>
|
||||
|
||||
<div class="handler">
|
||||
<pre class="setter" id="XML_SetDefaultHandlerExpand">
|
||||
<h4 id="XML_SetDefaultHandlerExpand">XML_SetDefaultHandlerExpand</h4>
|
||||
<pre class="setter">
|
||||
void XMLCALL
|
||||
XML_SetDefaultHandlerExpand(XML_Parser p,
|
||||
XML_DefaultHandler hndl)
|
||||
@ -1429,7 +1489,8 @@ href="#XML_DefaultCurrent">XML_DefaultCurrent</a></code>.</p>
|
||||
</div>
|
||||
|
||||
<div class="handler">
|
||||
<pre class="setter" id="XML_SetExternalEntityRefHandler">
|
||||
<h4 id="XML_SetExternalEntityRefHandler">XML_SetExternalEntityRefHandler</h4>
|
||||
<pre class="setter">
|
||||
void XMLCALL
|
||||
XML_SetExternalEntityRefHandler(XML_Parser p,
|
||||
XML_ExternalEntityRefHandler hndl)
|
||||
@ -1482,7 +1543,8 @@ parser, the body of the external entity can be recursively parsed.</p>
|
||||
information into global or static variables.</p>
|
||||
</div>
|
||||
|
||||
<pre class="fcndec" id="XML_SetExternalEntityRefHandlerArg">
|
||||
<h4 id="XML_SetExternalEntityRefHandlerArg">XML_SetExternalEntityRefHandlerArg</h4>
|
||||
<pre class="fcndec">
|
||||
void XMLCALL
|
||||
XML_SetExternalEntityRefHandlerArg(XML_Parser p,
|
||||
void *arg)
|
||||
@ -1508,7 +1570,8 @@ properly.</p>
|
||||
</div>
|
||||
|
||||
<div class="handler">
|
||||
<pre class="setter" id="XML_SetSkippedEntityHandler">
|
||||
<h4 id="XML_SetSkippedEntityHandler">XML_SetSkippedEntityHandler</h4>
|
||||
<pre class="setter">
|
||||
void XMLCALL
|
||||
XML_SetSkippedEntityHandler(XML_Parser p,
|
||||
XML_SkippedEntityHandler handler)
|
||||
@ -1528,14 +1591,15 @@ typedef void
|
||||
has been called.</li>
|
||||
</ol>
|
||||
<p>The <code>is_parameter_entity</code> argument will be non-zero for
|
||||
a parameter entity and zero for a general entity.</p> <p>Note: skipped
|
||||
a parameter entity and zero for a general entity.</p> <p>Note: Skipped
|
||||
parameter entities in declarations and skipped general entities in
|
||||
attribute values cannot be reported, because the event would be out of
|
||||
sync with the reporting of the declarations or attribute values</p>
|
||||
</div>
|
||||
|
||||
<div class="handler">
|
||||
<pre class="setter" id="XML_SetUnknownEncodingHandler">
|
||||
<h4 id="XML_SetUnknownEncodingHandler">XML_SetUnknownEncodingHandler</h4>
|
||||
<pre class="setter">
|
||||
void XMLCALL
|
||||
XML_SetUnknownEncodingHandler(XML_Parser p,
|
||||
XML_UnknownEncodingHandler enchandler,
|
||||
@ -1576,7 +1640,7 @@ 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
|
||||
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> nul-terminated and points at the sequence of
|
||||
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
|
||||
@ -1584,7 +1648,8 @@ parser when it is finished with the encoding. It may be NULL.</p>
|
||||
</div>
|
||||
|
||||
<div class="handler">
|
||||
<pre class="setter" id="XML_SetStartNamespaceDeclHandler">
|
||||
<h4 id="XML_SetStartNamespaceDeclHandler">XML_SetStartNamespaceDeclHandler</h4>
|
||||
<pre class="setter">
|
||||
void XMLCALL
|
||||
XML_SetStartNamespaceDeclHandler(XML_Parser p,
|
||||
XML_StartNamespaceDeclHandler start);
|
||||
@ -1602,7 +1667,8 @@ in that start tag.</p>
|
||||
</div>
|
||||
|
||||
<div class="handler">
|
||||
<pre class="setter" id="XML_SetEndNamespaceDeclHandler">
|
||||
<h4 id="XML_SetEndNamespaceDeclHandler">XML_SetEndNamespaceDeclHandler</h4>
|
||||
<pre class="setter">
|
||||
void XMLCALL
|
||||
XML_SetEndNamespaceDeclHandler(XML_Parser p,
|
||||
XML_EndNamespaceDeclHandler end);
|
||||
@ -1619,7 +1685,8 @@ namespace was declared.</p>
|
||||
</div>
|
||||
|
||||
<div class="handler">
|
||||
<pre class="setter" id="XML_SetNamespaceDeclHandler">
|
||||
<h4 id="XML_SetNamespaceDeclHandler">XML_SetNamespaceDeclHandler</h4>
|
||||
<pre class="setter">
|
||||
void XMLCALL
|
||||
XML_SetNamespaceDeclHandler(XML_Parser p,
|
||||
XML_StartNamespaceDeclHandler start,
|
||||
@ -1629,7 +1696,8 @@ XML_SetNamespaceDeclHandler(XML_Parser p,
|
||||
</div>
|
||||
|
||||
<div class="handler">
|
||||
<pre class="setter" id="XML_SetXmlDeclHandler">
|
||||
<h4 id="XML_SetXmlDeclHandler">XML_SetXmlDeclHandler</h4>
|
||||
<pre class="setter">
|
||||
void XMLCALL
|
||||
XML_SetXmlDeclHandler(XML_Parser p,
|
||||
XML_XmlDeclHandler xmldecl);
|
||||
@ -1652,7 +1720,8 @@ that it was given as yes.</p>
|
||||
</div>
|
||||
|
||||
<div class="handler">
|
||||
<pre class="setter" id="XML_SetStartDoctypeDeclHandler">
|
||||
<h4 id="XML_SetStartDoctypeDeclHandler">XML_SetStartDoctypeDeclHandler</h4>
|
||||
<pre class="setter">
|
||||
void XMLCALL
|
||||
XML_SetStartDoctypeDeclHandler(XML_Parser p,
|
||||
XML_StartDoctypeDeclHandler start);
|
||||
@ -1672,7 +1741,8 @@ will be non-zero if the DOCTYPE declaration has an internal subset.</p>
|
||||
</div>
|
||||
|
||||
<div class="handler">
|
||||
<pre class="setter" id="XML_SetEndDoctypeDeclHandler">
|
||||
<h4 id="XML_SetEndDoctypeDeclHandler">XML_SetEndDoctypeDeclHandler</h4>
|
||||
<pre class="setter">
|
||||
void XMLCALL
|
||||
XML_SetEndDoctypeDeclHandler(XML_Parser p,
|
||||
XML_EndDoctypeDeclHandler end);
|
||||
@ -1686,7 +1756,8 @@ after parsing any external subset.</p>
|
||||
</div>
|
||||
|
||||
<div class="handler">
|
||||
<pre class="setter" id="XML_SetDoctypeDeclHandler">
|
||||
<h4 id="XML_SetDoctypeDeclHandler">XML_SetDoctypeDeclHandler</h4>
|
||||
<pre class="setter">
|
||||
void XMLCALL
|
||||
XML_SetDoctypeDeclHandler(XML_Parser p,
|
||||
XML_StartDoctypeDeclHandler start,
|
||||
@ -1696,7 +1767,8 @@ XML_SetDoctypeDeclHandler(XML_Parser p,
|
||||
</div>
|
||||
|
||||
<div class="handler">
|
||||
<pre class="setter" id="XML_SetElementDeclHandler">
|
||||
<h4 id="XML_SetElementDeclHandler">XML_SetElementDeclHandler</h4>
|
||||
<pre class="setter">
|
||||
void XMLCALL
|
||||
XML_SetElementDeclHandler(XML_Parser p,
|
||||
XML_ElementDeclHandler eldecl);
|
||||
@ -1768,7 +1840,8 @@ or sequence and <code>children</code> points to the nodes.</p>
|
||||
</div>
|
||||
|
||||
<div class="handler">
|
||||
<pre class="setter" id="XML_SetAttlistDeclHandler">
|
||||
<h4 id="XML_SetAttlistDeclHandler">XML_SetAttlistDeclHandler</h4>
|
||||
<pre class="setter">
|
||||
void XMLCALL
|
||||
XML_SetAttlistDeclHandler(XML_Parser p,
|
||||
XML_AttlistDeclHandler attdecl);
|
||||
@ -1801,7 +1874,8 @@ in the <code>dflt</code> parameter.</p>
|
||||
</div>
|
||||
|
||||
<div class="handler">
|
||||
<pre class="setter" id="XML_SetEntityDeclHandler">
|
||||
<h4 id="XML_SetEntityDeclHandler">XML_SetEntityDeclHandler</h4>
|
||||
<pre class="setter">
|
||||
void XMLCALL
|
||||
XML_SetEntityDeclHandler(XML_Parser p,
|
||||
XML_EntityDeclHandler handler);
|
||||
@ -1835,7 +1909,8 @@ declarations.</p>
|
||||
</div>
|
||||
|
||||
<div class="handler">
|
||||
<pre class="setter" id="XML_SetUnparsedEntityDeclHandler">
|
||||
<h4 id="XML_SetUnparsedEntityDeclHandler">XML_SetUnparsedEntityDeclHandler</h4>
|
||||
<pre class="setter">
|
||||
void XMLCALL
|
||||
XML_SetUnparsedEntityDeclHandler(XML_Parser p,
|
||||
XML_UnparsedEntityDeclHandler h)
|
||||
@ -1861,7 +1936,8 @@ compatibility. Use instead <a href= "#XML_SetEntityDeclHandler"
|
||||
</div>
|
||||
|
||||
<div class="handler">
|
||||
<pre class="setter" id="XML_SetNotationDeclHandler">
|
||||
<h4 id="XML_SetNotationDeclHandler">XML_SetNotationDeclHandler</h4>
|
||||
<pre class="setter">
|
||||
void XMLCALL
|
||||
XML_SetNotationDeclHandler(XML_Parser p,
|
||||
XML_NotationDeclHandler h)
|
||||
@ -1878,7 +1954,8 @@ typedef void
|
||||
</div>
|
||||
|
||||
<div class="handler">
|
||||
<pre class="setter" id="XML_SetNotStandaloneHandler">
|
||||
<h4 id="XML_SetNotStandaloneHandler">XML_SetNotStandaloneHandler</h4>
|
||||
<pre class="setter">
|
||||
void XMLCALL
|
||||
XML_SetNotStandaloneHandler(XML_Parser p,
|
||||
XML_NotStandaloneHandler h)
|
||||
@ -1904,7 +1981,7 @@ of errors. The position reported is the byte position (in the original
|
||||
document or entity encoding) of the first of the sequence of
|
||||
characters that generated the current event (or the error that caused
|
||||
the parse functions to return <code>XML_STATUS_ERROR</code>.) The
|
||||
exceptions are callbacks trigged by declarations in the document
|
||||
exceptions are callbacks triggered by declarations in the document
|
||||
prologue, in which case they exact position reported is somewhere in the
|
||||
relevant markup, but not necessarily as meaningful as for other
|
||||
events.</p>
|
||||
@ -1913,7 +1990,8 @@ events.</p>
|
||||
DTD. In other words, they usually return bogus information when
|
||||
called from within a DTD declaration handler.</p>
|
||||
|
||||
<pre class="fcndec" id="XML_GetErrorCode">
|
||||
<h4 id="XML_GetErrorCode">XML_GetErrorCode</h4>
|
||||
<pre class="fcndec">
|
||||
enum XML_Error XMLCALL
|
||||
XML_GetErrorCode(XML_Parser p);
|
||||
</pre>
|
||||
@ -1921,7 +1999,8 @@ XML_GetErrorCode(XML_Parser p);
|
||||
Return what type of error has occurred.
|
||||
</div>
|
||||
|
||||
<pre class="fcndec" id="XML_ErrorString">
|
||||
<h4 id="XML_ErrorString">XML_ErrorString</h4>
|
||||
<pre class="fcndec">
|
||||
const XML_LChar * XMLCALL
|
||||
XML_ErrorString(enum XML_Error code);
|
||||
</pre>
|
||||
@ -1931,7 +2010,8 @@ The code should be one of the enums that can be returned from
|
||||
<code><a href= "#XML_GetErrorCode" >XML_GetErrorCode</a></code>.
|
||||
</div>
|
||||
|
||||
<pre class="fcndec" id="XML_GetCurrentByteIndex">
|
||||
<h4 id="XML_GetCurrentByteIndex">XML_GetCurrentByteIndex</h4>
|
||||
<pre class="fcndec">
|
||||
XML_Index XMLCALL
|
||||
XML_GetCurrentByteIndex(XML_Parser p);
|
||||
</pre>
|
||||
@ -1942,7 +2022,8 @@ the values returned by <code><a href= "#XML_GetCurrentLineNumber"
|
||||
"#XML_GetCurrentColumnNumber" >XML_GetCurrentColumnNumber</a></code>.
|
||||
</div>
|
||||
|
||||
<pre class="fcndec" id="XML_GetCurrentLineNumber">
|
||||
<h4 id="XML_GetCurrentLineNumber">XML_GetCurrentLineNumber</h4>
|
||||
<pre class="fcndec">
|
||||
XML_Size XMLCALL
|
||||
XML_GetCurrentLineNumber(XML_Parser p);
|
||||
</pre>
|
||||
@ -1951,7 +2032,8 @@ Return the line number of the position. The first line is reported as
|
||||
<code>1</code>.
|
||||
</div>
|
||||
|
||||
<pre class="fcndec" id="XML_GetCurrentColumnNumber">
|
||||
<h4 id="XML_GetCurrentColumnNumber">XML_GetCurrentColumnNumber</h4>
|
||||
<pre class="fcndec">
|
||||
XML_Size XMLCALL
|
||||
XML_GetCurrentColumnNumber(XML_Parser p);
|
||||
</pre>
|
||||
@ -1960,7 +2042,8 @@ Return the offset, from the beginning of the current line, of
|
||||
the position.
|
||||
</div>
|
||||
|
||||
<pre class="fcndec" id="XML_GetCurrentByteCount">
|
||||
<h4 id="XML_GetCurrentByteCount">XML_GetCurrentByteCount</h4>
|
||||
<pre class="fcndec">
|
||||
int XMLCALL
|
||||
XML_GetCurrentByteCount(XML_Parser p);
|
||||
</pre>
|
||||
@ -1972,7 +2055,8 @@ be used to distinguish empty-element tags from empty elements using
|
||||
separate start and end tags).
|
||||
</div>
|
||||
|
||||
<pre class="fcndec" id="XML_GetInputContext">
|
||||
<h4 id="XML_GetInputContext">XML_GetInputContext</h4>
|
||||
<pre class="fcndec">
|
||||
const char * XMLCALL
|
||||
XML_GetInputContext(XML_Parser p,
|
||||
int *offset,
|
||||
@ -1998,12 +2082,105 @@ parse position may be before the beginning of the buffer.</p>
|
||||
return NULL.</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>
|
||||
|
||||
<h4 id="XML_SetBillionLaughsAttackProtectionMaximumAmplification">XML_SetBillionLaughsAttackProtectionMaximumAmplification</h4>
|
||||
<pre class="fcndec">
|
||||
/* Added in Expat 2.4.0. */
|
||||
XML_Bool XMLCALL
|
||||
XML_SetBillionLaughsAttackProtectionMaximumAmplification(XML_Parser p,
|
||||
float maximumAmplificationFactor);
|
||||
</pre>
|
||||
<div class="fcndef">
|
||||
<p>
|
||||
Sets the maximum tolerated amplification factor
|
||||
for protection against
|
||||
<a href="https://en.wikipedia.org/wiki/Billion_laughs_attack">billion laughs attacks</a>
|
||||
(default: <code>100.0</code>)
|
||||
of parser <code>p</code> to <code>maximumAmplificationFactor</code>, and
|
||||
returns <code>XML_TRUE</code> upon success and <code>XML_FALSE</code> upon error.
|
||||
</p>
|
||||
|
||||
The amplification factor is calculated as ..
|
||||
<pre>
|
||||
amplification := (direct + indirect) / direct
|
||||
</pre>
|
||||
.. while parsing, whereas
|
||||
<code>direct</code> is the number of bytes read from the primary document in parsing and
|
||||
<code>indirect</code> is the number of bytes added by expanding entities and reading of external DTD files, combined.
|
||||
|
||||
<p>For a call to <code>XML_SetBillionLaughsAttackProtectionMaximumAmplification</code> to succeed:</p>
|
||||
<ul>
|
||||
<li>parser <code>p</code> must be a non-<code>NULL</code> root parser (without any parent parsers) and</li>
|
||||
<li><code>maximumAmplificationFactor</code> must be non-<code>NaN</code> and greater than or equal to <code>1.0</code>.</li>
|
||||
</ul>
|
||||
|
||||
<p>
|
||||
<strong>Note:</strong>
|
||||
If you ever need to increase this value for non-attack payload,
|
||||
please <a href="https://github.com/libexpat/libexpat/issues">file a bug report</a>.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<strong>Note:</strong>
|
||||
Peak amplifications
|
||||
of factor 15,000 for the entire payload and
|
||||
of factor 30,000 in the middle of parsing
|
||||
have been observed with small benign files in practice.
|
||||
|
||||
So if you do reduce the maximum allowed amplification,
|
||||
please make sure that the activation threshold is still big enough
|
||||
to not end up with undesired false positives (i.e. benign files being rejected).
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<h4 id="XML_SetBillionLaughsAttackProtectionActivationThreshold">XML_SetBillionLaughsAttackProtectionActivationThreshold</h4>
|
||||
<pre class="fcndec">
|
||||
/* Added in Expat 2.4.0. */
|
||||
XML_Bool XMLCALL
|
||||
XML_SetBillionLaughsAttackProtectionActivationThreshold(XML_Parser p,
|
||||
unsigned long long activationThresholdBytes);
|
||||
</pre>
|
||||
<div class="fcndef">
|
||||
<p>
|
||||
Sets number of output bytes (including amplification from entity expansion and reading DTD files)
|
||||
needed to activate protection against
|
||||
<a href="https://en.wikipedia.org/wiki/Billion_laughs_attack">billion laughs attacks</a>
|
||||
(default: <code>8 MiB</code>)
|
||||
of parser <code>p</code> to <code>activationThresholdBytes</code>, and
|
||||
returns <code>XML_TRUE</code> upon success and <code>XML_FALSE</code> upon error.
|
||||
</p>
|
||||
|
||||
<p>For a call to <code>XML_SetBillionLaughsAttackProtectionActivationThreshold</code> to succeed:</p>
|
||||
<ul>
|
||||
<li>parser <code>p</code> must be a non-<code>NULL</code> root parser (without any parent parsers).</li>
|
||||
</ul>
|
||||
|
||||
<p>
|
||||
<strong>Note:</strong>
|
||||
If you ever need to increase this value for non-attack payload,
|
||||
please <a href="https://github.com/libexpat/libexpat/issues">file a bug report</a>.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<strong>Note:</strong>
|
||||
Activation thresholds below 4 MiB are known to break support for
|
||||
<a href="https://en.wikipedia.org/wiki/Darwin_Information_Typing_Architecture">DITA</a> 1.3 payload
|
||||
and are hence not recommended.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<h3><a name="miscellaneous">Miscellaneous functions</a></h3>
|
||||
|
||||
<p>The functions in this section either obtain state information from
|
||||
the parser or can be used to dynamically set parser options.</p>
|
||||
|
||||
<pre class="fcndec" id="XML_SetUserData">
|
||||
<h4 id="XML_SetUserData">XML_SetUserData</h4>
|
||||
<pre class="fcndec">
|
||||
void XMLCALL
|
||||
XML_SetUserData(XML_Parser p,
|
||||
void *userData);
|
||||
@ -2018,7 +2195,8 @@ the memory associated with it, then you've probably just leaked
|
||||
memory.
|
||||
</div>
|
||||
|
||||
<pre class="fcndec" id="XML_GetUserData">
|
||||
<h4 id="XML_GetUserData">XML_GetUserData</h4>
|
||||
<pre class="fcndec">
|
||||
void * XMLCALL
|
||||
XML_GetUserData(XML_Parser p);
|
||||
</pre>
|
||||
@ -2027,7 +2205,8 @@ This returns the user data pointer that gets passed to handlers.
|
||||
It is actually implemented as a macro.
|
||||
</div>
|
||||
|
||||
<pre class="fcndec" id="XML_UseParserAsHandlerArg">
|
||||
<h4 id="XML_UseParserAsHandlerArg">XML_UseParserAsHandlerArg</h4>
|
||||
<pre class="fcndec">
|
||||
void XMLCALL
|
||||
XML_UseParserAsHandlerArg(XML_Parser p);
|
||||
</pre>
|
||||
@ -2038,7 +2217,8 @@ using the <code><a href= "#XML_GetUserData"
|
||||
>XML_GetUserData</a></code> function.
|
||||
</div>
|
||||
|
||||
<pre class="fcndec" id="XML_SetBase">
|
||||
<h4 id="XML_SetBase">XML_SetBase</h4>
|
||||
<pre class="fcndec">
|
||||
enum XML_Status XMLCALL
|
||||
XML_SetBase(XML_Parser p,
|
||||
const XML_Char *base);
|
||||
@ -2050,7 +2230,8 @@ there's no memory to store base, otherwise it's
|
||||
<code>XML_STATUS_OK</code>.
|
||||
</div>
|
||||
|
||||
<pre class="fcndec" id="XML_GetBase">
|
||||
<h4 id="XML_GetBase">XML_GetBase</h4>
|
||||
<pre class="fcndec">
|
||||
const XML_Char * XMLCALL
|
||||
XML_GetBase(XML_Parser p);
|
||||
</pre>
|
||||
@ -2058,7 +2239,8 @@ XML_GetBase(XML_Parser p);
|
||||
Return the base for resolving relative URIs.
|
||||
</div>
|
||||
|
||||
<pre class="fcndec" id="XML_GetSpecifiedAttributeCount">
|
||||
<h4 id="XML_GetSpecifiedAttributeCount">XML_GetSpecifiedAttributeCount</h4>
|
||||
<pre class="fcndec">
|
||||
int XMLCALL
|
||||
XML_GetSpecifiedAttributeCount(XML_Parser p);
|
||||
</pre>
|
||||
@ -2074,7 +2256,8 @@ call to a start handler. If called inside a start handler, then that
|
||||
means the current call.
|
||||
</div>
|
||||
|
||||
<pre class="fcndec" id="XML_GetIdAttributeIndex">
|
||||
<h4 id="XML_GetIdAttributeIndex">XML_GetIdAttributeIndex</h4>
|
||||
<pre class="fcndec">
|
||||
int XMLCALL
|
||||
XML_GetIdAttributeIndex(XML_Parser p);
|
||||
</pre>
|
||||
@ -2086,7 +2269,8 @@ attribute. If called inside a start handler, then that means the
|
||||
current call.
|
||||
</div>
|
||||
|
||||
<pre class="fcndec" id="XML_GetAttributeInfo">
|
||||
<h4 id="XML_GetAttributeInfo">XML_GetAttributeInfo</h4>
|
||||
<pre class="fcndec">
|
||||
const XML_AttrInfo * XMLCALL
|
||||
XML_GetAttributeInfo(XML_Parser parser);
|
||||
</pre>
|
||||
@ -2107,7 +2291,8 @@ as 1; thus the number of entries in the array is
|
||||
<code>XML_GetSpecifiedAttributeCount(parser) / 2</code>.
|
||||
</div>
|
||||
|
||||
<pre class="fcndec" id="XML_SetEncoding">
|
||||
<h4 id="XML_SetEncoding">XML_SetEncoding</h4>
|
||||
<pre class="fcndec">
|
||||
enum XML_Status XMLCALL
|
||||
XML_SetEncoding(XML_Parser p,
|
||||
const XML_Char *encoding);
|
||||
@ -2122,7 +2307,8 @@ Returns <code>XML_STATUS_OK</code> on success or
|
||||
<code>XML_STATUS_ERROR</code> on error.
|
||||
</div>
|
||||
|
||||
<pre class="fcndec" id="XML_SetParamEntityParsing">
|
||||
<h4 id="XML_SetParamEntityParsing">XML_SetParamEntityParsing</h4>
|
||||
<pre class="fcndec">
|
||||
int XMLCALL
|
||||
XML_SetParamEntityParsing(XML_Parser p,
|
||||
enum XML_ParamEntityParsing code);
|
||||
@ -2142,7 +2328,8 @@ The choices for <code>code</code> are:
|
||||
no effect and will always return 0.
|
||||
</div>
|
||||
|
||||
<pre class="fcndec" id="XML_SetHashSalt">
|
||||
<h4 id="XML_SetHashSalt">XML_SetHashSalt</h4>
|
||||
<pre class="fcndec">
|
||||
int XMLCALL
|
||||
XML_SetHashSalt(XML_Parser p,
|
||||
unsigned long hash_salt);
|
||||
@ -2153,15 +2340,16 @@ Helps in preventing DoS attacks based on predicting hash
|
||||
function behavior. In order to have an effect this must be called
|
||||
before parsing has started. Returns 1 if successful, 0 when called
|
||||
after <code>XML_Parse</code> or <code>XML_ParseBuffer</code>.
|
||||
<p><b>Note:</b>This call is optional, as the parser will auto-generate
|
||||
<p><b>Note:</b> This call is optional, as the parser will auto-generate
|
||||
a new random salt value if no value has been set at the start of parsing.</p>
|
||||
<p><b>Note:</b>One should not call <code>XML_SetHashSalt</code> with a
|
||||
<p><b>Note:</b> One should not call <code>XML_SetHashSalt</code> with a
|
||||
hash salt value of 0, as this value is used as sentinel value to indicate
|
||||
that <code>XML_SetHashSalt</code> has <b>not</b> been called. Consequently
|
||||
such a call will have no effect, even if it returns 1.</p>
|
||||
</div>
|
||||
|
||||
<pre class="fcndec" id="XML_UseForeignDTD">
|
||||
<h4 id="XML_UseForeignDTD">XML_UseForeignDTD</h4>
|
||||
<pre class="fcndec">
|
||||
enum XML_Error XMLCALL
|
||||
XML_UseForeignDTD(XML_Parser parser, XML_Bool useDTD);
|
||||
</pre>
|
||||
@ -2198,7 +2386,8 @@ the document had a DTD with an external subset. This holds true even if
|
||||
the external entity reference handler returns without action.</p>
|
||||
</div>
|
||||
|
||||
<pre class="fcndec" id="XML_SetReturnNSTriplet">
|
||||
<h4 id="XML_SetReturnNSTriplet">XML_SetReturnNSTriplet</h4>
|
||||
<pre class="fcndec">
|
||||
void XMLCALL
|
||||
XML_SetReturnNSTriplet(XML_Parser parser,
|
||||
int do_nst);
|
||||
@ -2220,7 +2409,8 @@ default manner, URI then local_name separated by the namespace
|
||||
separator.</p>
|
||||
</div>
|
||||
|
||||
<pre class="fcndec" id="XML_DefaultCurrent">
|
||||
<h4 id="XML_DefaultCurrent">XML_DefaultCurrent</h4>
|
||||
<pre class="fcndec">
|
||||
void XMLCALL
|
||||
XML_DefaultCurrent(XML_Parser parser);
|
||||
</pre>
|
||||
@ -2234,7 +2424,8 @@ href="#XML_SetDefaultHandler" >XML_SetDefaultHandler</a></code> or
|
||||
not a default handler.
|
||||
</div>
|
||||
|
||||
<pre class="fcndec" id="XML_ExpatVersion">
|
||||
<h4 id="XML_ExpatVersion">XML_ExpatVersion</h4>
|
||||
<pre class="fcndec">
|
||||
XML_LChar * XMLCALL
|
||||
XML_ExpatVersion();
|
||||
</pre>
|
||||
@ -2242,7 +2433,8 @@ XML_ExpatVersion();
|
||||
Return the library version as a string (e.g. <code>"expat_1.95.1"</code>).
|
||||
</div>
|
||||
|
||||
<pre class="fcndec" id="XML_ExpatVersionInfo">
|
||||
<h4 id="XML_ExpatVersionInfo">XML_ExpatVersionInfo</h4>
|
||||
<pre class="fcndec">
|
||||
struct XML_Expat_Version XMLCALL
|
||||
XML_ExpatVersionInfo();
|
||||
</pre>
|
||||
@ -2266,7 +2458,8 @@ Testing these constants is currently the best way to determine if
|
||||
particular parts of the Expat API are available.
|
||||
</div>
|
||||
|
||||
<pre class="fcndec" id="XML_GetFeatureList">
|
||||
<h4 id="XML_GetFeatureList">XML_GetFeatureList</h4>
|
||||
<pre class="fcndec">
|
||||
const XML_Feature * XMLCALL
|
||||
XML_GetFeatureList();
|
||||
</pre>
|
||||
@ -2327,7 +2520,8 @@ time, the following features have been defined to have values:</p>
|
||||
</dl>
|
||||
</div>
|
||||
|
||||
<pre class="fcndec" id="XML_FreeContentModel">
|
||||
<h4 id="XML_FreeContentModel">XML_FreeContentModel</h4>
|
||||
<pre class="fcndec">
|
||||
void XMLCALL
|
||||
XML_FreeContentModel(XML_Parser parser, XML_Content *model);
|
||||
</pre>
|
||||
@ -2346,7 +2540,8 @@ applications. This can be essential when using dynamically loaded
|
||||
libraries which use different C standard libraries (this can happen on
|
||||
Windows, at least).</p>
|
||||
|
||||
<pre class="fcndec" id="XML_MemMalloc">
|
||||
<h4 id="XML_MemMalloc">XML_MemMalloc</h4>
|
||||
<pre class="fcndec">
|
||||
void * XMLCALL
|
||||
XML_MemMalloc(XML_Parser parser, size_t size);
|
||||
</pre>
|
||||
@ -2358,7 +2553,8 @@ way must be freed using <code><a href="#XML_MemFree"
|
||||
>XML_MemFree</a></code>.
|
||||
</div>
|
||||
|
||||
<pre class="fcndec" id="XML_MemRealloc">
|
||||
<h4 id="XML_MemRealloc">XML_MemRealloc</h4>
|
||||
<pre class="fcndec">
|
||||
void * XMLCALL
|
||||
XML_MemRealloc(XML_Parser parser, void *ptr, size_t size);
|
||||
</pre>
|
||||
@ -2377,7 +2573,8 @@ original block. Memory allocated in this way must be freed using
|
||||
>XML_MemFree</a></code>.
|
||||
</div>
|
||||
|
||||
<pre class="fcndec" id="XML_MemFree">
|
||||
<h4 id="XML_MemFree">XML_MemFree</h4>
|
||||
<pre class="fcndec">
|
||||
void XMLCALL
|
||||
XML_MemFree(XML_Parser parser, void *ptr);
|
||||
</pre>
|
||||
@ -2388,9 +2585,12 @@ have been allocated by <code><a href="#XML_MemMalloc"
|
||||
</div>
|
||||
|
||||
<hr />
|
||||
<p><a href="http://validator.w3.org/check/referer"><img
|
||||
src="valid-xhtml10.png" alt="Valid XHTML 1.0!"
|
||||
height="31" width="88" class="noborder" /></a></p>
|
||||
|
||||
<div class="footer">
|
||||
Found a bug in the documentation?
|
||||
<a href="https://github.com/libexpat/libexpat/issues">Please file a bug report.</a>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
134
doc/style.css
134
doc/style.css
@ -1,101 +1,47 @@
|
||||
/*
|
||||
__ __ _
|
||||
___\ \/ /_ __ __ _| |_
|
||||
/ _ \\ /| '_ \ / _` | __|
|
||||
| __// \| |_) | (_| | |_
|
||||
\___/_/\_\ .__/ \__,_|\__|
|
||||
|_| XML parser
|
||||
|
||||
Copyright (c) 2000 Clark Cooper <coopercc@users.sourceforge.net>
|
||||
Copyright (c) 2000-2004 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
|
||||
Copyright (c) 2021 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.
|
||||
*/
|
||||
|
||||
/* Stop not using half the screen */
|
||||
body {
|
||||
background-color: white;
|
||||
border: 0px;
|
||||
margin: 0px;
|
||||
padding: 0px;
|
||||
}
|
||||
|
||||
.corner {
|
||||
width: 200px;
|
||||
height: 80px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.banner {
|
||||
background-color: rgb(110,139,61);
|
||||
color: rgb(255,236,176);
|
||||
padding-left: 2em;
|
||||
}
|
||||
|
||||
.banner h1 {
|
||||
font-size: 200%;
|
||||
}
|
||||
|
||||
.content {
|
||||
padding: 0em 2em 1em 2em;
|
||||
}
|
||||
|
||||
.releaseno {
|
||||
background-color: rgb(110,139,61);
|
||||
color: rgb(255,236,176);
|
||||
padding-bottom: 0.3em;
|
||||
padding-top: 0.5em;
|
||||
text-align: center;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.noborder {
|
||||
border-width: 0px;
|
||||
}
|
||||
|
||||
.eg {
|
||||
padding-left: 1em;
|
||||
padding-top: .5em;
|
||||
padding-bottom: .5em;
|
||||
border: solid thin;
|
||||
margin: 1em 0;
|
||||
background-color: tan;
|
||||
margin-left: 2em;
|
||||
margin-right: 10%;
|
||||
}
|
||||
|
||||
.pseudocode {
|
||||
padding-left: 1em;
|
||||
padding-top: .5em;
|
||||
padding-bottom: .5em;
|
||||
border: solid thin;
|
||||
margin: 1em 0;
|
||||
background-color: rgb(250,220,180);
|
||||
margin-left: 2em;
|
||||
margin-right: 10%;
|
||||
}
|
||||
|
||||
.handler {
|
||||
width: 100%;
|
||||
border-top-width: thin;
|
||||
margin-bottom: 1em;
|
||||
}
|
||||
|
||||
.handler p {
|
||||
margin-left: 2em;
|
||||
}
|
||||
|
||||
.setter {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.signature {
|
||||
color: navy;
|
||||
}
|
||||
|
||||
.fcndec {
|
||||
width: 100%;
|
||||
border-top-width: thin;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.fcndef {
|
||||
margin-left: 2em;
|
||||
margin-bottom: 2em;
|
||||
}
|
||||
|
||||
dd {
|
||||
margin-bottom: 2em;
|
||||
max-width: none; /* was: 80ch */
|
||||
}
|
||||
|
||||
.cpp-symbols dt {
|
||||
font-family: monospace;
|
||||
}
|
||||
.cpp-symbols dd {
|
||||
margin-bottom: 1em;
|
||||
|
||||
/* Resemble style of <footer> which is not part of xhtml1-strict */
|
||||
.footer {
|
||||
font-size: var(--ok-fs-5);
|
||||
color: var(--ok-tc-1);
|
||||
}
|
||||
|
134
doc/xmlwf.1
134
doc/xmlwf.1
@ -5,7 +5,7 @@
|
||||
\\$2 \(la\\$1\(ra\\$3
|
||||
..
|
||||
.if \n(.g .mso www.tmac
|
||||
.TH XMLWF 1 "March 11, 2016" "" ""
|
||||
.TH XMLWF 1 "January 16, 2022" "" ""
|
||||
.SH NAME
|
||||
xmlwf \- Determines if an XML document is well-formed
|
||||
.SH SYNOPSIS
|
||||
@ -15,7 +15,27 @@ 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-s\fR] [\fB-n\fR] [\fB-p\fR] [\fB-x\fR] [\fB-e \fIencoding\fB\fR] [\fB-w\fR] [\fB-d \fIoutput-dir\fB\fR] [\fB-c\fR] [\fB-m\fR] [\fB-r\fR] [\fB-t\fR] [\fB-N\fR] [\fB-v\fR] [file ...]
|
||||
[\fIOPTIONS\fR] [\fIFILE\fR ...]
|
||||
'in \n(.iu-\nxu
|
||||
.ad b
|
||||
'hy
|
||||
'nh
|
||||
.fi
|
||||
.ad l
|
||||
\fBxmlwf\fR \kx
|
||||
.if (\nx>(\n(.l/2)) .nr x (\n(.l/5)
|
||||
'in \n(.iu+\nxu
|
||||
\fB-h\fR
|
||||
'in \n(.iu-\nxu
|
||||
.ad b
|
||||
'hy
|
||||
'nh
|
||||
.fi
|
||||
.ad l
|
||||
\fBxmlwf\fR \kx
|
||||
.if (\nx>(\n(.l/2)) .nr x (\n(.l/5)
|
||||
'in \n(.iu+\nxu
|
||||
\fB-v\fR
|
||||
'in \n(.iu-\nxu
|
||||
.ad b
|
||||
'hy
|
||||
@ -34,7 +54,7 @@ following rules:
|
||||
\(bu
|
||||
The file begins with an XML declaration. For instance,
|
||||
\*(T<<?xml version="1.0" standalone="yes"?>\*(T>.
|
||||
\fINOTE:\fR
|
||||
\fINOTE\fR:
|
||||
\fBxmlwf\fR does not currently
|
||||
check for a valid XML declaration.
|
||||
.TP 0.2i
|
||||
@ -62,10 +82,42 @@ it does not check the DTD. However, it does support
|
||||
external entities (see the \*(T<\fB\-x\fR\*(T> option).
|
||||
.SH OPTIONS
|
||||
When an option includes an argument, you may specify the argument either
|
||||
separately ("\*(T<\fB\-d\fR\*(T> output") or concatenated with the
|
||||
option ("\*(T<\fB\-d\fR\*(T>output"). \fBxmlwf\fR
|
||||
separately ("\*(T<\fB\-d\fR\*(T> \fIoutput\fR") or concatenated with the
|
||||
option ("\*(T<\fB\-d\fR\*(T>\fIoutput\fR"). \fBxmlwf\fR
|
||||
supports both.
|
||||
.TP
|
||||
\*(T<\fB\-a\fR\*(T> \fIfactor\fR
|
||||
Sets the maximum tolerated amplification factor
|
||||
for protection against billion laughs attacks (default: 100.0).
|
||||
The amplification factor is calculated as ..
|
||||
|
||||
.nf
|
||||
|
||||
amplification := (direct + indirect) / direct
|
||||
|
||||
.fi
|
||||
|
||||
\&.. while parsing, whereas
|
||||
<direct> is the number of bytes read
|
||||
from the primary document in parsing and
|
||||
<indirect> is the number of bytes
|
||||
added by expanding entities and reading of external DTD files,
|
||||
combined.
|
||||
|
||||
\fINOTE\fR:
|
||||
If you ever need to increase this value for non-attack payload,
|
||||
please file a bug report.
|
||||
.TP
|
||||
\*(T<\fB\-b\fR\*(T> \fIbytes\fR
|
||||
Sets the number of output bytes (including amplification)
|
||||
needed to activate protection against billion laughs attacks
|
||||
(default: 8 MiB).
|
||||
This can be thought of as an "activation threshold".
|
||||
|
||||
\fINOTE\fR:
|
||||
If you ever need to increase this value for non-attack payload,
|
||||
please file a bug report.
|
||||
.TP
|
||||
\*(T<\fB\-c\fR\*(T>
|
||||
If the input file is well-formed and \fBxmlwf\fR
|
||||
doesn't encounter any errors, the input file is simply copied to
|
||||
@ -73,7 +125,7 @@ the output directory unchanged.
|
||||
This implies no namespaces (turns off \*(T<\fB\-n\fR\*(T>) and
|
||||
requires \*(T<\fB\-d\fR\*(T> to specify an output directory.
|
||||
.TP
|
||||
\*(T<\fB\-d output\-dir\fR\*(T>
|
||||
\*(T<\fB\-d\fR\*(T> \fIoutput-dir\fR
|
||||
Specifies a directory to contain transformed
|
||||
representations of the input files.
|
||||
By default, \*(T<\fB\-d\fR\*(T> outputs a canonical representation
|
||||
@ -96,7 +148,7 @@ is treated equivalently to data.
|
||||
More on canonical XML can be found at
|
||||
http://www.jclark.com/xml/canonxml.html .
|
||||
.TP
|
||||
\*(T<\fB\-e encoding\fR\*(T>
|
||||
\*(T<\fB\-e\fR\*(T> \fIencoding\fR
|
||||
Specifies the character encoding for the document, overriding
|
||||
any document encoding declaration. \fBxmlwf\fR
|
||||
supports four built-in encodings:
|
||||
@ -106,6 +158,15 @@ supports four built-in encodings:
|
||||
\*(T<ISO\-8859\-1\*(T>.
|
||||
Also see the \*(T<\fB\-w\fR\*(T> option.
|
||||
.TP
|
||||
\*(T<\fB\-k\fR\*(T>
|
||||
When processing multiple files, \fBxmlwf\fR
|
||||
by default halts after the the first file with an error.
|
||||
This tells \fBxmlwf\fR to report the error
|
||||
but to keep processing.
|
||||
This can be useful, for example, when testing a filter that converts
|
||||
many files to XML and you want to quickly find out which conversions
|
||||
failed.
|
||||
.TP
|
||||
\*(T<\fB\-m\fR\*(T>
|
||||
Outputs some strange sort of XML file that completely
|
||||
describes the input file, including character positions.
|
||||
@ -121,7 +182,7 @@ This matches the example output used by the formal XML test cases.
|
||||
Requires \*(T<\fB\-d\fR\*(T> to specify an output file.
|
||||
.TP
|
||||
\*(T<\fB\-p\fR\*(T>
|
||||
Tells xmlwf to process external DTDs and parameter
|
||||
Tells \fBxmlwf\fR to process external DTDs and parameter
|
||||
entities.
|
||||
|
||||
Normally \fBxmlwf\fR never parses parameter
|
||||
@ -165,7 +226,7 @@ then exits.
|
||||
Enables support for Windows code pages.
|
||||
Normally, \fBxmlwf\fR will throw an error if it
|
||||
runs across an encoding that it is not equipped to handle itself. With
|
||||
\*(T<\fB\-w\fR\*(T>, xmlwf will try to use a Windows code
|
||||
\*(T<\fB\-w\fR\*(T>, \fBxmlwf\fR will try to use a Windows code
|
||||
page. See also \*(T<\fB\-e\fR\*(T>.
|
||||
.TP
|
||||
\*(T<\fB\-x\fR\*(T>
|
||||
@ -210,18 +271,33 @@ will run \fBxmlwf\fR on the file
|
||||
Older versions of \fBxmlwf\fR do not support
|
||||
reading from standard input.
|
||||
.SH OUTPUT
|
||||
If an input file is not well-formed,
|
||||
\fBxmlwf\fR prints a single line describing
|
||||
the problem to standard output. If a file is well formed,
|
||||
\fBxmlwf\fR outputs nothing.
|
||||
Note that the result code is \fInot\fR set.
|
||||
.SH BUGS
|
||||
\fBxmlwf\fR returns a 0 - noerr result,
|
||||
even if the file is not well-formed. There is no good way for
|
||||
a program to use \fBxmlwf\fR to quickly
|
||||
check a file -- it must parse \fBxmlwf\fR's
|
||||
standard output.
|
||||
\fBxmlwf\fR outputs nothing for files which are problem-free.
|
||||
If any input file is not well-formed, or if the output for any
|
||||
input file cannot be opened, \fBxmlwf\fR prints a single
|
||||
line describing the problem to standard output.
|
||||
.PP
|
||||
If the \*(T<\fB\-k\fR\*(T> option is not provided, \fBxmlwf\fR
|
||||
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:
|
||||
.TP
|
||||
\*(T<\fB0\fR\*(T>
|
||||
The input files are well-formed and the output (if requested) was written successfully.
|
||||
.TP
|
||||
\*(T<\fB1\fR\*(T>
|
||||
An internal error occurred.
|
||||
.TP
|
||||
\*(T<\fB2\fR\*(T>
|
||||
One or more input files were not well-formed or could not be parsed.
|
||||
.TP
|
||||
\*(T<\fB3\fR\*(T>
|
||||
If using the \*(T<\fB\-d\fR\*(T> option, an error occurred opening an output file.
|
||||
.TP
|
||||
\*(T<\fB4\fR\*(T>
|
||||
There was a command-line argument error in how \fBxmlwf\fR was invoked.
|
||||
.SH BUGS
|
||||
The errors should go to standard error, not standard output.
|
||||
.PP
|
||||
There should be a way to get \*(T<\fB\-d\fR\*(T> to send its
|
||||
@ -232,24 +308,16 @@ I have no idea why anyone would want to use the
|
||||
\*(T<\fB\-d\fR\*(T>, \*(T<\fB\-c\fR\*(T>, and
|
||||
\*(T<\fB\-m\fR\*(T> options. If someone could explain it to
|
||||
me, I'd like to add this information to this manpage.
|
||||
.SH ALTERNATIVES
|
||||
Here are some XML validators on the web:
|
||||
|
||||
.nf
|
||||
|
||||
http://www.hcrc.ed.ac.uk/~richard/xml\-check.html
|
||||
http://www.stg.brown.edu/service/xmlvalid/
|
||||
http://www.scripting.com/frontier5/xml/code/xmlValidator.html
|
||||
http://www.xml.com/pub/a/tools/ruwf/check.html
|
||||
.fi
|
||||
.SH "SEE ALSO"
|
||||
.nf
|
||||
|
||||
The Expat home page: http://www.libexpat.org/
|
||||
The W3 XML specification: http://www.w3.org/TR/REC\-xml
|
||||
The Expat home page: https://libexpat.github.io/
|
||||
The W3 XML 1.0 specification (fourth edition): https://www.w3.org/TR/2006/REC\-xml\-20060816/
|
||||
Billion laughs attack: https://en.wikipedia.org/wiki/Billion_laughs_attack
|
||||
.fi
|
||||
.SH AUTHOR
|
||||
This manual page was written by Scott Bronson <\*(T<bronson@rinspin.com\*(T>> for
|
||||
This manual page was originally written by Scott Bronson <\*(T<bronson@rinspin.com\*(T>>
|
||||
in December 2001 for
|
||||
the Debian GNU/Linux system (but may be used by others). Permission is
|
||||
granted to copy, distribute and/or modify this document under
|
||||
the terms of the GNU Free Documentation
|
||||
|
208
doc/xmlwf.xml
208
doc/xmlwf.xml
@ -1,11 +1,28 @@
|
||||
<!DOCTYPE refentry [
|
||||
<!-- Fill in your name for FIRSTNAME and SURNAME. -->
|
||||
<!--
|
||||
__ __ _
|
||||
___\ \/ /_ __ __ _| |_
|
||||
/ _ \\ /| '_ \ / _` | __|
|
||||
| __// \| |_) | (_| | |_
|
||||
\___/_/\_\ .__/ \__,_|\__|
|
||||
|_| XML parser
|
||||
|
||||
Copyright (c) 2001 Scott Bronson <bronson@rinspin.com>
|
||||
Copyright (c) 2002-2003 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
|
||||
Copyright (c) 2009 Karl Waclawek <karl@waclawek.net>
|
||||
Copyright (c) 2016-2022 Sebastian Pipping <sebastian@pipping.org>
|
||||
Copyright (c) 2016 Ardo van Rangelrooij <ardo@debian.org>
|
||||
Copyright (c) 2017 Rhodri James <rhodri@wildebeest.org.uk>
|
||||
Copyright (c) 2020 Joe Orton <jorton@redhat.com>
|
||||
Copyright (c) 2021 Tim Bray <tbray@textuality.com>
|
||||
Unlike most of Expat,
|
||||
this file is copyrighted under the GNU Free Documentation License 1.1.
|
||||
-->
|
||||
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
|
||||
"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
|
||||
<!ENTITY dhfirstname "<firstname>Scott</firstname>">
|
||||
<!ENTITY dhsurname "<surname>Bronson</surname>">
|
||||
<!-- Please adjust the date whenever revising the manpage. -->
|
||||
<!ENTITY dhdate "<date>March 11, 2016</date>">
|
||||
<!-- SECTION should be 1-8, maybe w/ subsection other parameters are
|
||||
allowed: see man(7), man(1). -->
|
||||
<!ENTITY dhdate "<date>January 16, 2022</date>">
|
||||
<!ENTITY dhsection "<manvolnum>1</manvolnum>">
|
||||
<!ENTITY dhemail "<email>bronson@rinspin.com</email>">
|
||||
<!ENTITY dhusername "Scott Bronson">
|
||||
@ -44,25 +61,16 @@
|
||||
<refsynopsisdiv>
|
||||
<cmdsynopsis>
|
||||
<command>&dhpackage;</command>
|
||||
<arg><option>-s</option></arg>
|
||||
<arg><option>-n</option></arg>
|
||||
<arg><option>-p</option></arg>
|
||||
<arg><option>-x</option></arg>
|
||||
|
||||
<arg><option>-e <replaceable>encoding</replaceable></option></arg>
|
||||
<arg><option>-w</option></arg>
|
||||
|
||||
<arg><option>-d <replaceable>output-dir</replaceable></option></arg>
|
||||
<arg><option>-c</option></arg>
|
||||
<arg><option>-m</option></arg>
|
||||
|
||||
<arg><option>-r</option></arg>
|
||||
<arg><option>-t</option></arg>
|
||||
<arg><option>-N</option></arg>
|
||||
|
||||
<arg><option>-v</option></arg>
|
||||
|
||||
<arg>file ...</arg>
|
||||
<arg><replaceable>OPTIONS</replaceable></arg>
|
||||
<arg><replaceable>FILE</replaceable> ...</arg>
|
||||
</cmdsynopsis>
|
||||
<cmdsynopsis>
|
||||
<command>&dhpackage;</command>
|
||||
<arg choice="plain"><option>-h</option></arg>
|
||||
</cmdsynopsis>
|
||||
<cmdsynopsis>
|
||||
<command>&dhpackage;</command>
|
||||
<arg choice="plain"><option>-v</option></arg>
|
||||
</cmdsynopsis>
|
||||
</refsynopsisdiv>
|
||||
|
||||
@ -95,7 +103,7 @@
|
||||
<listitem><para>
|
||||
The file begins with an XML declaration. For instance,
|
||||
<literal><?xml version="1.0" standalone="yes"?></literal>.
|
||||
<emphasis>NOTE:</emphasis>
|
||||
<emphasis>NOTE</emphasis>:
|
||||
<command>&dhpackage;</command> does not currently
|
||||
check for a valid XML declaration.
|
||||
</para></listitem>
|
||||
@ -132,13 +140,57 @@
|
||||
|
||||
<para>
|
||||
When an option includes an argument, you may specify the argument either
|
||||
separately ("<option>-d</option> output") or concatenated with the
|
||||
option ("<option>-d</option>output"). <command>&dhpackage;</command>
|
||||
separately ("<option>-d</option> <replaceable>output</replaceable>") or concatenated with the
|
||||
option ("<option>-d</option><replaceable>output</replaceable>"). <command>&dhpackage;</command>
|
||||
supports both.
|
||||
</para>
|
||||
|
||||
<variablelist>
|
||||
|
||||
<varlistentry>
|
||||
<term><option>-a</option> <replaceable>factor</replaceable></term>
|
||||
<listitem>
|
||||
<para>
|
||||
Sets the maximum tolerated amplification factor
|
||||
for protection against billion laughs attacks (default: 100.0).
|
||||
The amplification factor is calculated as ..
|
||||
</para>
|
||||
<literallayout>
|
||||
amplification := (direct + indirect) / direct
|
||||
</literallayout>
|
||||
<para>
|
||||
.. while parsing, whereas
|
||||
<direct> is the number of bytes read
|
||||
from the primary document in parsing and
|
||||
<indirect> is the number of bytes
|
||||
added by expanding entities and reading of external DTD files,
|
||||
combined.
|
||||
</para>
|
||||
<para>
|
||||
<emphasis>NOTE</emphasis>:
|
||||
If you ever need to increase this value for non-attack payload,
|
||||
please file a bug report.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><option>-b</option> <replaceable>bytes</replaceable></term>
|
||||
<listitem>
|
||||
<para>
|
||||
Sets the number of output bytes (including amplification)
|
||||
needed to activate protection against billion laughs attacks
|
||||
(default: 8 MiB).
|
||||
This can be thought of as an "activation threshold".
|
||||
</para>
|
||||
<para>
|
||||
<emphasis>NOTE</emphasis>:
|
||||
If you ever need to increase this value for non-attack payload,
|
||||
please file a bug report.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><option>-c</option></term>
|
||||
<listitem>
|
||||
@ -153,7 +205,7 @@ supports both.
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><option>-d output-dir</option></term>
|
||||
<term><option>-d</option> <replaceable>output-dir</replaceable></term>
|
||||
<listitem>
|
||||
<para>
|
||||
Specifies a directory to contain transformed
|
||||
@ -184,7 +236,7 @@ supports both.
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><option>-e encoding</option></term>
|
||||
<term><option>-e</option> <replaceable>encoding</replaceable></term>
|
||||
<listitem>
|
||||
<para>
|
||||
Specifies the character encoding for the document, overriding
|
||||
@ -199,6 +251,21 @@ supports both.
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><option>-k</option></term>
|
||||
<listitem>
|
||||
<para>
|
||||
When processing multiple files, <command>&dhpackage;</command>
|
||||
by default halts after the the first file with an error.
|
||||
This tells <command>&dhpackage;</command> to report the error
|
||||
but to keep processing.
|
||||
This can be useful, for example, when testing a filter that converts
|
||||
many files to XML and you want to quickly find out which conversions
|
||||
failed.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><option>-m</option></term>
|
||||
<listitem>
|
||||
@ -235,7 +302,7 @@ supports both.
|
||||
<term><option>-p</option></term>
|
||||
<listitem>
|
||||
<para>
|
||||
Tells xmlwf to process external DTDs and parameter
|
||||
Tells <command>&dhpackage;</command> to process external DTDs and parameter
|
||||
entities.
|
||||
</para>
|
||||
<para>
|
||||
@ -311,7 +378,7 @@ supports both.
|
||||
Enables support for Windows code pages.
|
||||
Normally, <command>&dhpackage;</command> will throw an error if it
|
||||
runs across an encoding that it is not equipped to handle itself. With
|
||||
<option>-w</option>, &dhpackage; will try to use a Windows code
|
||||
<option>-w</option>, <command>&dhpackage;</command> will try to use a Windows code
|
||||
page. See also <option>-e</option>.
|
||||
</para>
|
||||
</listitem>
|
||||
@ -379,23 +446,55 @@ supports both.
|
||||
<refsect1>
|
||||
<title>OUTPUT</title>
|
||||
<para>
|
||||
If an input file is not well-formed,
|
||||
<command>&dhpackage;</command> prints a single line describing
|
||||
the problem to standard output. If a file is well formed,
|
||||
<command>&dhpackage;</command> outputs nothing.
|
||||
Note that the result code is <emphasis>not</emphasis> set.
|
||||
<command>&dhpackage;</command> outputs nothing for files which are problem-free.
|
||||
If any input file is not well-formed, or if the output for any
|
||||
input file cannot be opened, <command>&dhpackage;</command> prints a single
|
||||
line describing the problem to standard output.
|
||||
</para>
|
||||
<para>
|
||||
If the <option>-k</option> option is not provided, <command>&dhpackage;</command>
|
||||
halts upon encountering a well-formedness or output-file error.
|
||||
If <option>-k</option> is provided, <command>&dhpackage;</command> continues
|
||||
processing the remaining input files, describing problems found with any of them.
|
||||
</para>
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>BUGS</title>
|
||||
<para>
|
||||
<command>&dhpackage;</command> returns a 0 - noerr result,
|
||||
even if the file is not well-formed. There is no good way for
|
||||
a program to use <command>&dhpackage;</command> to quickly
|
||||
check a file -- it must parse <command>&dhpackage;</command>'s
|
||||
standard output.
|
||||
<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:
|
||||
<variablelist>
|
||||
<varlistentry>
|
||||
<term><option>0</option></term>
|
||||
<listitem><para>The input files are well-formed and the output (if requested) was written successfully.</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term><option>1</option></term>
|
||||
<listitem><para>An internal error occurred.</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term><option>2</option></term>
|
||||
<listitem><para>One or more input files were not well-formed or could not be parsed.</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term><option>3</option></term>
|
||||
<listitem><para>If using the <option>-d</option> option, an error occurred opening an output file.</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term><option>4</option></term>
|
||||
<listitem><para>There was a command-line argument error in how <command>&dhpackage;</command> was invoked.</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
</variablelist>
|
||||
</para>
|
||||
</refsect1>
|
||||
|
||||
|
||||
<refsect1>
|
||||
<title>BUGS</title>
|
||||
<para>
|
||||
The errors should go to standard error, not standard output.
|
||||
</para>
|
||||
@ -412,28 +511,14 @@ supports both.
|
||||
</para>
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>ALTERNATIVES</title>
|
||||
<para>
|
||||
Here are some XML validators on the web:
|
||||
|
||||
<literallayout>
|
||||
http://www.hcrc.ed.ac.uk/~richard/xml-check.html
|
||||
http://www.stg.brown.edu/service/xmlvalid/
|
||||
http://www.scripting.com/frontier5/xml/code/xmlValidator.html
|
||||
http://www.xml.com/pub/a/tools/ruwf/check.html
|
||||
</literallayout>
|
||||
|
||||
</para>
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>SEE ALSO</title>
|
||||
<para>
|
||||
|
||||
<literallayout>
|
||||
The Expat home page: http://www.libexpat.org/
|
||||
The W3 XML specification: http://www.w3.org/TR/REC-xml
|
||||
The Expat home page: https://libexpat.github.io/
|
||||
The W3 XML 1.0 specification (fourth edition): https://www.w3.org/TR/2006/REC-xml-20060816/
|
||||
Billion laughs attack: https://en.wikipedia.org/wiki/Billion_laughs_attack
|
||||
</literallayout>
|
||||
|
||||
</para>
|
||||
@ -442,7 +527,8 @@ The W3 XML specification: http://www.w3.org/TR/REC-xml
|
||||
<refsect1>
|
||||
<title>AUTHOR</title>
|
||||
<para>
|
||||
This manual page was written by &dhusername; &dhemail; for
|
||||
This manual page was originally written by &dhusername; &dhemail;
|
||||
in December 2001 for
|
||||
the &debian; system (but may be used by others). Permission is
|
||||
granted to copy, distribute and/or modify this document under
|
||||
the terms of the <acronym>GNU</acronym> Free Documentation
|
||||
|
@ -6,7 +6,8 @@
|
||||
# \___/_/\_\ .__/ \__,_|\__|
|
||||
# |_| XML parser
|
||||
#
|
||||
# Copyright (c) 2017 Expat development team
|
||||
# Copyright (c) 2017 Sebastian Pipping <sebastian@pipping.org>
|
||||
# Copyright (c) 2020 Jeffrey Walton <noloader@gmail.com>
|
||||
# Licensed under the MIT license:
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
@ -28,7 +29,7 @@
|
||||
# OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||
# USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
AM_CPPFLAGS = -I$(srcdir)/../lib
|
||||
AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(srcdir)/../lib
|
||||
|
||||
noinst_PROGRAMS = elements outline
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
# Makefile.in generated by automake 1.16.1 from Makefile.am.
|
||||
# Makefile.in generated by automake 1.16.5 from Makefile.am.
|
||||
# @configure_input@
|
||||
|
||||
# Copyright (C) 1994-2018 Free Software Foundation, Inc.
|
||||
# Copyright (C) 1994-2021 Free Software Foundation, Inc.
|
||||
|
||||
# This Makefile.in is free software; the Free Software Foundation
|
||||
# gives unlimited permission to copy and/or distribute it,
|
||||
@ -22,7 +22,8 @@
|
||||
# \___/_/\_\ .__/ \__,_|\__|
|
||||
# |_| XML parser
|
||||
#
|
||||
# Copyright (c) 2017 Expat development team
|
||||
# Copyright (c) 2017 Sebastian Pipping <sebastian@pipping.org>
|
||||
# Copyright (c) 2020 Jeffrey Walton <noloader@gmail.com>
|
||||
# Licensed under the MIT license:
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
@ -210,14 +211,16 @@ am__define_uniq_tagged_files = \
|
||||
unique=`for i in $$list; do \
|
||||
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
||||
done | $(am__uniquify_input)`
|
||||
ETAGS = etags
|
||||
CTAGS = ctags
|
||||
am__DIST_COMMON = $(srcdir)/Makefile.in \
|
||||
$(top_srcdir)/conftools/depcomp
|
||||
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
||||
ACLOCAL = @ACLOCAL@
|
||||
AMTAR = @AMTAR@
|
||||
AM_CFLAGS = @AM_CFLAGS@
|
||||
AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(srcdir)/../lib
|
||||
AM_CXXFLAGS = @AM_CXXFLAGS@
|
||||
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
|
||||
AM_LDFLAGS = @AM_LDFLAGS@
|
||||
AR = @AR@
|
||||
AS = @AS@
|
||||
AUTOCONF = @AUTOCONF@
|
||||
@ -227,8 +230,9 @@ AWK = @AWK@
|
||||
CC = @CC@
|
||||
CCDEPMODE = @CCDEPMODE@
|
||||
CFLAGS = @CFLAGS@
|
||||
CPP = @CPP@
|
||||
CPPFLAGS = @CPPFLAGS@
|
||||
CSCOPE = @CSCOPE@
|
||||
CTAGS = @CTAGS@
|
||||
CXX = @CXX@
|
||||
CXXCPP = @CXXCPP@
|
||||
CXXDEPMODE = @CXXDEPMODE@
|
||||
@ -244,7 +248,15 @@ ECHO_C = @ECHO_C@
|
||||
ECHO_N = @ECHO_N@
|
||||
ECHO_T = @ECHO_T@
|
||||
EGREP = @EGREP@
|
||||
ETAGS = @ETAGS@
|
||||
EXEEXT = @EXEEXT@
|
||||
EXPAT_ATTR_INFO = @EXPAT_ATTR_INFO@
|
||||
EXPAT_CHAR_TYPE = @EXPAT_CHAR_TYPE@
|
||||
EXPAT_CONTEXT_BYTES = @EXPAT_CONTEXT_BYTES@
|
||||
EXPAT_DTD = @EXPAT_DTD@
|
||||
EXPAT_LARGE_SIZE = @EXPAT_LARGE_SIZE@
|
||||
EXPAT_MIN_SIZE = @EXPAT_MIN_SIZE@
|
||||
EXPAT_NS = @EXPAT_NS@
|
||||
FGREP = @FGREP@
|
||||
FILEMAP = @FILEMAP@
|
||||
GREP = @GREP@
|
||||
@ -257,6 +269,8 @@ LD = @LD@
|
||||
LDFLAGS = @LDFLAGS@
|
||||
LIBAGE = @LIBAGE@
|
||||
LIBCURRENT = @LIBCURRENT@
|
||||
LIBDIR_BASENAME = @LIBDIR_BASENAME@
|
||||
LIBM = @LIBM@
|
||||
LIBOBJS = @LIBOBJS@
|
||||
LIBREVISION = @LIBREVISION@
|
||||
LIBS = @LIBS@
|
||||
@ -286,6 +300,9 @@ RANLIB = @RANLIB@
|
||||
SED = @SED@
|
||||
SET_MAKE = @SET_MAKE@
|
||||
SHELL = @SHELL@
|
||||
SO_MAJOR = @SO_MAJOR@
|
||||
SO_MINOR = @SO_MINOR@
|
||||
SO_PATCH = @SO_PATCH@
|
||||
STRIP = @STRIP@
|
||||
VERSION = @VERSION@
|
||||
abs_builddir = @abs_builddir@
|
||||
@ -296,6 +313,7 @@ ac_ct_AR = @ac_ct_AR@
|
||||
ac_ct_CC = @ac_ct_CC@
|
||||
ac_ct_CXX = @ac_ct_CXX@
|
||||
ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
|
||||
ac_cv_sizeof_void_p = @ac_cv_sizeof_void_p@
|
||||
am__include = @am__include@
|
||||
am__leading_dot = @am__leading_dot@
|
||||
am__quote = @am__quote@
|
||||
@ -333,6 +351,7 @@ pdfdir = @pdfdir@
|
||||
prefix = @prefix@
|
||||
program_transform_name = @program_transform_name@
|
||||
psdir = @psdir@
|
||||
runstatedir = @runstatedir@
|
||||
sbindir = @sbindir@
|
||||
sharedstatedir = @sharedstatedir@
|
||||
srcdir = @srcdir@
|
||||
@ -341,7 +360,6 @@ target_alias = @target_alias@
|
||||
top_build_prefix = @top_build_prefix@
|
||||
top_builddir = @top_builddir@
|
||||
top_srcdir = @top_srcdir@
|
||||
AM_CPPFLAGS = -I$(srcdir)/../lib
|
||||
elements_SOURCES = elements.c
|
||||
elements_LDADD = ../lib/libexpat.la
|
||||
outline_SOURCES = outline.c
|
||||
@ -490,7 +508,6 @@ cscopelist-am: $(am__tagged_files)
|
||||
|
||||
distclean-tags:
|
||||
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
|
||||
|
||||
distdir: $(BUILT_SOURCES)
|
||||
$(MAKE) $(AM_MAKEFLAGS) distdir-am
|
||||
|
||||
|
@ -11,7 +11,12 @@
|
||||
|_| XML parser
|
||||
|
||||
Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
|
||||
Copyright (c) 2000-2017 Expat development team
|
||||
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 <ssolie@users.sourceforge.net>
|
||||
Copyright (c) 2016-2019 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
|
||||
|
@ -8,8 +8,12 @@
|
||||
\___/_/\_\ .__/ \__,_|\__|
|
||||
|_| XML parser
|
||||
|
||||
Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
|
||||
Copyright (c) 2000-2017 Expat development team
|
||||
Copyright (c) 2000 Clark Cooper <coopercc@users.sourceforge.net>
|
||||
Copyright (c) 2001-2003 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
|
||||
Copyright (c) 2005-2007 Steven Solie <ssolie@users.sourceforge.net>
|
||||
Copyright (c) 2005-2006 Karl Waclawek <karl@waclawek.net>
|
||||
Copyright (c) 2016-2019 Sebastian Pipping <sebastian@pipping.org>
|
||||
Copyright (c) 2017 Rhodri James <rhodri@wildebeest.org.uk>
|
||||
Licensed under the MIT license:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
|
@ -30,15 +30,15 @@
|
||||
/* Define to 1 if you have the `bsd' library (-lbsd). */
|
||||
#undef HAVE_LIBBSD
|
||||
|
||||
/* Define to 1 if you have the <memory.h> header file. */
|
||||
#undef HAVE_MEMORY_H
|
||||
|
||||
/* Define to 1 if you have a working `mmap' system call. */
|
||||
#undef HAVE_MMAP
|
||||
|
||||
/* Define to 1 if you have the <stdint.h> header file. */
|
||||
#undef HAVE_STDINT_H
|
||||
|
||||
/* Define to 1 if you have the <stdio.h> header file. */
|
||||
#undef HAVE_STDIO_H
|
||||
|
||||
/* Define to 1 if you have the <stdlib.h> header file. */
|
||||
#undef HAVE_STDLIB_H
|
||||
|
||||
@ -87,7 +87,9 @@
|
||||
/* Define to the version of this package. */
|
||||
#undef PACKAGE_VERSION
|
||||
|
||||
/* Define to 1 if you have the ANSI C header files. */
|
||||
/* Define to 1 if all of the C90 standard headers exist (not just the ones
|
||||
required in a freestanding environment). This macro is provided for
|
||||
backward compatibility; new code need not use it. */
|
||||
#undef STDC_HEADERS
|
||||
|
||||
/* Version number of package */
|
||||
|
@ -6,7 +6,7 @@
|
||||
# \___/_/\_\ .__/ \__,_|\__|
|
||||
# |_| XML parser
|
||||
#
|
||||
# Copyright (c) 2019 Expat development team
|
||||
# Copyright (c) 2019 Sebastian Pipping <sebastian@pipping.org>
|
||||
# Licensed under the MIT license:
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
|
64
fuzz/xml_parse_fuzzer.c
Normal file
64
fuzz/xml_parse_fuzzer.c
Normal file
@ -0,0 +1,64 @@
|
||||
/*
|
||||
* Copyright (C) 2016 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#include "expat.h"
|
||||
#include "siphash.h"
|
||||
|
||||
// Macros to convert preprocessor macros to string literals. See
|
||||
// https://gcc.gnu.org/onlinedocs/gcc-3.4.3/cpp/Stringification.html
|
||||
#define xstr(s) str(s)
|
||||
#define str(s) #s
|
||||
|
||||
// The encoder type that we wish to fuzz should come from the compile-time
|
||||
// definition `ENCODING_FOR_FUZZING`. This allows us to have a separate fuzzer
|
||||
// binary for
|
||||
#ifndef ENCODING_FOR_FUZZING
|
||||
# error "ENCODING_FOR_FUZZING was not provided to this fuzz target."
|
||||
#endif
|
||||
|
||||
// 16-byte deterministic hash key.
|
||||
static unsigned char hash_key[16] = "FUZZING IS FUN!";
|
||||
|
||||
static void XMLCALL
|
||||
start(void *userData, const XML_Char *name, const XML_Char **atts) {
|
||||
(void)userData;
|
||||
(void)name;
|
||||
(void)atts;
|
||||
}
|
||||
static void XMLCALL
|
||||
end(void *userData, const XML_Char *name) {
|
||||
(void)userData;
|
||||
(void)name;
|
||||
}
|
||||
|
||||
int
|
||||
LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
|
||||
XML_Parser p = XML_ParserCreate(xstr(ENCODING_FOR_FUZZING));
|
||||
assert(p);
|
||||
|
||||
// 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_SetElementHandler(p, start, end);
|
||||
XML_Parse(p, (const XML_Char *)data, size, 0);
|
||||
XML_Parse(p, (const XML_Char *)data, size, 1);
|
||||
XML_ParserFree(p);
|
||||
return 0;
|
||||
}
|
71
fuzz/xml_parsebuffer_fuzzer.c
Normal file
71
fuzz/xml_parsebuffer_fuzzer.c
Normal file
@ -0,0 +1,71 @@
|
||||
/*
|
||||
* Copyright (C) 2016 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "expat.h"
|
||||
#include "siphash.h"
|
||||
|
||||
// Macros to convert preprocessor macros to string literals. See
|
||||
// https://gcc.gnu.org/onlinedocs/gcc-3.4.3/cpp/Stringification.html
|
||||
#define xstr(s) str(s)
|
||||
#define str(s) #s
|
||||
|
||||
// The encoder type that we wish to fuzz should come from the compile-time
|
||||
// definition `ENCODING_FOR_FUZZING`. This allows us to have a separate fuzzer
|
||||
// binary for
|
||||
#ifndef ENCODING_FOR_FUZZING
|
||||
# error "ENCODING_FOR_FUZZING was not provided to this fuzz target."
|
||||
#endif
|
||||
|
||||
// 16-byte deterministic hash key.
|
||||
static unsigned char hash_key[16] = "FUZZING IS FUN!";
|
||||
|
||||
static void XMLCALL
|
||||
start(void *userData, const XML_Char *name, const XML_Char **atts) {
|
||||
(void)userData;
|
||||
(void)name;
|
||||
(void)atts;
|
||||
}
|
||||
static void XMLCALL
|
||||
end(void *userData, const XML_Char *name) {
|
||||
(void)userData;
|
||||
(void)name;
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
// 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 *buf = XML_GetBuffer(p, size);
|
||||
assert(buf);
|
||||
|
||||
memcpy(buf, data, size);
|
||||
XML_ParseBuffer(p, size, size == 0);
|
||||
XML_ParserFree(p);
|
||||
return 0;
|
||||
}
|
@ -6,7 +6,9 @@
|
||||
# \___/_/\_\ .__/ \__,_|\__|
|
||||
# |_| XML parser
|
||||
#
|
||||
# Copyright (c) 2017 Expat development team
|
||||
# Copyright (c) 2017-2021 Sebastian Pipping <sebastian@pipping.org>
|
||||
# Copyright (c) 2017 Tomasz Kłoczko <kloczek@fedoraproject.org>
|
||||
# Copyright (c) 2019 David Loffredo <loffredo@steptools.com>
|
||||
# Licensed under the MIT license:
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
@ -34,16 +36,26 @@ include_HEADERS = \
|
||||
expat_external.h
|
||||
|
||||
lib_LTLIBRARIES = libexpat.la
|
||||
noinst_LTLIBRARIES = libexpatinternal.la
|
||||
|
||||
libexpat_la_LDFLAGS = \
|
||||
@AM_LDFLAGS@ \
|
||||
@LIBM@ \
|
||||
-no-undefined \
|
||||
-version-info @LIBCURRENT@:@LIBREVISION@:@LIBAGE@
|
||||
|
||||
libexpat_la_SOURCES = \
|
||||
libexpat_la_SOURCES =
|
||||
|
||||
# This layer of indirection allows
|
||||
# the test suite to access internal symbols
|
||||
# despite compiling with -fvisibility=hidden
|
||||
libexpatinternal_la_SOURCES = \
|
||||
xmlparse.c \
|
||||
xmltok.c \
|
||||
xmlrole.c
|
||||
|
||||
libexpat_la_LIBADD = libexpatinternal.la
|
||||
|
||||
doc_DATA = \
|
||||
../AUTHORS \
|
||||
../Changes
|
||||
|
@ -1,7 +1,7 @@
|
||||
# Makefile.in generated by automake 1.16.1 from Makefile.am.
|
||||
# Makefile.in generated by automake 1.16.5 from Makefile.am.
|
||||
# @configure_input@
|
||||
|
||||
# Copyright (C) 1994-2018 Free Software Foundation, Inc.
|
||||
# Copyright (C) 1994-2021 Free Software Foundation, Inc.
|
||||
|
||||
# This Makefile.in is free software; the Free Software Foundation
|
||||
# gives unlimited permission to copy and/or distribute it,
|
||||
@ -22,7 +22,9 @@
|
||||
# \___/_/\_\ .__/ \__,_|\__|
|
||||
# |_| XML parser
|
||||
#
|
||||
# Copyright (c) 2017 Expat development team
|
||||
# Copyright (c) 2017-2021 Sebastian Pipping <sebastian@pipping.org>
|
||||
# Copyright (c) 2017 Tomasz Kłoczko <kloczek@fedoraproject.org>
|
||||
# Copyright (c) 2019 David Loffredo <loffredo@steptools.com>
|
||||
# Licensed under the MIT license:
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
@ -171,9 +173,9 @@ am__uninstall_files_from_dir = { \
|
||||
}
|
||||
am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(docdir)" \
|
||||
"$(DESTDIR)$(includedir)"
|
||||
LTLIBRARIES = $(lib_LTLIBRARIES)
|
||||
libexpat_la_LIBADD =
|
||||
am_libexpat_la_OBJECTS = xmlparse.lo xmltok.lo xmlrole.lo
|
||||
LTLIBRARIES = $(lib_LTLIBRARIES) $(noinst_LTLIBRARIES)
|
||||
libexpat_la_DEPENDENCIES = libexpatinternal.la
|
||||
am_libexpat_la_OBJECTS =
|
||||
libexpat_la_OBJECTS = $(am_libexpat_la_OBJECTS)
|
||||
AM_V_lt = $(am__v_lt_@AM_V@)
|
||||
am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
|
||||
@ -182,6 +184,9 @@ am__v_lt_1 =
|
||||
libexpat_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
|
||||
$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
|
||||
$(libexpat_la_LDFLAGS) $(LDFLAGS) -o $@
|
||||
libexpatinternal_la_LIBADD =
|
||||
am_libexpatinternal_la_OBJECTS = xmlparse.lo xmltok.lo xmlrole.lo
|
||||
libexpatinternal_la_OBJECTS = $(am_libexpatinternal_la_OBJECTS)
|
||||
AM_V_P = $(am__v_P_@AM_V@)
|
||||
am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
|
||||
am__v_P_0 = false
|
||||
@ -218,8 +223,8 @@ 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 = $(libexpat_la_SOURCES)
|
||||
DIST_SOURCES = $(libexpat_la_SOURCES)
|
||||
SOURCES = $(libexpat_la_SOURCES) $(libexpatinternal_la_SOURCES)
|
||||
DIST_SOURCES = $(libexpat_la_SOURCES) $(libexpatinternal_la_SOURCES)
|
||||
am__can_run_installinfo = \
|
||||
case $$AM_UPDATE_INFO_DIR in \
|
||||
n|no|NO) false;; \
|
||||
@ -244,14 +249,16 @@ am__define_uniq_tagged_files = \
|
||||
unique=`for i in $$list; do \
|
||||
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
||||
done | $(am__uniquify_input)`
|
||||
ETAGS = etags
|
||||
CTAGS = ctags
|
||||
am__DIST_COMMON = $(srcdir)/Makefile.in \
|
||||
$(top_srcdir)/conftools/depcomp
|
||||
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
||||
ACLOCAL = @ACLOCAL@
|
||||
AMTAR = @AMTAR@
|
||||
AM_CFLAGS = @AM_CFLAGS@
|
||||
AM_CPPFLAGS = @AM_CPPFLAGS@
|
||||
AM_CXXFLAGS = @AM_CXXFLAGS@
|
||||
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
|
||||
AM_LDFLAGS = @AM_LDFLAGS@
|
||||
AR = @AR@
|
||||
AS = @AS@
|
||||
AUTOCONF = @AUTOCONF@
|
||||
@ -261,8 +268,9 @@ AWK = @AWK@
|
||||
CC = @CC@
|
||||
CCDEPMODE = @CCDEPMODE@
|
||||
CFLAGS = @CFLAGS@
|
||||
CPP = @CPP@
|
||||
CPPFLAGS = @CPPFLAGS@
|
||||
CSCOPE = @CSCOPE@
|
||||
CTAGS = @CTAGS@
|
||||
CXX = @CXX@
|
||||
CXXCPP = @CXXCPP@
|
||||
CXXDEPMODE = @CXXDEPMODE@
|
||||
@ -278,7 +286,15 @@ ECHO_C = @ECHO_C@
|
||||
ECHO_N = @ECHO_N@
|
||||
ECHO_T = @ECHO_T@
|
||||
EGREP = @EGREP@
|
||||
ETAGS = @ETAGS@
|
||||
EXEEXT = @EXEEXT@
|
||||
EXPAT_ATTR_INFO = @EXPAT_ATTR_INFO@
|
||||
EXPAT_CHAR_TYPE = @EXPAT_CHAR_TYPE@
|
||||
EXPAT_CONTEXT_BYTES = @EXPAT_CONTEXT_BYTES@
|
||||
EXPAT_DTD = @EXPAT_DTD@
|
||||
EXPAT_LARGE_SIZE = @EXPAT_LARGE_SIZE@
|
||||
EXPAT_MIN_SIZE = @EXPAT_MIN_SIZE@
|
||||
EXPAT_NS = @EXPAT_NS@
|
||||
FGREP = @FGREP@
|
||||
FILEMAP = @FILEMAP@
|
||||
GREP = @GREP@
|
||||
@ -291,6 +307,8 @@ LD = @LD@
|
||||
LDFLAGS = @LDFLAGS@
|
||||
LIBAGE = @LIBAGE@
|
||||
LIBCURRENT = @LIBCURRENT@
|
||||
LIBDIR_BASENAME = @LIBDIR_BASENAME@
|
||||
LIBM = @LIBM@
|
||||
LIBOBJS = @LIBOBJS@
|
||||
LIBREVISION = @LIBREVISION@
|
||||
LIBS = @LIBS@
|
||||
@ -320,6 +338,9 @@ RANLIB = @RANLIB@
|
||||
SED = @SED@
|
||||
SET_MAKE = @SET_MAKE@
|
||||
SHELL = @SHELL@
|
||||
SO_MAJOR = @SO_MAJOR@
|
||||
SO_MINOR = @SO_MINOR@
|
||||
SO_PATCH = @SO_PATCH@
|
||||
STRIP = @STRIP@
|
||||
VERSION = @VERSION@
|
||||
abs_builddir = @abs_builddir@
|
||||
@ -330,6 +351,7 @@ ac_ct_AR = @ac_ct_AR@
|
||||
ac_ct_CC = @ac_ct_CC@
|
||||
ac_ct_CXX = @ac_ct_CXX@
|
||||
ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
|
||||
ac_cv_sizeof_void_p = @ac_cv_sizeof_void_p@
|
||||
am__include = @am__include@
|
||||
am__leading_dot = @am__leading_dot@
|
||||
am__quote = @am__quote@
|
||||
@ -367,6 +389,7 @@ pdfdir = @pdfdir@
|
||||
prefix = @prefix@
|
||||
program_transform_name = @program_transform_name@
|
||||
psdir = @psdir@
|
||||
runstatedir = @runstatedir@
|
||||
sbindir = @sbindir@
|
||||
sharedstatedir = @sharedstatedir@
|
||||
srcdir = @srcdir@
|
||||
@ -381,15 +404,24 @@ include_HEADERS = \
|
||||
expat_external.h
|
||||
|
||||
lib_LTLIBRARIES = libexpat.la
|
||||
noinst_LTLIBRARIES = libexpatinternal.la
|
||||
libexpat_la_LDFLAGS = \
|
||||
@AM_LDFLAGS@ \
|
||||
@LIBM@ \
|
||||
-no-undefined \
|
||||
-version-info @LIBCURRENT@:@LIBREVISION@:@LIBAGE@
|
||||
|
||||
libexpat_la_SOURCES = \
|
||||
libexpat_la_SOURCES =
|
||||
|
||||
# This layer of indirection allows
|
||||
# the test suite to access internal symbols
|
||||
# despite compiling with -fvisibility=hidden
|
||||
libexpatinternal_la_SOURCES = \
|
||||
xmlparse.c \
|
||||
xmltok.c \
|
||||
xmlrole.c
|
||||
|
||||
libexpat_la_LIBADD = libexpatinternal.la
|
||||
doc_DATA = \
|
||||
../AUTHORS \
|
||||
../Changes
|
||||
@ -483,9 +515,23 @@ clean-libLTLIBRARIES:
|
||||
rm -f $${locs}; \
|
||||
}
|
||||
|
||||
clean-noinstLTLIBRARIES:
|
||||
-test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
|
||||
@list='$(noinst_LTLIBRARIES)'; \
|
||||
locs=`for p in $$list; do echo $$p; done | \
|
||||
sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
|
||||
sort -u`; \
|
||||
test -z "$$locs" || { \
|
||||
echo rm -f $${locs}; \
|
||||
rm -f $${locs}; \
|
||||
}
|
||||
|
||||
libexpat.la: $(libexpat_la_OBJECTS) $(libexpat_la_DEPENDENCIES) $(EXTRA_libexpat_la_DEPENDENCIES)
|
||||
$(AM_V_CCLD)$(libexpat_la_LINK) -rpath $(libdir) $(libexpat_la_OBJECTS) $(libexpat_la_LIBADD) $(LIBS)
|
||||
|
||||
libexpatinternal.la: $(libexpatinternal_la_OBJECTS) $(libexpatinternal_la_DEPENDENCIES) $(EXTRA_libexpatinternal_la_DEPENDENCIES)
|
||||
$(AM_V_CCLD)$(LINK) $(libexpatinternal_la_OBJECTS) $(libexpatinternal_la_LIBADD) $(LIBS)
|
||||
|
||||
mostlyclean-compile:
|
||||
-rm -f *.$(OBJEXT)
|
||||
|
||||
@ -622,7 +668,6 @@ cscopelist-am: $(am__tagged_files)
|
||||
|
||||
distclean-tags:
|
||||
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
|
||||
|
||||
distdir: $(BUILT_SOURCES)
|
||||
$(MAKE) $(AM_MAKEFLAGS) distdir-am
|
||||
|
||||
@ -696,7 +741,7 @@ maintainer-clean-generic:
|
||||
clean: clean-am
|
||||
|
||||
clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \
|
||||
mostlyclean-am
|
||||
clean-noinstLTLIBRARIES mostlyclean-am
|
||||
|
||||
distclean: distclean-am
|
||||
-rm -f ./$(DEPDIR)/xmlparse.Plo
|
||||
@ -773,16 +818,17 @@ uninstall-am: uninstall-docDATA uninstall-includeHEADERS \
|
||||
.MAKE: install-am install-data-am install-strip
|
||||
|
||||
.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \
|
||||
clean-generic clean-libLTLIBRARIES 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-data-hook install-docDATA install-dvi \
|
||||
install-dvi-am install-exec install-exec-am install-html \
|
||||
install-html-am install-includeHEADERS install-info \
|
||||
install-info-am install-libLTLIBRARIES install-man install-pdf \
|
||||
install-pdf-am install-ps install-ps-am install-strip \
|
||||
installcheck installcheck-am installdirs maintainer-clean \
|
||||
clean-generic clean-libLTLIBRARIES clean-libtool \
|
||||
clean-noinstLTLIBRARIES 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-data-hook install-docDATA install-dvi install-dvi-am \
|
||||
install-exec install-exec-am install-html install-html-am \
|
||||
install-includeHEADERS install-info install-info-am \
|
||||
install-libLTLIBRARIES install-man install-pdf install-pdf-am \
|
||||
install-ps install-ps-am install-strip installcheck \
|
||||
installcheck-am installdirs maintainer-clean \
|
||||
maintainer-clean-generic mostlyclean mostlyclean-compile \
|
||||
mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
|
||||
tags tags-am uninstall uninstall-am uninstall-docDATA \
|
||||
|
@ -6,8 +6,11 @@
|
||||
\___/_/\_\ .__/ \__,_|\__|
|
||||
|_| XML parser
|
||||
|
||||
Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
|
||||
Copyright (c) 2000-2017 Expat development team
|
||||
Copyright (c) 1999-2000 Thai Open Source Software Center Ltd
|
||||
Copyright (c) 2000 Clark Cooper <coopercc@users.sourceforge.net>
|
||||
Copyright (c) 2002 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
|
||||
Copyright (c) 2007 Karl Waclawek <karl@waclawek.net>
|
||||
Copyright (c) 2017 Sebastian Pipping <sebastian@pipping.org>
|
||||
Licensed under the MIT license:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
|
@ -7,7 +7,9 @@
|
||||
|_| XML parser
|
||||
|
||||
Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
|
||||
Copyright (c) 2000-2017 Expat development team
|
||||
Copyright (c) 2000 Clark Cooper <coopercc@users.sourceforge.net>
|
||||
Copyright (c) 2002 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
|
||||
Copyright (c) 2017 Sebastian Pipping <sebastian@pipping.org>
|
||||
Licensed under the MIT license:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
|
44
lib/expat.h
44
lib/expat.h
@ -7,7 +7,14 @@
|
||||
|_| XML parser
|
||||
|
||||
Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
|
||||
Copyright (c) 2000-2017 Expat development team
|
||||
Copyright (c) 2000 Clark Cooper <coopercc@users.sourceforge.net>
|
||||
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 Cristian Rodríguez <crrodriguez@opensuse.org>
|
||||
Copyright (c) 2016 Thomas Beutlich <tc@tbeu.de>
|
||||
Copyright (c) 2017 Rhodri James <rhodri@wildebeest.org.uk>
|
||||
Licensed under the MIT license:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
@ -115,7 +122,11 @@ enum XML_Error {
|
||||
XML_ERROR_RESERVED_PREFIX_XMLNS,
|
||||
XML_ERROR_RESERVED_NAMESPACE_URI,
|
||||
/* Added in 2.2.1. */
|
||||
XML_ERROR_INVALID_ARGUMENT
|
||||
XML_ERROR_INVALID_ARGUMENT,
|
||||
/* Added in 2.3.0. */
|
||||
XML_ERROR_NO_BUFFER,
|
||||
/* Added in 2.4.0. */
|
||||
XML_ERROR_AMPLIFICATION_LIMIT_BREACH
|
||||
};
|
||||
|
||||
enum XML_Content_Type {
|
||||
@ -318,7 +329,7 @@ typedef void(XMLCALL *XML_EndDoctypeDeclHandler)(void *userData);
|
||||
|
||||
For internal entities (<!ENTITY foo "bar">), value will
|
||||
be non-NULL and systemId, publicID, and notationName will be NULL.
|
||||
The value string is NOT nul-terminated; the length is provided in
|
||||
The value string is NOT null-terminated; the length is provided in
|
||||
the value_length argument. Since it is legal to have zero-length
|
||||
values, do not use this argument to test for internal entities.
|
||||
|
||||
@ -513,7 +524,7 @@ typedef struct {
|
||||
Otherwise it must return XML_STATUS_ERROR.
|
||||
|
||||
If info does not describe a suitable encoding, then the parser will
|
||||
return an XML_UNKNOWN_ENCODING error.
|
||||
return an XML_ERROR_UNKNOWN_ENCODING error.
|
||||
*/
|
||||
typedef int(XMLCALL *XML_UnknownEncodingHandler)(void *encodingHandlerData,
|
||||
const XML_Char *name,
|
||||
@ -707,7 +718,7 @@ XML_GetBase(XML_Parser parser);
|
||||
/* Returns the number of the attribute/value pairs passed in last call
|
||||
to the XML_StartElementHandler that were specified in the start-tag
|
||||
rather than defaulted. Each attribute/value pair counts as 2; thus
|
||||
this correspondds to an index into the atts array passed to the
|
||||
this corresponds to an index into the atts array passed to the
|
||||
XML_StartElementHandler. Returns -1 if parser == NULL.
|
||||
*/
|
||||
XMLPARSEAPI(int)
|
||||
@ -716,7 +727,7 @@ XML_GetSpecifiedAttributeCount(XML_Parser parser);
|
||||
/* Returns the index of the ID attribute passed in the last call to
|
||||
XML_StartElementHandler, or -1 if there is no ID attribute or
|
||||
parser == NULL. Each attribute/value pair counts as 2; thus this
|
||||
correspondds to an index into the atts array passed to the
|
||||
corresponds to an index into the atts array passed to the
|
||||
XML_StartElementHandler.
|
||||
*/
|
||||
XMLPARSEAPI(int)
|
||||
@ -997,7 +1008,10 @@ enum XML_FeatureEnum {
|
||||
XML_FEATURE_SIZEOF_XML_LCHAR,
|
||||
XML_FEATURE_NS,
|
||||
XML_FEATURE_LARGE_SIZE,
|
||||
XML_FEATURE_ATTR_INFO
|
||||
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
|
||||
/* Additional features must be added to the end of this enum. */
|
||||
};
|
||||
|
||||
@ -1010,12 +1024,24 @@ typedef struct {
|
||||
XMLPARSEAPI(const XML_Feature *)
|
||||
XML_GetFeatureList(void);
|
||||
|
||||
#ifdef XML_DTD
|
||||
/* Added in Expat 2.4.0. */
|
||||
XMLPARSEAPI(XML_Bool)
|
||||
XML_SetBillionLaughsAttackProtectionMaximumAmplification(
|
||||
XML_Parser parser, float maximumAmplificationFactor);
|
||||
|
||||
/* Added in Expat 2.4.0. */
|
||||
XMLPARSEAPI(XML_Bool)
|
||||
XML_SetBillionLaughsAttackProtectionActivationThreshold(
|
||||
XML_Parser parser, unsigned long long activationThresholdBytes);
|
||||
#endif
|
||||
|
||||
/* Expat follows the semantic versioning convention.
|
||||
See http://semver.org.
|
||||
*/
|
||||
#define XML_MAJOR_VERSION 2
|
||||
#define XML_MINOR_VERSION 2
|
||||
#define XML_MICRO_VERSION 9
|
||||
#define XML_MINOR_VERSION 4
|
||||
#define XML_MICRO_VERSION 3
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
@ -7,7 +7,14 @@
|
||||
|_| XML parser
|
||||
|
||||
Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
|
||||
Copyright (c) 2000-2017 Expat development team
|
||||
Copyright (c) 2000 Clark Cooper <coopercc@users.sourceforge.net>
|
||||
Copyright (c) 2000-2004 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
|
||||
Copyright (c) 2001-2002 Greg Stein <gstein@users.sourceforge.net>
|
||||
Copyright (c) 2002-2006 Karl Waclawek <karl@waclawek.net>
|
||||
Copyright (c) 2016 Cristian Rodríguez <crrodriguez@opensuse.org>
|
||||
Copyright (c) 2016-2019 Sebastian Pipping <sebastian@pipping.org>
|
||||
Copyright (c) 2017 Rhodri James <rhodri@wildebeest.org.uk>
|
||||
Copyright (c) 2018 Yury Gribov <tetra2005@gmail.com>
|
||||
Licensed under the MIT license:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
|
@ -7,7 +7,9 @@
|
||||
|_| XML parser
|
||||
|
||||
Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
|
||||
Copyright (c) 2000-2017 Expat development team
|
||||
Copyright (c) 2000 Clark Cooper <coopercc@users.sourceforge.net>
|
||||
Copyright (c) 2002 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
|
||||
Copyright (c) 2017 Sebastian Pipping <sebastian@pipping.org>
|
||||
Licensed under the MIT license:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
|
@ -25,8 +25,12 @@
|
||||
\___/_/\_\ .__/ \__,_|\__|
|
||||
|_| XML parser
|
||||
|
||||
Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
|
||||
Copyright (c) 2000-2017 Expat development team
|
||||
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-2021 Sebastian Pipping <sebastian@pipping.org>
|
||||
Copyright (c) 2018 Yury Gribov <tetra2005@gmail.com>
|
||||
Copyright (c) 2019 David Loffredo <loffredo@steptools.com>
|
||||
Licensed under the MIT license:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
@ -101,23 +105,59 @@
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#include <limits.h> // ULONG_MAX
|
||||
|
||||
#if defined(_WIN32) && ! defined(__USE_MINGW_ANSI_STDIO)
|
||||
# define EXPAT_FMT_ULL(midpart) "%" midpart "I64u"
|
||||
# if defined(_WIN64) // Note: modifiers "td" and "zu" do not work for MinGW
|
||||
# define EXPAT_FMT_PTRDIFF_T(midpart) "%" midpart "I64d"
|
||||
# define EXPAT_FMT_SIZE_T(midpart) "%" midpart "I64u"
|
||||
# else
|
||||
# define EXPAT_FMT_PTRDIFF_T(midpart) "%" midpart "d"
|
||||
# define EXPAT_FMT_SIZE_T(midpart) "%" midpart "u"
|
||||
# endif
|
||||
#else
|
||||
# define EXPAT_FMT_ULL(midpart) "%" midpart "llu"
|
||||
# if ! defined(ULONG_MAX)
|
||||
# error Compiler did not define ULONG_MAX for us
|
||||
# elif ULONG_MAX == 18446744073709551615u // 2^64-1
|
||||
# define EXPAT_FMT_PTRDIFF_T(midpart) "%" midpart "ld"
|
||||
# define EXPAT_FMT_SIZE_T(midpart) "%" midpart "lu"
|
||||
# else
|
||||
# define EXPAT_FMT_PTRDIFF_T(midpart) "%" midpart "d"
|
||||
# define EXPAT_FMT_SIZE_T(midpart) "%" midpart "u"
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifndef UNUSED_P
|
||||
# define UNUSED_P(p) (void)p
|
||||
#endif
|
||||
|
||||
/* NOTE BEGIN If you ever patch these defaults to greater values
|
||||
for non-attack XML payload in your environment,
|
||||
please file a bug report with libexpat. Thank you!
|
||||
*/
|
||||
#define EXPAT_BILLION_LAUGHS_ATTACK_PROTECTION_MAXIMUM_AMPLIFICATION_DEFAULT \
|
||||
100.0f
|
||||
#define EXPAT_BILLION_LAUGHS_ATTACK_PROTECTION_ACTIVATION_THRESHOLD_DEFAULT \
|
||||
8388608 // 8 MiB, 2^23
|
||||
/* NOTE END */
|
||||
|
||||
#include "expat.h" // so we can use type XML_Parser below
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#ifdef XML_ENABLE_VISIBILITY
|
||||
# if XML_ENABLE_VISIBILITY
|
||||
__attribute__((visibility("default")))
|
||||
# endif
|
||||
#endif
|
||||
void
|
||||
_INTERNAL_trim_to_complete_utf8_characters(const char *from,
|
||||
void _INTERNAL_trim_to_complete_utf8_characters(const char *from,
|
||||
const char **fromLimRef);
|
||||
|
||||
#if defined(XML_DTD)
|
||||
unsigned long long testingAccountingGetCountBytesDirect(XML_Parser parser);
|
||||
unsigned long long testingAccountingGetCountBytesIndirect(XML_Parser parser);
|
||||
const char *unsignedCharToPrintable(unsigned char c);
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
@ -7,7 +7,9 @@
|
||||
|_| XML parser
|
||||
|
||||
Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
|
||||
Copyright (c) 2000-2017 Expat development team
|
||||
Copyright (c) 2000 Clark Cooper <coopercc@users.sourceforge.net>
|
||||
Copyright (c) 2002 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
|
||||
Copyright (c) 2017 Sebastian Pipping <sebastian@pipping.org>
|
||||
Licensed under the MIT license:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
|
@ -1,143 +0,0 @@
|
||||
/***************************************************************************
|
||||
* _ _ ____ _
|
||||
* Project ___| | | | _ \| |
|
||||
* / __| | | | |_) | |
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 2016 - 2017, Steve Holme, <steve_holme@hotmail.com>.
|
||||
* Copyright (C) 2017, Expat development team
|
||||
*
|
||||
* All rights reserved.
|
||||
* Licensed under the MIT license:
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* 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 OF
|
||||
* THIRD PARTY RIGHTS. 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.
|
||||
*
|
||||
* Except as contained in this notice, the name of a copyright holder shall
|
||||
* not be used in advertising or otherwise to promote the sale, use or other
|
||||
* dealings in this Software without prior written authorization of the
|
||||
* copyright holder.
|
||||
*
|
||||
***************************************************************************/
|
||||
|
||||
#if defined(_WIN32)
|
||||
|
||||
#include <windows.h>
|
||||
#include <tchar.h>
|
||||
|
||||
|
||||
HMODULE _Expat_LoadLibrary(LPCTSTR filename);
|
||||
|
||||
|
||||
#if !defined(LOAD_WITH_ALTERED_SEARCH_PATH)
|
||||
#define LOAD_WITH_ALTERED_SEARCH_PATH 0x00000008
|
||||
#endif
|
||||
|
||||
#if !defined(LOAD_LIBRARY_SEARCH_SYSTEM32)
|
||||
#define LOAD_LIBRARY_SEARCH_SYSTEM32 0x00000800
|
||||
#endif
|
||||
|
||||
/* We use our own typedef here since some headers might lack these */
|
||||
typedef HMODULE (APIENTRY *LOADLIBRARYEX_FN)(LPCTSTR, HANDLE, DWORD);
|
||||
|
||||
/* See function definitions in winbase.h */
|
||||
#ifdef UNICODE
|
||||
# ifdef _WIN32_WCE
|
||||
# define LOADLIBARYEX L"LoadLibraryExW"
|
||||
# else
|
||||
# define LOADLIBARYEX "LoadLibraryExW"
|
||||
# endif
|
||||
#else
|
||||
# define LOADLIBARYEX "LoadLibraryExA"
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* _Expat_LoadLibrary()
|
||||
*
|
||||
* This is used to dynamically load DLLs using the most secure method available
|
||||
* for the version of Windows that we are running on.
|
||||
*
|
||||
* Parameters:
|
||||
*
|
||||
* filename [in] - The filename or full path of the DLL to load. If only the
|
||||
* filename is passed then the DLL will be loaded from the
|
||||
* Windows system directory.
|
||||
*
|
||||
* Returns the handle of the module on success; otherwise NULL.
|
||||
*/
|
||||
HMODULE _Expat_LoadLibrary(LPCTSTR filename)
|
||||
{
|
||||
HMODULE hModule = NULL;
|
||||
LOADLIBRARYEX_FN pLoadLibraryEx = NULL;
|
||||
|
||||
/* Get a handle to kernel32 so we can access it's functions at runtime */
|
||||
HMODULE hKernel32 = GetModuleHandle(TEXT("kernel32"));
|
||||
if(!hKernel32)
|
||||
return NULL; /* LCOV_EXCL_LINE */
|
||||
|
||||
/* Attempt to find LoadLibraryEx() which is only available on Windows 2000
|
||||
and above */
|
||||
pLoadLibraryEx = (LOADLIBRARYEX_FN) GetProcAddress(hKernel32, LOADLIBARYEX);
|
||||
|
||||
/* Detect if there's already a path in the filename and load the library if
|
||||
there is. Note: Both back slashes and forward slashes have been supported
|
||||
since the earlier days of DOS at an API level although they are not
|
||||
supported by command prompt */
|
||||
if(_tcspbrk(filename, TEXT("\\/"))) {
|
||||
/** !checksrc! disable BANNEDFUNC 1 **/
|
||||
hModule = pLoadLibraryEx ?
|
||||
pLoadLibraryEx(filename, NULL, LOAD_WITH_ALTERED_SEARCH_PATH) :
|
||||
LoadLibrary(filename);
|
||||
}
|
||||
/* Detect if KB2533623 is installed, as LOAD_LIBARY_SEARCH_SYSTEM32 is only
|
||||
supported on Windows Vista, Windows Server 2008, Windows 7 and Windows
|
||||
Server 2008 R2 with this patch or natively on Windows 8 and above */
|
||||
else if(pLoadLibraryEx && GetProcAddress(hKernel32, "AddDllDirectory")) {
|
||||
/* Load the DLL from the Windows system directory */
|
||||
hModule = pLoadLibraryEx(filename, NULL, LOAD_LIBRARY_SEARCH_SYSTEM32);
|
||||
}
|
||||
else {
|
||||
/* Attempt to get the Windows system path */
|
||||
UINT systemdirlen = GetSystemDirectory(NULL, 0);
|
||||
if(systemdirlen) {
|
||||
/* Allocate space for the full DLL path (Room for the null terminator
|
||||
is included in systemdirlen) */
|
||||
size_t filenamelen = _tcslen(filename);
|
||||
TCHAR *path = malloc(sizeof(TCHAR) * (systemdirlen + 1 + filenamelen));
|
||||
if(path && GetSystemDirectory(path, systemdirlen)) {
|
||||
/* Calculate the full DLL path */
|
||||
_tcscpy(path + _tcslen(path), TEXT("\\"));
|
||||
_tcscpy(path + _tcslen(path), filename);
|
||||
|
||||
/* Load the DLL from the Windows system directory */
|
||||
/** !checksrc! disable BANNEDFUNC 1 **/
|
||||
hModule = pLoadLibraryEx ?
|
||||
pLoadLibraryEx(path, NULL, LOAD_WITH_ALTERED_SEARCH_PATH) :
|
||||
LoadLibrary(path);
|
||||
|
||||
}
|
||||
free(path);
|
||||
}
|
||||
}
|
||||
|
||||
return hModule;
|
||||
}
|
||||
|
||||
#else /* defined(_WIN32) */
|
||||
|
||||
/* ISO C requires a translation unit to contain at least one declaration
|
||||
[-Wempty-translation-unit] */
|
||||
typedef int _TRANSLATION_UNIT_LOAD_LIBRARY_C_NOT_EMTPY;
|
||||
|
||||
#endif /* defined(_WIN32) */
|
@ -6,8 +6,8 @@
|
||||
\___/_/\_\ .__/ \__,_|\__|
|
||||
|_| XML parser
|
||||
|
||||
Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
|
||||
Copyright (c) 2000-2017 Expat development team
|
||||
Copyright (c) 2000 Clark Cooper <coopercc@users.sourceforge.net>
|
||||
Copyright (c) 2017 Sebastian Pipping <sebastian@pipping.org>
|
||||
Licensed under the MIT license:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
|
@ -11,6 +11,9 @@
|
||||
* --------------------------------------------------------------------------
|
||||
* HISTORY:
|
||||
*
|
||||
* 2020-10-03 (Sebastian Pipping)
|
||||
* - Drop support for Visual Studio 9.0/2008 and earlier
|
||||
*
|
||||
* 2019-08-03 (Sebastian Pipping)
|
||||
* - Mark part of sip24_valid as to be excluded from clang-format
|
||||
* - Re-format code using clang-format 9
|
||||
@ -96,15 +99,7 @@
|
||||
#define SIPHASH_H
|
||||
|
||||
#include <stddef.h> /* size_t */
|
||||
|
||||
#if defined(_WIN32) && defined(_MSC_VER) && (_MSC_VER < 1600)
|
||||
/* For vs2003/7.1 up to vs2008/9.0; _MSC_VER 1600 is vs2010/10.0 */
|
||||
typedef unsigned __int8 uint8_t;
|
||||
typedef unsigned __int32 uint32_t;
|
||||
typedef unsigned __int64 uint64_t;
|
||||
#else
|
||||
# include <stdint.h> /* uint64_t uint32_t uint8_t */
|
||||
#endif
|
||||
#include <stdint.h> /* uint64_t uint32_t uint8_t */
|
||||
|
||||
/*
|
||||
* Workaround to not require a C++11 compiler for using ULL suffix
|
||||
|
@ -7,7 +7,9 @@
|
||||
|_| XML parser
|
||||
|
||||
Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
|
||||
Copyright (c) 2000-2017 Expat development team
|
||||
Copyright (c) 2000 Clark Cooper <coopercc@users.sourceforge.net>
|
||||
Copyright (c) 2002 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
|
||||
Copyright (c) 2017 Sebastian Pipping <sebastian@pipping.org>
|
||||
Licensed under the MIT license:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
|
1435
lib/xmlparse.c
1435
lib/xmlparse.c
File diff suppressed because it is too large
Load Diff
@ -7,7 +7,15 @@
|
||||
|_| XML parser
|
||||
|
||||
Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
|
||||
Copyright (c) 2000-2017 Expat development team
|
||||
Copyright (c) 2000 Clark Cooper <coopercc@users.sourceforge.net>
|
||||
Copyright (c) 2002 Greg Stein <gstein@users.sourceforge.net>
|
||||
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 <ssolie@users.sourceforge.net>
|
||||
Copyright (c) 2016-2021 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>
|
||||
Licensed under the MIT license:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
@ -30,15 +38,13 @@
|
||||
USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <expat_config.h>
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
#ifdef _WIN32
|
||||
# include "winconfig.h"
|
||||
#else
|
||||
# ifdef HAVE_EXPAT_CONFIG_H
|
||||
# include <expat_config.h>
|
||||
# endif
|
||||
#endif /* ndef _WIN32 */
|
||||
#endif
|
||||
|
||||
#include "expat_external.h"
|
||||
#include "internal.h"
|
||||
@ -1220,6 +1226,8 @@ common(PROLOG_STATE *state, int tok) {
|
||||
#ifdef XML_DTD
|
||||
if (! state->documentEntity && tok == XML_TOK_PARAM_ENTITY_REF)
|
||||
return XML_ROLE_INNER_PARAM_ENTITY_REF;
|
||||
#else
|
||||
UNUSED_P(tok);
|
||||
#endif
|
||||
state->handler = error;
|
||||
return XML_ROLE_ERROR;
|
||||
|
@ -7,7 +7,10 @@
|
||||
|_| XML parser
|
||||
|
||||
Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
|
||||
Copyright (c) 2000-2017 Expat development team
|
||||
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>
|
||||
Licensed under the MIT license:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
|
45
lib/xmltok.c
45
lib/xmltok.c
@ -7,7 +7,20 @@
|
||||
|_| XML parser
|
||||
|
||||
Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
|
||||
Copyright (c) 2000-2017 Expat development team
|
||||
Copyright (c) 2000 Clark Cooper <coopercc@users.sourceforge.net>
|
||||
Copyright (c) 2001-2003 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
|
||||
Copyright (c) 2002 Greg Stein <gstein@users.sourceforge.net>
|
||||
Copyright (c) 2002-2016 Karl Waclawek <karl@waclawek.net>
|
||||
Copyright (c) 2005-2009 Steven Solie <ssolie@users.sourceforge.net>
|
||||
Copyright (c) 2016-2021 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>
|
||||
Copyright (c) 2017 Alexander Bluhm <alexander.bluhm@gmx.net>
|
||||
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>
|
||||
Licensed under the MIT license:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
@ -30,25 +43,15 @@
|
||||
USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <expat_config.h>
|
||||
|
||||
#include <stddef.h>
|
||||
#include <string.h> /* memcpy */
|
||||
|
||||
#if defined(_MSC_VER) && (_MSC_VER <= 1700)
|
||||
/* for vs2012/11.0/1700 and earlier Visual Studio compilers */
|
||||
# define bool int
|
||||
# define false 0
|
||||
# define true 1
|
||||
#else
|
||||
# include <stdbool.h>
|
||||
#endif
|
||||
#include <stdbool.h>
|
||||
|
||||
#ifdef _WIN32
|
||||
# include "winconfig.h"
|
||||
#else
|
||||
# ifdef HAVE_EXPAT_CONFIG_H
|
||||
# include <expat_config.h>
|
||||
# endif
|
||||
#endif /* ndef _WIN32 */
|
||||
#endif
|
||||
|
||||
#include "expat_external.h"
|
||||
#include "internal.h"
|
||||
@ -269,8 +272,14 @@ sb_byteToAscii(const ENCODING *enc, const char *p) {
|
||||
|
||||
#define IS_NAME_CHAR(enc, p, n) (AS_NORMAL_ENCODING(enc)->isName##n(enc, p))
|
||||
#define IS_NMSTRT_CHAR(enc, p, n) (AS_NORMAL_ENCODING(enc)->isNmstrt##n(enc, p))
|
||||
#define IS_INVALID_CHAR(enc, p, n) \
|
||||
#ifdef XML_MIN_SIZE
|
||||
# define IS_INVALID_CHAR(enc, p, n) \
|
||||
(AS_NORMAL_ENCODING(enc)->isInvalid##n \
|
||||
&& AS_NORMAL_ENCODING(enc)->isInvalid##n(enc, p))
|
||||
#else
|
||||
# define IS_INVALID_CHAR(enc, p, n) \
|
||||
(AS_NORMAL_ENCODING(enc)->isInvalid##n(enc, p))
|
||||
#endif
|
||||
|
||||
#ifdef XML_MIN_SIZE
|
||||
# define IS_NAME_CHAR_MINBPC(enc, p) \
|
||||
@ -589,13 +598,13 @@ static const struct normal_encoding ascii_encoding
|
||||
static int PTRFASTCALL
|
||||
unicode_byte_type(char hi, char lo) {
|
||||
switch ((unsigned char)hi) {
|
||||
/* 0xD800–0xDBFF first 16-bit code unit or high surrogate (W1) */
|
||||
/* 0xD800-0xDBFF first 16-bit code unit or high surrogate (W1) */
|
||||
case 0xD8:
|
||||
case 0xD9:
|
||||
case 0xDA:
|
||||
case 0xDB:
|
||||
return BT_LEAD4;
|
||||
/* 0xDC00–0xDFFF second 16-bit code unit or low surrogate (W2) */
|
||||
/* 0xDC00-0xDFFF second 16-bit code unit or low surrogate (W2) */
|
||||
case 0xDC:
|
||||
case 0xDD:
|
||||
case 0xDE:
|
||||
|
@ -7,7 +7,11 @@
|
||||
|_| XML parser
|
||||
|
||||
Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
|
||||
Copyright (c) 2000-2017 Expat development team
|
||||
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) 2017 Rhodri James <rhodri@wildebeest.org.uk>
|
||||
Licensed under the MIT license:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* This file is included!
|
||||
/* This file is included (from xmltok.c, 1-3 times depending on XML_MIN_SIZE)!
|
||||
__ __ _
|
||||
___\ \/ /_ __ __ _| |_
|
||||
/ _ \\ /| '_ \ / _` | __|
|
||||
@ -7,7 +7,15 @@
|
||||
|_| XML parser
|
||||
|
||||
Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
|
||||
Copyright (c) 2000-2017 Expat development team
|
||||
Copyright (c) 2000 Clark Cooper <coopercc@users.sourceforge.net>
|
||||
Copyright (c) 2002 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
|
||||
Copyright (c) 2002-2016 Karl Waclawek <karl@waclawek.net>
|
||||
Copyright (c) 2016-2021 Sebastian Pipping <sebastian@pipping.org>
|
||||
Copyright (c) 2017 Rhodri James <rhodri@wildebeest.org.uk>
|
||||
Copyright (c) 2018 Benjamin Peterson <benjamin@python.org>
|
||||
Copyright (c) 2018 Anton Maklakov <antmak.pub@gmail.com>
|
||||
Copyright (c) 2019 David Loffredo <loffredo@steptools.com>
|
||||
Copyright (c) 2020 Boris Kolpackov <boris@codesynthesis.com>
|
||||
Licensed under the MIT license:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
@ -32,7 +40,7 @@
|
||||
|
||||
#ifdef XML_TOK_IMPL_C
|
||||
|
||||
# ifndef IS_INVALID_CHAR
|
||||
# ifndef IS_INVALID_CHAR // i.e. for UTF-16 and XML_MIN_SIZE not defined
|
||||
# define IS_INVALID_CHAR(enc, ptr, n) (0)
|
||||
# endif
|
||||
|
||||
@ -1768,13 +1776,14 @@ PREFIX(updatePosition)(const ENCODING *enc, const char *ptr, const char *end,
|
||||
# define LEAD_CASE(n) \
|
||||
case BT_LEAD##n: \
|
||||
ptr += n; \
|
||||
pos->columnNumber++; \
|
||||
break;
|
||||
LEAD_CASE(2)
|
||||
LEAD_CASE(3)
|
||||
LEAD_CASE(4)
|
||||
# undef LEAD_CASE
|
||||
case BT_LF:
|
||||
pos->columnNumber = (XML_Size)-1;
|
||||
pos->columnNumber = 0;
|
||||
pos->lineNumber++;
|
||||
ptr += MINBPC(enc);
|
||||
break;
|
||||
@ -1783,13 +1792,13 @@ PREFIX(updatePosition)(const ENCODING *enc, const char *ptr, const char *end,
|
||||
ptr += MINBPC(enc);
|
||||
if (HAS_CHAR(enc, ptr, end) && BYTE_TYPE(enc, ptr) == BT_LF)
|
||||
ptr += MINBPC(enc);
|
||||
pos->columnNumber = (XML_Size)-1;
|
||||
pos->columnNumber = 0;
|
||||
break;
|
||||
default:
|
||||
ptr += MINBPC(enc);
|
||||
pos->columnNumber++;
|
||||
break;
|
||||
}
|
||||
pos->columnNumber++;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -7,7 +7,8 @@
|
||||
|_| XML parser
|
||||
|
||||
Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
|
||||
Copyright (c) 2000-2017 Expat development team
|
||||
Copyright (c) 2000 Clark Cooper <coopercc@users.sourceforge.net>
|
||||
Copyright (c) 2017-2019 Sebastian Pipping <sebastian@pipping.org>
|
||||
Licensed under the MIT license:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
|
@ -7,7 +7,11 @@
|
||||
|_| XML parser
|
||||
|
||||
Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
|
||||
Copyright (c) 2000-2017 Expat development team
|
||||
Copyright (c) 2000 Clark Cooper <coopercc@users.sourceforge.net>
|
||||
Copyright (c) 2002 Greg Stein <gstein@users.sourceforge.net>
|
||||
Copyright (c) 2002 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
|
||||
Copyright (c) 2002-2006 Karl Waclawek <karl@waclawek.net>
|
||||
Copyright (c) 2017-2021 Sebastian Pipping <sebastian@pipping.org>
|
||||
Licensed under the MIT license:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
@ -89,7 +93,7 @@ NS(XmlInitEncoding)(INIT_ENCODING *p, const ENCODING **encPtr,
|
||||
static const ENCODING *
|
||||
NS(findEncoding)(const ENCODING *enc, const char *ptr, const char *end) {
|
||||
# define ENCODING_MAX 128
|
||||
char buf[ENCODING_MAX];
|
||||
char buf[ENCODING_MAX] = "";
|
||||
char *p = buf;
|
||||
int i;
|
||||
XmlUtf8Convert(enc, &ptr, end, &p, p + ENCODING_MAX - 1);
|
||||
|
39
run.sh.in
39
run.sh.in
@ -1,11 +1,46 @@
|
||||
#! /usr/bin/env bash
|
||||
# Copyright (C) 2017 Expat development team
|
||||
# Licensed under the MIT license
|
||||
# __ __ _
|
||||
# ___\ \/ /_ __ __ _| |_
|
||||
# / _ \\ /| '_ \ / _` | __|
|
||||
# | __// \| |_) | (_| | |_
|
||||
# \___/_/\_\ .__/ \__,_|\__|
|
||||
# |_| XML parser
|
||||
#
|
||||
# Copyright (c) 2017-2022 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.
|
||||
|
||||
case "@host@" in
|
||||
*-mingw*)
|
||||
case "$(uname -o)" in
|
||||
Cygwin|Msys)
|
||||
# Windows binary on Windows host
|
||||
exec "$@"
|
||||
;;
|
||||
*)
|
||||
# Windows binary on non-Windows host
|
||||
exec wine "$@"
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
*)
|
||||
exec "$@"
|
||||
;;
|
||||
|
@ -6,7 +6,8 @@
|
||||
# \___/_/\_\ .__/ \__,_|\__|
|
||||
# |_| XML parser
|
||||
#
|
||||
# Copyright (c) 2017 Expat development team
|
||||
# Copyright (c) 2017 Sebastian Pipping <sebastian@pipping.org>
|
||||
# Copyright (c) 2019 Jeffrey Walton <noloader@gmail.com>
|
||||
# Licensed under the MIT license:
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
|
@ -6,7 +6,9 @@
|
||||
# \___/_/\_\ .__/ \__,_|\__|
|
||||
# |_| XML parser
|
||||
#
|
||||
# Copyright (c) 2017 Expat development team
|
||||
# Copyright (c) 2017-2021 Sebastian Pipping <sebastian@pipping.org>
|
||||
# Copyright (c) 2017 Rhodri James <rhodri@wildebeest.org.uk>
|
||||
# Copyright (c) 2020 Jeffrey Walton <noloader@gmail.com>
|
||||
# Licensed under the MIT license:
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
@ -30,7 +32,7 @@
|
||||
|
||||
SUBDIRS = . benchmark
|
||||
|
||||
AM_CPPFLAGS = -I$(srcdir)/../lib
|
||||
AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(srcdir)/../lib
|
||||
|
||||
noinst_LIBRARIES = libruntests.a
|
||||
|
||||
@ -52,8 +54,11 @@ runtests_SOURCES = \
|
||||
runtestspp_SOURCES = \
|
||||
runtestspp.cpp
|
||||
|
||||
runtests_LDADD = libruntests.a ../lib/libexpat.la
|
||||
runtestspp_LDADD = libruntests.a ../lib/libexpat.la
|
||||
runtests_LDADD = libruntests.a ../lib/libexpatinternal.la
|
||||
runtestspp_LDADD = libruntests.a ../lib/libexpatinternal.la
|
||||
|
||||
runtests_LDFLAGS = @AM_LDFLAGS@ @LIBM@
|
||||
runtestspp_LDFLAGS = @AM_LDFLAGS@ @LIBM@
|
||||
|
||||
EXTRA_DIST = \
|
||||
chardata.h \
|
||||
|
@ -1,7 +1,7 @@
|
||||
# Makefile.in generated by automake 1.16.1 from Makefile.am.
|
||||
# Makefile.in generated by automake 1.16.5 from Makefile.am.
|
||||
# @configure_input@
|
||||
|
||||
# Copyright (C) 1994-2018 Free Software Foundation, Inc.
|
||||
# Copyright (C) 1994-2021 Free Software Foundation, Inc.
|
||||
|
||||
# This Makefile.in is free software; the Free Software Foundation
|
||||
# gives unlimited permission to copy and/or distribute it,
|
||||
@ -22,7 +22,9 @@
|
||||
# \___/_/\_\ .__/ \__,_|\__|
|
||||
# |_| XML parser
|
||||
#
|
||||
# Copyright (c) 2017 Expat development team
|
||||
# Copyright (c) 2017-2021 Sebastian Pipping <sebastian@pipping.org>
|
||||
# Copyright (c) 2017 Rhodri James <rhodri@wildebeest.org.uk>
|
||||
# Copyright (c) 2020 Jeffrey Walton <noloader@gmail.com>
|
||||
# Licensed under the MIT license:
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
@ -154,14 +156,20 @@ am_libruntests_a_OBJECTS = chardata.$(OBJEXT) structdata.$(OBJEXT) \
|
||||
libruntests_a_OBJECTS = $(am_libruntests_a_OBJECTS)
|
||||
am_runtests_OBJECTS = runtests.$(OBJEXT)
|
||||
runtests_OBJECTS = $(am_runtests_OBJECTS)
|
||||
runtests_DEPENDENCIES = libruntests.a ../lib/libexpat.la
|
||||
runtests_DEPENDENCIES = libruntests.a ../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
|
||||
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/libexpat.la
|
||||
runtestspp_DEPENDENCIES = libruntests.a ../lib/libexpatinternal.la
|
||||
runtestspp_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
|
||||
$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
|
||||
$(CXXFLAGS) $(runtestspp_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
|
||||
@ -259,8 +267,6 @@ am__define_uniq_tagged_files = \
|
||||
unique=`for i in $$list; do \
|
||||
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
||||
done | $(am__uniquify_input)`
|
||||
ETAGS = etags
|
||||
CTAGS = ctags
|
||||
am__tty_colors_dummy = \
|
||||
mgn= red= grn= lgn= blu= brg= std=; \
|
||||
am__color_tests=no
|
||||
@ -443,6 +449,7 @@ am__set_TESTS_bases = \
|
||||
bases='$(TEST_LOGS)'; \
|
||||
bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
|
||||
bases=`echo $$bases`
|
||||
AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)'
|
||||
RECHECK_LOGS = $(TEST_LOGS)
|
||||
TEST_SUITE_LOG = test-suite.log
|
||||
TEST_EXTENSIONS = @EXEEXT@ .test
|
||||
@ -495,7 +502,11 @@ am__relativize = \
|
||||
reldir="$$dir2"
|
||||
ACLOCAL = @ACLOCAL@
|
||||
AMTAR = @AMTAR@
|
||||
AM_CFLAGS = @AM_CFLAGS@
|
||||
AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(srcdir)/../lib
|
||||
AM_CXXFLAGS = @AM_CXXFLAGS@
|
||||
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
|
||||
AM_LDFLAGS = @AM_LDFLAGS@
|
||||
AR = @AR@
|
||||
AS = @AS@
|
||||
AUTOCONF = @AUTOCONF@
|
||||
@ -505,8 +516,9 @@ AWK = @AWK@
|
||||
CC = @CC@
|
||||
CCDEPMODE = @CCDEPMODE@
|
||||
CFLAGS = @CFLAGS@
|
||||
CPP = @CPP@
|
||||
CPPFLAGS = @CPPFLAGS@
|
||||
CSCOPE = @CSCOPE@
|
||||
CTAGS = @CTAGS@
|
||||
CXX = @CXX@
|
||||
CXXCPP = @CXXCPP@
|
||||
CXXDEPMODE = @CXXDEPMODE@
|
||||
@ -522,7 +534,15 @@ ECHO_C = @ECHO_C@
|
||||
ECHO_N = @ECHO_N@
|
||||
ECHO_T = @ECHO_T@
|
||||
EGREP = @EGREP@
|
||||
ETAGS = @ETAGS@
|
||||
EXEEXT = @EXEEXT@
|
||||
EXPAT_ATTR_INFO = @EXPAT_ATTR_INFO@
|
||||
EXPAT_CHAR_TYPE = @EXPAT_CHAR_TYPE@
|
||||
EXPAT_CONTEXT_BYTES = @EXPAT_CONTEXT_BYTES@
|
||||
EXPAT_DTD = @EXPAT_DTD@
|
||||
EXPAT_LARGE_SIZE = @EXPAT_LARGE_SIZE@
|
||||
EXPAT_MIN_SIZE = @EXPAT_MIN_SIZE@
|
||||
EXPAT_NS = @EXPAT_NS@
|
||||
FGREP = @FGREP@
|
||||
FILEMAP = @FILEMAP@
|
||||
GREP = @GREP@
|
||||
@ -535,6 +555,8 @@ LD = @LD@
|
||||
LDFLAGS = @LDFLAGS@
|
||||
LIBAGE = @LIBAGE@
|
||||
LIBCURRENT = @LIBCURRENT@
|
||||
LIBDIR_BASENAME = @LIBDIR_BASENAME@
|
||||
LIBM = @LIBM@
|
||||
LIBOBJS = @LIBOBJS@
|
||||
LIBREVISION = @LIBREVISION@
|
||||
LIBS = @LIBS@
|
||||
@ -564,6 +586,9 @@ RANLIB = @RANLIB@
|
||||
SED = @SED@
|
||||
SET_MAKE = @SET_MAKE@
|
||||
SHELL = @SHELL@
|
||||
SO_MAJOR = @SO_MAJOR@
|
||||
SO_MINOR = @SO_MINOR@
|
||||
SO_PATCH = @SO_PATCH@
|
||||
STRIP = @STRIP@
|
||||
VERSION = @VERSION@
|
||||
abs_builddir = @abs_builddir@
|
||||
@ -574,6 +599,7 @@ ac_ct_AR = @ac_ct_AR@
|
||||
ac_ct_CC = @ac_ct_CC@
|
||||
ac_ct_CXX = @ac_ct_CXX@
|
||||
ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
|
||||
ac_cv_sizeof_void_p = @ac_cv_sizeof_void_p@
|
||||
am__include = @am__include@
|
||||
am__leading_dot = @am__leading_dot@
|
||||
am__quote = @am__quote@
|
||||
@ -611,6 +637,7 @@ pdfdir = @pdfdir@
|
||||
prefix = @prefix@
|
||||
program_transform_name = @program_transform_name@
|
||||
psdir = @psdir@
|
||||
runstatedir = @runstatedir@
|
||||
sbindir = @sbindir@
|
||||
sharedstatedir = @sharedstatedir@
|
||||
srcdir = @srcdir@
|
||||
@ -620,7 +647,6 @@ top_build_prefix = @top_build_prefix@
|
||||
top_builddir = @top_builddir@
|
||||
top_srcdir = @top_srcdir@
|
||||
SUBDIRS = . benchmark
|
||||
AM_CPPFLAGS = -I$(srcdir)/../lib
|
||||
noinst_LIBRARIES = libruntests.a
|
||||
|
||||
# To support MinGW and Non-MinGW at the same time:
|
||||
@ -637,8 +663,10 @@ runtests_SOURCES = \
|
||||
runtestspp_SOURCES = \
|
||||
runtestspp.cpp
|
||||
|
||||
runtests_LDADD = libruntests.a ../lib/libexpat.la
|
||||
runtestspp_LDADD = libruntests.a ../lib/libexpat.la
|
||||
runtests_LDADD = libruntests.a ../lib/libexpatinternal.la
|
||||
runtestspp_LDADD = libruntests.a ../lib/libexpatinternal.la
|
||||
runtests_LDFLAGS = @AM_LDFLAGS@ @LIBM@
|
||||
runtestspp_LDFLAGS = @AM_LDFLAGS@ @LIBM@
|
||||
EXTRA_DIST = \
|
||||
chardata.h \
|
||||
structdata.h \
|
||||
@ -702,11 +730,11 @@ libruntests.a: $(libruntests_a_OBJECTS) $(libruntests_a_DEPENDENCIES) $(EXTRA_li
|
||||
|
||||
runtests$(EXEEXT): $(runtests_OBJECTS) $(runtests_DEPENDENCIES) $(EXTRA_runtests_DEPENDENCIES)
|
||||
@rm -f runtests$(EXEEXT)
|
||||
$(AM_V_CCLD)$(LINK) $(runtests_OBJECTS) $(runtests_LDADD) $(LIBS)
|
||||
$(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)$(CXXLINK) $(runtestspp_OBJECTS) $(runtestspp_LDADD) $(LIBS)
|
||||
$(AM_V_CXXLD)$(runtestspp_LINK) $(runtestspp_OBJECTS) $(runtestspp_LDADD) $(LIBS)
|
||||
|
||||
mostlyclean-compile:
|
||||
-rm -f *.$(OBJEXT)
|
||||
@ -981,7 +1009,7 @@ $(TEST_SUITE_LOG): $(TEST_LOGS)
|
||||
test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \
|
||||
fi; \
|
||||
echo "$${col}$$br$${std}"; \
|
||||
echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \
|
||||
echo "$${col}Testsuite summary"$(AM_TESTSUITE_SUMMARY_HEADER)"$${std}"; \
|
||||
echo "$${col}$$br$${std}"; \
|
||||
create_testsuite_report --maybe-color; \
|
||||
echo "$$col$$br$$std"; \
|
||||
@ -1043,7 +1071,6 @@ runtestspp.log: runtestspp$(EXEEXT)
|
||||
@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \
|
||||
@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
|
||||
@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT)
|
||||
|
||||
distdir: $(BUILT_SOURCES)
|
||||
$(MAKE) $(AM_MAKEFLAGS) distdir-am
|
||||
|
||||
|
@ -6,7 +6,8 @@
|
||||
# \___/_/\_\ .__/ \__,_|\__|
|
||||
# |_| XML parser
|
||||
#
|
||||
# Copyright (c) 2017 Expat development team
|
||||
# Copyright (c) 2017 Sebastian Pipping <sebastian@pipping.org>
|
||||
# Copyright (c) 2020 Jeffrey Walton <noloader@gmail.com>
|
||||
# Licensed under the MIT license:
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
@ -28,7 +29,7 @@
|
||||
# OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||
# USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
AM_CPPFLAGS = -I$(srcdir)/../../lib
|
||||
AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(srcdir)/../../lib
|
||||
|
||||
noinst_PROGRAMS = benchmark
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
# Makefile.in generated by automake 1.16.1 from Makefile.am.
|
||||
# Makefile.in generated by automake 1.16.5 from Makefile.am.
|
||||
# @configure_input@
|
||||
|
||||
# Copyright (C) 1994-2018 Free Software Foundation, Inc.
|
||||
# Copyright (C) 1994-2021 Free Software Foundation, Inc.
|
||||
|
||||
# This Makefile.in is free software; the Free Software Foundation
|
||||
# gives unlimited permission to copy and/or distribute it,
|
||||
@ -22,7 +22,8 @@
|
||||
# \___/_/\_\ .__/ \__,_|\__|
|
||||
# |_| XML parser
|
||||
#
|
||||
# Copyright (c) 2017 Expat development team
|
||||
# Copyright (c) 2017 Sebastian Pipping <sebastian@pipping.org>
|
||||
# Copyright (c) 2020 Jeffrey Walton <noloader@gmail.com>
|
||||
# Licensed under the MIT license:
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
@ -207,14 +208,16 @@ am__define_uniq_tagged_files = \
|
||||
unique=`for i in $$list; do \
|
||||
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
||||
done | $(am__uniquify_input)`
|
||||
ETAGS = etags
|
||||
CTAGS = ctags
|
||||
am__DIST_COMMON = $(srcdir)/Makefile.in \
|
||||
$(top_srcdir)/conftools/depcomp
|
||||
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
||||
ACLOCAL = @ACLOCAL@
|
||||
AMTAR = @AMTAR@
|
||||
AM_CFLAGS = @AM_CFLAGS@
|
||||
AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(srcdir)/../../lib
|
||||
AM_CXXFLAGS = @AM_CXXFLAGS@
|
||||
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
|
||||
AM_LDFLAGS = @AM_LDFLAGS@
|
||||
AR = @AR@
|
||||
AS = @AS@
|
||||
AUTOCONF = @AUTOCONF@
|
||||
@ -224,8 +227,9 @@ AWK = @AWK@
|
||||
CC = @CC@
|
||||
CCDEPMODE = @CCDEPMODE@
|
||||
CFLAGS = @CFLAGS@
|
||||
CPP = @CPP@
|
||||
CPPFLAGS = @CPPFLAGS@
|
||||
CSCOPE = @CSCOPE@
|
||||
CTAGS = @CTAGS@
|
||||
CXX = @CXX@
|
||||
CXXCPP = @CXXCPP@
|
||||
CXXDEPMODE = @CXXDEPMODE@
|
||||
@ -241,7 +245,15 @@ ECHO_C = @ECHO_C@
|
||||
ECHO_N = @ECHO_N@
|
||||
ECHO_T = @ECHO_T@
|
||||
EGREP = @EGREP@
|
||||
ETAGS = @ETAGS@
|
||||
EXEEXT = @EXEEXT@
|
||||
EXPAT_ATTR_INFO = @EXPAT_ATTR_INFO@
|
||||
EXPAT_CHAR_TYPE = @EXPAT_CHAR_TYPE@
|
||||
EXPAT_CONTEXT_BYTES = @EXPAT_CONTEXT_BYTES@
|
||||
EXPAT_DTD = @EXPAT_DTD@
|
||||
EXPAT_LARGE_SIZE = @EXPAT_LARGE_SIZE@
|
||||
EXPAT_MIN_SIZE = @EXPAT_MIN_SIZE@
|
||||
EXPAT_NS = @EXPAT_NS@
|
||||
FGREP = @FGREP@
|
||||
FILEMAP = @FILEMAP@
|
||||
GREP = @GREP@
|
||||
@ -254,6 +266,8 @@ LD = @LD@
|
||||
LDFLAGS = @LDFLAGS@
|
||||
LIBAGE = @LIBAGE@
|
||||
LIBCURRENT = @LIBCURRENT@
|
||||
LIBDIR_BASENAME = @LIBDIR_BASENAME@
|
||||
LIBM = @LIBM@
|
||||
LIBOBJS = @LIBOBJS@
|
||||
LIBREVISION = @LIBREVISION@
|
||||
LIBS = @LIBS@
|
||||
@ -283,6 +297,9 @@ RANLIB = @RANLIB@
|
||||
SED = @SED@
|
||||
SET_MAKE = @SET_MAKE@
|
||||
SHELL = @SHELL@
|
||||
SO_MAJOR = @SO_MAJOR@
|
||||
SO_MINOR = @SO_MINOR@
|
||||
SO_PATCH = @SO_PATCH@
|
||||
STRIP = @STRIP@
|
||||
VERSION = @VERSION@
|
||||
abs_builddir = @abs_builddir@
|
||||
@ -293,6 +310,7 @@ ac_ct_AR = @ac_ct_AR@
|
||||
ac_ct_CC = @ac_ct_CC@
|
||||
ac_ct_CXX = @ac_ct_CXX@
|
||||
ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
|
||||
ac_cv_sizeof_void_p = @ac_cv_sizeof_void_p@
|
||||
am__include = @am__include@
|
||||
am__leading_dot = @am__leading_dot@
|
||||
am__quote = @am__quote@
|
||||
@ -330,6 +348,7 @@ pdfdir = @pdfdir@
|
||||
prefix = @prefix@
|
||||
program_transform_name = @program_transform_name@
|
||||
psdir = @psdir@
|
||||
runstatedir = @runstatedir@
|
||||
sbindir = @sbindir@
|
||||
sharedstatedir = @sharedstatedir@
|
||||
srcdir = @srcdir@
|
||||
@ -338,7 +357,6 @@ target_alias = @target_alias@
|
||||
top_build_prefix = @top_build_prefix@
|
||||
top_builddir = @top_builddir@
|
||||
top_srcdir = @top_srcdir@
|
||||
AM_CPPFLAGS = -I$(srcdir)/../../lib
|
||||
benchmark_SOURCES = benchmark.c
|
||||
benchmark_LDADD = ../../lib/libexpat.la
|
||||
EXTRA_DIST = \
|
||||
@ -483,7 +501,6 @@ cscopelist-am: $(am__tagged_files)
|
||||
|
||||
distclean-tags:
|
||||
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
|
||||
|
||||
distdir: $(BUILT_SOURCES)
|
||||
$(MAKE) $(AM_MAKEFLAGS) distdir-am
|
||||
|
||||
|
@ -6,8 +6,10 @@
|
||||
\___/_/\_\ .__/ \__,_|\__|
|
||||
|_| XML parser
|
||||
|
||||
Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
|
||||
Copyright (c) 2000-2017 Expat development team
|
||||
Copyright (c) 2003-2006 Karl Waclawek <karl@waclawek.net>
|
||||
Copyright (c) 2005-2007 Steven Solie <ssolie@users.sourceforge.net>
|
||||
Copyright (c) 2017 Sebastian Pipping <sebastian@pipping.org>
|
||||
Copyright (c) 2017 Rhodri James <rhodri@wildebeest.org.uk>
|
||||
Licensed under the MIT license:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
|
@ -1,25 +0,0 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio 2013
|
||||
VisualStudioVersion = 12.0.40629.0
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "benchmark", "benchmark.vcxproj", "{FF89BA66-62C4-49EC-9189-1E7B603A1FD6}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Win32 = Debug|Win32
|
||||
Release|Win32 = Release|Win32
|
||||
Template|Win32 = Template|Win32
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{FF89BA66-62C4-49EC-9189-1E7B603A1FD6}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||
{FF89BA66-62C4-49EC-9189-1E7B603A1FD6}.Debug|Win32.Build.0 = Debug|Win32
|
||||
{FF89BA66-62C4-49EC-9189-1E7B603A1FD6}.Release|Win32.ActiveCfg = Release|Win32
|
||||
{FF89BA66-62C4-49EC-9189-1E7B603A1FD6}.Release|Win32.Build.0 = Release|Win32
|
||||
{FF89BA66-62C4-49EC-9189-1E7B603A1FD6}.Template|Win32.ActiveCfg = Template|Win32
|
||||
{FF89BA66-62C4-49EC-9189-1E7B603A1FD6}.Template|Win32.Build.0 = Template|Win32
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
EndGlobal
|
@ -6,8 +6,12 @@
|
||||
\___/_/\_\ .__/ \__,_|\__|
|
||||
|_| XML parser
|
||||
|
||||
Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
|
||||
Copyright (c) 2000-2017 Expat development team
|
||||
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) 2017 Joe Orton <jorton@redhat.com>
|
||||
Copyright (c) 2017 Rhodri James <rhodri@wildebeest.org.uk>
|
||||
Licensed under the MIT license:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
@ -30,9 +34,7 @@
|
||||
USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_EXPAT_CONFIG_H
|
||||
# include <expat_config.h>
|
||||
#endif
|
||||
#include <expat_config.h>
|
||||
#include "minicheck.h"
|
||||
|
||||
#include <assert.h>
|
||||
|
@ -7,8 +7,9 @@
|
||||
\___/_/\_\ .__/ \__,_|\__|
|
||||
|_| XML parser
|
||||
|
||||
Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
|
||||
Copyright (c) 2000-2017 Expat development team
|
||||
Copyright (c) 2002-2004 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
|
||||
Copyright (c) 2017 Rhodri James <rhodri@wildebeest.org.uk>
|
||||
Copyright (c) 2017 Sebastian Pipping <sebastian@pipping.org>
|
||||
Licensed under the MIT license:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
|
@ -6,8 +6,8 @@
|
||||
\___/_/\_\ .__/ \__,_|\__|
|
||||
|_| XML parser
|
||||
|
||||
Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
|
||||
Copyright (c) 2000-2017 Expat development team
|
||||
Copyright (c) 2017 Rhodri James <rhodri@wildebeest.org.uk>
|
||||
Copyright (c) 2017 Sebastian Pipping <sebastian@pipping.org>
|
||||
Licensed under the MIT license:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
|
@ -7,8 +7,8 @@
|
||||
\___/_/\_\ .__/ \__,_|\__|
|
||||
|_| XML parser
|
||||
|
||||
Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
|
||||
Copyright (c) 2000-2017 Expat development team
|
||||
Copyright (c) 2017 Rhodri James <rhodri@wildebeest.org.uk>
|
||||
Copyright (c) 2017 Sebastian Pipping <sebastian@pipping.org>
|
||||
Licensed under the MIT license:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
|
@ -10,8 +10,11 @@
|
||||
\___/_/\_\ .__/ \__,_|\__|
|
||||
|_| XML parser
|
||||
|
||||
Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
|
||||
Copyright (c) 2000-2017 Expat development team
|
||||
Copyright (c) 2004-2006 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
|
||||
Copyright (c) 2016-2020 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>
|
||||
Licensed under the MIT license:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
@ -141,11 +144,18 @@ _check_set_test_info(char const *function, char const *filename, int lineno) {
|
||||
}
|
||||
|
||||
static void
|
||||
add_failure(SRunner *runner, int verbosity) {
|
||||
runner->nfailures++;
|
||||
handle_success(int verbosity) {
|
||||
if (verbosity >= CK_VERBOSE) {
|
||||
printf("%s:%d: %s\n", _check_current_filename, _check_current_lineno,
|
||||
_check_current_function);
|
||||
printf("PASS: %s\n", _check_current_function);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
handle_failure(SRunner *runner, int verbosity, 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);
|
||||
}
|
||||
}
|
||||
|
||||
@ -164,14 +174,14 @@ srunner_run_all(SRunner *runner, int verbosity) {
|
||||
if (tc->setup != NULL) {
|
||||
/* setup */
|
||||
if (setjmp(env)) {
|
||||
add_failure(runner, verbosity);
|
||||
handle_failure(runner, verbosity, "during setup");
|
||||
continue;
|
||||
}
|
||||
tc->setup();
|
||||
}
|
||||
/* test */
|
||||
if (setjmp(env)) {
|
||||
add_failure(runner, verbosity);
|
||||
handle_failure(runner, verbosity, "during actual test");
|
||||
continue;
|
||||
}
|
||||
(tc->tests[i])();
|
||||
@ -179,15 +189,17 @@ srunner_run_all(SRunner *runner, int verbosity) {
|
||||
/* teardown */
|
||||
if (tc->teardown != NULL) {
|
||||
if (setjmp(env)) {
|
||||
add_failure(runner, verbosity);
|
||||
handle_failure(runner, verbosity, "during teardown");
|
||||
continue;
|
||||
}
|
||||
tc->teardown();
|
||||
}
|
||||
|
||||
handle_success(verbosity);
|
||||
}
|
||||
tc = tc->next_tcase;
|
||||
}
|
||||
if (verbosity) {
|
||||
if (verbosity != CK_SILENT) {
|
||||
int passed = runner->nchecks - runner->nfailures;
|
||||
double percentage = ((double)passed) / runner->nchecks;
|
||||
int display = (int)(percentage * 100);
|
||||
@ -203,8 +215,8 @@ _fail_unless(int condition, const char *file, int line, const char *msg) {
|
||||
it is.
|
||||
*/
|
||||
UNUSED_P(condition);
|
||||
UNUSED_P(file);
|
||||
UNUSED_P(line);
|
||||
_check_current_filename = file;
|
||||
_check_current_lineno = line;
|
||||
if (msg != NULL) {
|
||||
const int has_newline = (msg[strlen(msg) - 1] == '\n');
|
||||
fprintf(stderr, "ERROR: %s%s", msg, has_newline ? "" : "\n");
|
||||
|
@ -12,8 +12,9 @@
|
||||
\___/_/\_\ .__/ \__,_|\__|
|
||||
|_| XML parser
|
||||
|
||||
Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
|
||||
Copyright (c) 2000-2017 Expat development team
|
||||
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>
|
||||
Licensed under the MIT license:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
|
627
tests/runtests.c
627
tests/runtests.c
@ -6,8 +6,18 @@
|
||||
\___/_/\_\ .__/ \__,_|\__|
|
||||
|_| XML parser
|
||||
|
||||
Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
|
||||
Copyright (c) 2000-2017 Expat development team
|
||||
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 <ssolie@users.sourceforge.net>
|
||||
Copyright (c) 2005-2012 Karl Waclawek <karl@waclawek.net>
|
||||
Copyright (c) 2016-2022 Sebastian Pipping <sebastian@pipping.org>
|
||||
Copyright (c) 2017-2018 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 Dong-hee Na <donghee.na@python.org>
|
||||
Licensed under the MIT license:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
@ -30,14 +40,12 @@
|
||||
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
|
||||
|
||||
#ifdef HAVE_EXPAT_CONFIG_H
|
||||
# include <expat_config.h>
|
||||
#endif
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
@ -45,34 +53,17 @@
|
||||
#include <stddef.h> /* ptrdiff_t */
|
||||
#include <ctype.h>
|
||||
#include <limits.h>
|
||||
|
||||
#if defined(_WIN32) && defined(_MSC_VER) && (_MSC_VER < 1600)
|
||||
/* For vs2003/7.1 up to vs2008/9.0; _MSC_VER 1600 is vs2010/10.0 */
|
||||
# if defined(_WIN64)
|
||||
typedef __int64 intptr_t;
|
||||
# else
|
||||
typedef __int32 intptr_t;
|
||||
# endif
|
||||
typedef unsigned __int64 uint64_t;
|
||||
#else
|
||||
# include <stdint.h> /* intptr_t uint64_t */
|
||||
#endif
|
||||
#include <stdint.h> /* intptr_t uint64_t */
|
||||
#include <math.h> /* NAN, INFINITY, isnan */
|
||||
|
||||
#if ! defined(__cplusplus)
|
||||
# if defined(_MSC_VER) && (_MSC_VER <= 1700)
|
||||
/* for vs2012/11.0/1700 and earlier Visual Studio compilers */
|
||||
# define bool int
|
||||
# define false 0
|
||||
# define true 1
|
||||
# else
|
||||
# include <stdbool.h>
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#include "expat.h"
|
||||
#include "chardata.h"
|
||||
#include "structdata.h"
|
||||
#include "internal.h" /* for UNUSED_P only */
|
||||
#include "internal.h"
|
||||
#include "minicheck.h"
|
||||
#include "memcheck.h"
|
||||
#include "siphash.h"
|
||||
@ -108,6 +99,16 @@ typedef unsigned __int64 uint64_t;
|
||||
|
||||
static XML_Parser g_parser = NULL;
|
||||
|
||||
static 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
|
||||
}
|
||||
|
||||
static void
|
||||
basic_setup(void) {
|
||||
g_parser = XML_ParserCreate(NULL);
|
||||
@ -1769,7 +1770,7 @@ START_TEST(test_not_standalone_handler_accept) {
|
||||
XML_SetNotStandaloneHandler(g_parser, accept_not_standalone_handler);
|
||||
run_ext_character_check(text, &test_data, XCS(""));
|
||||
|
||||
/* Repeat wtihout the external entity handler */
|
||||
/* Repeat without the external entity handler */
|
||||
XML_ParserReset(g_parser, NULL);
|
||||
XML_SetNotStandaloneHandler(g_parser, accept_not_standalone_handler);
|
||||
run_character_check(text, XCS(""));
|
||||
@ -7049,17 +7050,39 @@ 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' />";
|
||||
|
||||
expect_failure(text, XML_ERROR_INVALID_TOKEN,
|
||||
"Double colon in attribute name not faulted");
|
||||
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/' />";
|
||||
|
||||
expect_failure(text, XML_ERROR_INVALID_TOKEN,
|
||||
"Double colon in element name not faulted");
|
||||
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
|
||||
|
||||
@ -7329,7 +7352,7 @@ START_TEST(test_misc_version) {
|
||||
fail("Version mismatch");
|
||||
|
||||
#if ! defined(XML_UNICODE) || defined(XML_UNICODE_WCHAR_T)
|
||||
if (xcstrcmp(version_text, XCS("expat_2.2.9"))) /* needs bump on releases */
|
||||
if (xcstrcmp(version_text, XCS("expat_2.4.3"))) /* needs bump on releases */
|
||||
fail("XML_*_VERSION in expat.h out of sync?\n");
|
||||
#else
|
||||
/* If we have XML_UNICODE defined but not XML_UNICODE_WCHAR_T
|
||||
@ -7480,7 +7503,6 @@ START_TEST(test_misc_stop_during_end_handler_issue_240_2) {
|
||||
}
|
||||
END_TEST
|
||||
|
||||
#ifdef XML_DTD
|
||||
START_TEST(test_misc_deny_internal_entity_closing_doctype_issue_317) {
|
||||
const char *const inputOne = "<!DOCTYPE d [\n"
|
||||
"<!ENTITY % e ']><d/>'>\n"
|
||||
@ -7541,7 +7563,6 @@ START_TEST(test_misc_deny_internal_entity_closing_doctype_issue_317) {
|
||||
}
|
||||
}
|
||||
END_TEST
|
||||
#endif
|
||||
|
||||
static void
|
||||
alloc_setup(void) {
|
||||
@ -9817,6 +9838,15 @@ START_TEST(test_nsalloc_parse_buffer) {
|
||||
|
||||
/* Try a parse before the start of the world */
|
||||
/* (Exercises new code path) */
|
||||
if (XML_ParseBuffer(g_parser, 0, XML_FALSE) != XML_STATUS_ERROR)
|
||||
fail("Pre-init XML_ParseBuffer not faulted");
|
||||
if (XML_GetErrorCode(g_parser) != XML_ERROR_NO_BUFFER)
|
||||
fail("Pre-init XML_ParseBuffer faulted for wrong reason");
|
||||
|
||||
buffer = XML_GetBuffer(g_parser, 1 /* any small number greater than 0 */);
|
||||
if (buffer == NULL)
|
||||
fail("Could not acquire parse buffer");
|
||||
|
||||
allocation_count = 0;
|
||||
if (XML_ParseBuffer(g_parser, 0, XML_FALSE) != XML_STATUS_ERROR)
|
||||
fail("Pre-init XML_ParseBuffer not faulted");
|
||||
@ -11197,6 +11227,389 @@ START_TEST(test_nsalloc_prefixed_element) {
|
||||
}
|
||||
END_TEST
|
||||
|
||||
#if defined(XML_DTD)
|
||||
typedef enum XML_Status (*XmlParseFunction)(XML_Parser, const char *, int, int);
|
||||
|
||||
struct AccountingTestCase {
|
||||
const char *primaryText;
|
||||
const char *firstExternalText; /* often NULL */
|
||||
const char *secondExternalText; /* often NULL */
|
||||
const unsigned long long expectedCountBytesIndirectExtra;
|
||||
XML_Bool singleBytesWanted;
|
||||
};
|
||||
|
||||
static 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) {
|
||||
UNUSED_P(context);
|
||||
UNUSED_P(base);
|
||||
UNUSED_P(publicId);
|
||||
|
||||
const struct AccountingTestCase *const testCase
|
||||
= (const struct AccountingTestCase *)XML_GetUserData(parser);
|
||||
|
||||
const char *externalText = NULL;
|
||||
if (xcstrcmp(systemId, XCS("first.ent")) == 0) {
|
||||
externalText = testCase->firstExternalText;
|
||||
} else if (xcstrcmp(systemId, XCS("second.ent")) == 0) {
|
||||
externalText = testCase->secondExternalText;
|
||||
} else {
|
||||
assert(! "systemId is neither \"first.ent\" nor \"second.ent\"");
|
||||
}
|
||||
assert(externalText);
|
||||
|
||||
XML_Parser entParser = XML_ExternalEntityParserCreate(parser, context, 0);
|
||||
assert(entParser);
|
||||
|
||||
const XmlParseFunction xmlParseFunction
|
||||
= testCase->singleBytesWanted ? _XML_Parse_SINGLE_BYTES : XML_Parse;
|
||||
|
||||
const enum XML_Status status = xmlParseFunction(
|
||||
entParser, externalText, (int)strlen(externalText), XML_TRUE);
|
||||
|
||||
XML_ParserFree(entParser);
|
||||
return status;
|
||||
}
|
||||
|
||||
START_TEST(test_accounting_precision) {
|
||||
const XML_Bool filled_later = XML_TRUE; /* value is arbitrary */
|
||||
struct AccountingTestCase cases[] = {
|
||||
{"<e/>", NULL, NULL, 0, 0},
|
||||
{"<e></e>", NULL, NULL, 0, 0},
|
||||
|
||||
/* Attributes */
|
||||
{"<e k1=\"v2\" k2=\"v2\"/>", NULL, NULL, 0, filled_later},
|
||||
{"<e k1=\"v2\" k2=\"v2\"></e>", NULL, NULL, 0, 0},
|
||||
{"<p:e xmlns:p=\"https://domain.invalid/\" />", NULL, NULL, 0,
|
||||
filled_later},
|
||||
{"<e k=\"&'><"\" />", NULL, NULL,
|
||||
sizeof(XML_Char) * 5 /* number of predefined entites */, filled_later},
|
||||
{"<e1 xmlns='https://example.org/'>\n"
|
||||
" <e2 xmlns=''/>\n"
|
||||
"</e1>",
|
||||
NULL, NULL, 0, filled_later},
|
||||
|
||||
/* Text */
|
||||
{"<e>text</e>", NULL, NULL, 0, filled_later},
|
||||
{"<e1><e2>text1<e3/>text2</e2></e1>", NULL, NULL, 0, filled_later},
|
||||
{"<e>&'><"</e>", NULL, NULL,
|
||||
sizeof(XML_Char) * 5 /* number of predefined entites */, filled_later},
|
||||
{"<e>A)</e>", NULL, NULL, 0, filled_later},
|
||||
|
||||
/* Prolog */
|
||||
{"<?xml version=\"1.0\"?><root/>", NULL, NULL, 0, filled_later},
|
||||
|
||||
/* Whitespace */
|
||||
{" <e1> <e2> </e2> </e1> ", NULL, NULL, 0, filled_later},
|
||||
{"<e1 ><e2 /></e1 >", NULL, NULL, 0, filled_later},
|
||||
{"<e1><e2 k = \"v\"/><e3 k = 'v'/></e1>", NULL, NULL, 0, filled_later},
|
||||
|
||||
/* Comments */
|
||||
{"<!-- Comment --><e><!-- Comment --></e>", NULL, NULL, 0, filled_later},
|
||||
|
||||
/* Processing instructions */
|
||||
{"<?xml-stylesheet type=\"text/xsl\" href=\"https://domain.invalid/\" media=\"all\"?><e/>",
|
||||
NULL, NULL, 0, filled_later},
|
||||
{"<?pi0?><?pi1 ?><?pi2 ?><!DOCTYPE r SYSTEM 'first.ent'><r/>",
|
||||
"<?pi3?><!ENTITY % e1 SYSTEM 'second.ent'><?pi4?>%e1;<?pi5?>", "<?pi6?>",
|
||||
0, filled_later},
|
||||
|
||||
/* CDATA */
|
||||
{"<e><![CDATA[one two three]]></e>", NULL, NULL, 0, filled_later},
|
||||
/* 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"),
|
||||
filled_later},
|
||||
|
||||
/* 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")),
|
||||
filled_later},
|
||||
|
||||
/* General entities */
|
||||
{"<!DOCTYPE root [\n"
|
||||
"<!ENTITY nine \"123456789\">\n"
|
||||
"]>\n"
|
||||
"<root>&nine;</root>",
|
||||
NULL, NULL, sizeof(XML_Char) * strlen("123456789"), filled_later},
|
||||
{"<!DOCTYPE root [\n"
|
||||
"<!ENTITY nine \"123456789\">\n"
|
||||
"]>\n"
|
||||
"<root k1=\"&nine;\"/>",
|
||||
NULL, NULL, sizeof(XML_Char) * strlen("123456789"), filled_later},
|
||||
{"<!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")),
|
||||
filled_later},
|
||||
{"<!DOCTYPE r [\n"
|
||||
" <!ENTITY five SYSTEM 'first.ent'>\n"
|
||||
"]>\n"
|
||||
"<r>&five;</r>",
|
||||
"12345", NULL, 0, filled_later},
|
||||
|
||||
/* Parameter entities */
|
||||
{"<!DOCTYPE r [\n"
|
||||
"<!ENTITY % comment \"<!---->\">\n"
|
||||
"%comment;\n"
|
||||
"]>\n"
|
||||
"<r/>",
|
||||
NULL, NULL, sizeof(XML_Char) * strlen("<!---->"), filled_later},
|
||||
{"<!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")),
|
||||
filled_later},
|
||||
{"<!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-->")),
|
||||
filled_later},
|
||||
{"<!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]]]]")),
|
||||
filled_later},
|
||||
{"<!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("<!---->")),
|
||||
filled_later},
|
||||
{"<!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-->"),
|
||||
filled_later},
|
||||
{
|
||||
"<!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,
|
||||
filled_later,
|
||||
},
|
||||
{
|
||||
"<!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,
|
||||
filled_later,
|
||||
},
|
||||
{"<!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'>"), filled_later},
|
||||
{"<!DOCTYPE r [\n"
|
||||
" <!ENTITY five SYSTEM 'first.ent'>\n"
|
||||
"]>\n"
|
||||
"<r>&five;</r>",
|
||||
"\xEF\xBB\xBF" /* UTF-8 BOM */, NULL, 0, filled_later},
|
||||
};
|
||||
|
||||
const size_t countCases = sizeof(cases) / sizeof(cases[0]);
|
||||
size_t u = 0;
|
||||
for (; u < countCases; u++) {
|
||||
size_t v = 0;
|
||||
for (; v < 2; v++) {
|
||||
const XML_Bool singleBytesWanted = (v == 0) ? XML_FALSE : XML_TRUE;
|
||||
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]);
|
||||
cases[u].singleBytesWanted = singleBytesWanted;
|
||||
}
|
||||
|
||||
const XmlParseFunction xmlParseFunction
|
||||
= singleBytesWanted ? _XML_Parse_SINGLE_BYTES : XML_Parse;
|
||||
|
||||
enum XML_Status status
|
||||
= xmlParseFunction(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("") ", %s: Expected " EXPAT_FMT_ULL(
|
||||
"") " count direct bytes, got " EXPAT_FMT_ULL("") " instead.\n",
|
||||
u + 1, countCases, singleBytesWanted ? "single bytes" : "chunks",
|
||||
expectedCountBytesDirect, actualCountBytesDirect);
|
||||
fail("Count of direct bytes is off");
|
||||
}
|
||||
|
||||
if (actualCountBytesIndirect != expectedCountBytesIndirect) {
|
||||
fprintf(
|
||||
stderr,
|
||||
"Document " EXPAT_FMT_SIZE_T("") " of " EXPAT_FMT_SIZE_T("") ", %s: Expected " EXPAT_FMT_ULL(
|
||||
"") " count indirect bytes, got " EXPAT_FMT_ULL("") " instead.\n",
|
||||
u + 1, countCases, singleBytesWanted ? "single bytes" : "chunks",
|
||||
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, NULL, 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++) {
|
||||
const char *const printable = unsignedCharToPrintable(uc);
|
||||
if (printable == NULL)
|
||||
fail("unsignedCharToPrintable returned NULL");
|
||||
if (strlen(printable) < (size_t)1)
|
||||
fail("unsignedCharToPrintable returned empty string");
|
||||
}
|
||||
|
||||
// Two concrete samples
|
||||
if (strcmp(unsignedCharToPrintable('A'), "A") != 0)
|
||||
fail("unsignedCharToPrintable result mistaken");
|
||||
if (strcmp(unsignedCharToPrintable('\\'), "\\\\") != 0)
|
||||
fail("unsignedCharToPrintable result mistaken");
|
||||
}
|
||||
END_TEST
|
||||
#endif // defined(XML_DTD)
|
||||
|
||||
static Suite *
|
||||
make_suite(void) {
|
||||
Suite *s = suite_create("basic");
|
||||
@ -11205,6 +11618,9 @@ make_suite(void) {
|
||||
TCase *tc_misc = tcase_create("miscellaneous tests");
|
||||
TCase *tc_alloc = tcase_create("allocation tests");
|
||||
TCase *tc_nsalloc = tcase_create("namespace allocation tests");
|
||||
#if defined(XML_DTD)
|
||||
TCase *tc_accounting = tcase_create("accounting tests");
|
||||
#endif
|
||||
|
||||
suite_add_tcase(s, tc_basic);
|
||||
tcase_add_checked_fixture(tc_basic, basic_setup, basic_teardown);
|
||||
@ -11259,13 +11675,14 @@ make_suite(void) {
|
||||
test_wfc_undeclared_entity_with_external_subset_standalone);
|
||||
tcase_add_test(tc_basic, test_entity_with_external_subset_unless_standalone);
|
||||
tcase_add_test(tc_basic, test_wfc_no_recursive_entity_refs);
|
||||
tcase_add_test(tc_basic, test_ext_entity_set_encoding);
|
||||
tcase_add_test(tc_basic, test_ext_entity_no_handler);
|
||||
tcase_add_test(tc_basic, test_ext_entity_set_bom);
|
||||
tcase_add_test(tc_basic, test_ext_entity_bad_encoding);
|
||||
tcase_add_test(tc_basic, test_ext_entity_bad_encoding_2);
|
||||
tcase_add_test(tc_basic, test_ext_entity_invalid_parse);
|
||||
tcase_add_test(tc_basic, test_ext_entity_invalid_suspended_parse);
|
||||
tcase_add_test__ifdef_xml_dtd(tc_basic, test_ext_entity_set_encoding);
|
||||
tcase_add_test__ifdef_xml_dtd(tc_basic, test_ext_entity_no_handler);
|
||||
tcase_add_test__ifdef_xml_dtd(tc_basic, test_ext_entity_set_bom);
|
||||
tcase_add_test__ifdef_xml_dtd(tc_basic, test_ext_entity_bad_encoding);
|
||||
tcase_add_test__ifdef_xml_dtd(tc_basic, test_ext_entity_bad_encoding_2);
|
||||
tcase_add_test__ifdef_xml_dtd(tc_basic, test_ext_entity_invalid_parse);
|
||||
tcase_add_test__ifdef_xml_dtd(tc_basic,
|
||||
test_ext_entity_invalid_suspended_parse);
|
||||
tcase_add_test(tc_basic, test_dtd_default_handling);
|
||||
tcase_add_test(tc_basic, test_dtd_attr_handling);
|
||||
tcase_add_test(tc_basic, test_empty_ns_without_namespaces);
|
||||
@ -11277,25 +11694,22 @@ make_suite(void) {
|
||||
tcase_add_test(tc_basic, test_good_cdata_utf16);
|
||||
tcase_add_test(tc_basic, test_good_cdata_utf16_le);
|
||||
tcase_add_test(tc_basic, test_long_cdata_utf16);
|
||||
#ifndef XML_MIN_SIZE /* FIXME workaround -DXML_MIN_SIZE + ASan (issue #332) */
|
||||
tcase_add_test(tc_basic, test_multichar_cdata_utf16);
|
||||
#endif
|
||||
tcase_add_test(tc_basic, test_utf16_bad_surrogate_pair);
|
||||
tcase_add_test(tc_basic, test_bad_cdata);
|
||||
#ifndef XML_MIN_SIZE /* FIXME workaround -DXML_MIN_SIZE + ASan (issue #332) */
|
||||
tcase_add_test(tc_basic, test_bad_cdata_utf16);
|
||||
#endif
|
||||
tcase_add_test(tc_basic, test_stop_parser_between_cdata_calls);
|
||||
tcase_add_test(tc_basic, test_suspend_parser_between_cdata_calls);
|
||||
tcase_add_test(tc_basic, test_memory_allocation);
|
||||
tcase_add_test(tc_basic, test_default_current);
|
||||
tcase_add_test(tc_basic, test_dtd_elements);
|
||||
tcase_add_test(tc_basic, test_set_foreign_dtd);
|
||||
tcase_add_test(tc_basic, test_foreign_dtd_not_standalone);
|
||||
tcase_add_test(tc_basic, test_invalid_foreign_dtd);
|
||||
tcase_add_test(tc_basic, test_foreign_dtd_with_doctype);
|
||||
tcase_add_test(tc_basic, test_foreign_dtd_without_external_subset);
|
||||
tcase_add_test(tc_basic, test_empty_foreign_dtd);
|
||||
tcase_add_test__ifdef_xml_dtd(tc_basic, test_set_foreign_dtd);
|
||||
tcase_add_test__ifdef_xml_dtd(tc_basic, test_foreign_dtd_not_standalone);
|
||||
tcase_add_test__ifdef_xml_dtd(tc_basic, test_invalid_foreign_dtd);
|
||||
tcase_add_test__ifdef_xml_dtd(tc_basic, test_foreign_dtd_with_doctype);
|
||||
tcase_add_test__ifdef_xml_dtd(tc_basic,
|
||||
test_foreign_dtd_without_external_subset);
|
||||
tcase_add_test__ifdef_xml_dtd(tc_basic, test_empty_foreign_dtd);
|
||||
tcase_add_test(tc_basic, test_set_base);
|
||||
tcase_add_test(tc_basic, test_attributes);
|
||||
tcase_add_test(tc_basic, test_reset_in_entity);
|
||||
@ -11312,8 +11726,8 @@ make_suite(void) {
|
||||
tcase_add_test(tc_basic, test_trailing_rsqb);
|
||||
tcase_add_test(tc_basic, test_ext_entity_trailing_rsqb);
|
||||
tcase_add_test(tc_basic, test_ext_entity_good_cdata);
|
||||
tcase_add_test(tc_basic, test_user_parameters);
|
||||
tcase_add_test(tc_basic, test_ext_entity_ref_parameter);
|
||||
tcase_add_test__ifdef_xml_dtd(tc_basic, test_user_parameters);
|
||||
tcase_add_test__ifdef_xml_dtd(tc_basic, test_ext_entity_ref_parameter);
|
||||
tcase_add_test(tc_basic, test_empty_parse);
|
||||
tcase_add_test(tc_basic, test_get_buffer_1);
|
||||
tcase_add_test(tc_basic, test_get_buffer_2);
|
||||
@ -11321,25 +11735,26 @@ make_suite(void) {
|
||||
tcase_add_test(tc_basic, test_byte_info_at_error);
|
||||
tcase_add_test(tc_basic, test_byte_info_at_cdata);
|
||||
tcase_add_test(tc_basic, test_predefined_entities);
|
||||
tcase_add_test(tc_basic, test_invalid_tag_in_dtd);
|
||||
tcase_add_test__ifdef_xml_dtd(tc_basic, test_invalid_tag_in_dtd);
|
||||
tcase_add_test(tc_basic, test_not_predefined_entities);
|
||||
tcase_add_test(tc_basic, test_ignore_section);
|
||||
tcase_add_test(tc_basic, test_ignore_section_utf16);
|
||||
tcase_add_test(tc_basic, test_ignore_section_utf16_be);
|
||||
tcase_add_test(tc_basic, test_bad_ignore_section);
|
||||
tcase_add_test(tc_basic, test_external_entity_values);
|
||||
tcase_add_test(tc_basic, test_ext_entity_not_standalone);
|
||||
tcase_add_test(tc_basic, test_ext_entity_value_abort);
|
||||
tcase_add_test__ifdef_xml_dtd(tc_basic, test_ignore_section);
|
||||
tcase_add_test__ifdef_xml_dtd(tc_basic, test_ignore_section_utf16);
|
||||
tcase_add_test__ifdef_xml_dtd(tc_basic, test_ignore_section_utf16_be);
|
||||
tcase_add_test__ifdef_xml_dtd(tc_basic, test_bad_ignore_section);
|
||||
tcase_add_test__ifdef_xml_dtd(tc_basic, test_external_entity_values);
|
||||
tcase_add_test__ifdef_xml_dtd(tc_basic, test_ext_entity_not_standalone);
|
||||
tcase_add_test__ifdef_xml_dtd(tc_basic, test_ext_entity_value_abort);
|
||||
tcase_add_test(tc_basic, test_bad_public_doctype);
|
||||
tcase_add_test(tc_basic, test_attribute_enum_value);
|
||||
tcase_add_test(tc_basic, test_predefined_entity_redefinition);
|
||||
tcase_add_test(tc_basic, test_dtd_stop_processing);
|
||||
tcase_add_test__ifdef_xml_dtd(tc_basic, test_dtd_stop_processing);
|
||||
tcase_add_test(tc_basic, test_public_notation_no_sysid);
|
||||
tcase_add_test(tc_basic, test_nested_groups);
|
||||
tcase_add_test(tc_basic, test_group_choice);
|
||||
tcase_add_test(tc_basic, test_standalone_parameter_entity);
|
||||
tcase_add_test(tc_basic, test_skipped_parameter_entity);
|
||||
tcase_add_test(tc_basic, test_recursive_external_parameter_entity);
|
||||
tcase_add_test__ifdef_xml_dtd(tc_basic, test_skipped_parameter_entity);
|
||||
tcase_add_test__ifdef_xml_dtd(tc_basic,
|
||||
test_recursive_external_parameter_entity);
|
||||
tcase_add_test(tc_basic, test_undefined_ext_entity_in_external_dtd);
|
||||
tcase_add_test(tc_basic, test_suspend_xdecl);
|
||||
tcase_add_test(tc_basic, test_abort_epilog);
|
||||
@ -11349,9 +11764,9 @@ make_suite(void) {
|
||||
tcase_add_test(tc_basic, test_unfinished_epilog);
|
||||
tcase_add_test(tc_basic, test_partial_char_in_epilog);
|
||||
tcase_add_test(tc_basic, test_hash_collision);
|
||||
tcase_add_test(tc_basic, test_suspend_resume_internal_entity);
|
||||
tcase_add_test(tc_basic, test_resume_entity_with_syntax_error);
|
||||
tcase_add_test(tc_basic, test_suspend_resume_parameter_entity);
|
||||
tcase_add_test__ifdef_xml_dtd(tc_basic, test_suspend_resume_internal_entity);
|
||||
tcase_add_test__ifdef_xml_dtd(tc_basic, test_resume_entity_with_syntax_error);
|
||||
tcase_add_test__ifdef_xml_dtd(tc_basic, test_suspend_resume_parameter_entity);
|
||||
tcase_add_test(tc_basic, test_restart_on_error);
|
||||
tcase_add_test(tc_basic, test_reject_lt_in_attribute_value);
|
||||
tcase_add_test(tc_basic, test_reject_unfinished_param_in_att_value);
|
||||
@ -11360,7 +11775,7 @@ make_suite(void) {
|
||||
tcase_add_test(tc_basic, test_skipped_external_entity);
|
||||
tcase_add_test(tc_basic, test_skipped_null_loaded_ext_entity);
|
||||
tcase_add_test(tc_basic, test_skipped_unloaded_ext_entity);
|
||||
tcase_add_test(tc_basic, test_param_entity_with_trailing_cr);
|
||||
tcase_add_test__ifdef_xml_dtd(tc_basic, test_param_entity_with_trailing_cr);
|
||||
tcase_add_test(tc_basic, test_invalid_character_entity);
|
||||
tcase_add_test(tc_basic, test_invalid_character_entity_2);
|
||||
tcase_add_test(tc_basic, test_invalid_character_entity_3);
|
||||
@ -11403,7 +11818,7 @@ make_suite(void) {
|
||||
tcase_add_test(tc_basic, test_utf16_attribute);
|
||||
tcase_add_test(tc_basic, test_utf16_second_attr);
|
||||
tcase_add_test(tc_basic, test_attr_after_solidus);
|
||||
tcase_add_test(tc_basic, test_utf16_pe);
|
||||
tcase_add_test__ifdef_xml_dtd(tc_basic, test_utf16_pe);
|
||||
tcase_add_test(tc_basic, test_bad_attr_desc_keyword);
|
||||
tcase_add_test(tc_basic, test_bad_attr_desc_keyword_utf16);
|
||||
tcase_add_test(tc_basic, test_bad_doctype);
|
||||
@ -11411,11 +11826,11 @@ make_suite(void) {
|
||||
tcase_add_test(tc_basic, test_bad_doctype_plus);
|
||||
tcase_add_test(tc_basic, test_bad_doctype_star);
|
||||
tcase_add_test(tc_basic, test_bad_doctype_query);
|
||||
tcase_add_test(tc_basic, test_unknown_encoding_bad_ignore);
|
||||
tcase_add_test__ifdef_xml_dtd(tc_basic, test_unknown_encoding_bad_ignore);
|
||||
tcase_add_test(tc_basic, test_entity_in_utf16_be_attr);
|
||||
tcase_add_test(tc_basic, test_entity_in_utf16_le_attr);
|
||||
tcase_add_test(tc_basic, test_entity_public_utf16_be);
|
||||
tcase_add_test(tc_basic, test_entity_public_utf16_le);
|
||||
tcase_add_test__ifdef_xml_dtd(tc_basic, test_entity_public_utf16_be);
|
||||
tcase_add_test__ifdef_xml_dtd(tc_basic, test_entity_public_utf16_le);
|
||||
tcase_add_test(tc_basic, test_short_doctype);
|
||||
tcase_add_test(tc_basic, test_short_doctype_2);
|
||||
tcase_add_test(tc_basic, test_short_doctype_3);
|
||||
@ -11434,7 +11849,8 @@ make_suite(void) {
|
||||
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(tc_namespace, test_default_ns_from_ext_subset_and_ext_ge);
|
||||
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);
|
||||
@ -11475,10 +11891,8 @@ make_suite(void) {
|
||||
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);
|
||||
#ifdef XML_DTD
|
||||
tcase_add_test(tc_misc,
|
||||
test_misc_deny_internal_entity_closing_doctype_issue_317);
|
||||
#endif
|
||||
tcase_add_test__ifdef_xml_dtd(
|
||||
tc_misc, test_misc_deny_internal_entity_closing_doctype_issue_317);
|
||||
|
||||
suite_add_tcase(s, tc_alloc);
|
||||
tcase_add_checked_fixture(tc_alloc, alloc_setup, alloc_teardown);
|
||||
@ -11489,45 +11903,49 @@ make_suite(void) {
|
||||
tcase_add_test(tc_alloc, test_alloc_parse_pi_3);
|
||||
tcase_add_test(tc_alloc, test_alloc_parse_comment);
|
||||
tcase_add_test(tc_alloc, test_alloc_parse_comment_2);
|
||||
tcase_add_test(tc_alloc, test_alloc_create_external_parser);
|
||||
tcase_add_test(tc_alloc, test_alloc_run_external_parser);
|
||||
tcase_add_test(tc_alloc, test_alloc_dtd_copy_default_atts);
|
||||
tcase_add_test(tc_alloc, test_alloc_external_entity);
|
||||
tcase_add_test(tc_alloc, test_alloc_ext_entity_set_encoding);
|
||||
tcase_add_test(tc_alloc, test_alloc_internal_entity);
|
||||
tcase_add_test(tc_alloc, test_alloc_dtd_default_handling);
|
||||
tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_create_external_parser);
|
||||
tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_run_external_parser);
|
||||
tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_dtd_copy_default_atts);
|
||||
tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_external_entity);
|
||||
tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_ext_entity_set_encoding);
|
||||
tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_internal_entity);
|
||||
tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_dtd_default_handling);
|
||||
tcase_add_test(tc_alloc, test_alloc_explicit_encoding);
|
||||
tcase_add_test(tc_alloc, test_alloc_set_base);
|
||||
tcase_add_test(tc_alloc, test_alloc_realloc_buffer);
|
||||
tcase_add_test(tc_alloc, test_alloc_ext_entity_realloc_buffer);
|
||||
tcase_add_test(tc_alloc, test_alloc_realloc_many_attributes);
|
||||
tcase_add_test(tc_alloc, test_alloc_public_entity_value);
|
||||
tcase_add_test(tc_alloc, test_alloc_realloc_subst_public_entity_value);
|
||||
tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_public_entity_value);
|
||||
tcase_add_test__ifdef_xml_dtd(tc_alloc,
|
||||
test_alloc_realloc_subst_public_entity_value);
|
||||
tcase_add_test(tc_alloc, test_alloc_parse_public_doctype);
|
||||
tcase_add_test(tc_alloc, test_alloc_parse_public_doctype_long_name);
|
||||
tcase_add_test(tc_alloc, test_alloc_set_foreign_dtd);
|
||||
tcase_add_test(tc_alloc, test_alloc_attribute_enum_value);
|
||||
tcase_add_test(tc_alloc, test_alloc_realloc_attribute_enum_value);
|
||||
tcase_add_test(tc_alloc, test_alloc_realloc_implied_attribute);
|
||||
tcase_add_test(tc_alloc, test_alloc_realloc_default_attribute);
|
||||
tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_set_foreign_dtd);
|
||||
tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_attribute_enum_value);
|
||||
tcase_add_test__ifdef_xml_dtd(tc_alloc,
|
||||
test_alloc_realloc_attribute_enum_value);
|
||||
tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_realloc_implied_attribute);
|
||||
tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_realloc_default_attribute);
|
||||
tcase_add_test(tc_alloc, test_alloc_notation);
|
||||
tcase_add_test(tc_alloc, test_alloc_public_notation);
|
||||
tcase_add_test(tc_alloc, test_alloc_system_notation);
|
||||
tcase_add_test(tc_alloc, test_alloc_nested_groups);
|
||||
tcase_add_test(tc_alloc, test_alloc_realloc_nested_groups);
|
||||
tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_nested_groups);
|
||||
tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_realloc_nested_groups);
|
||||
tcase_add_test(tc_alloc, test_alloc_large_group);
|
||||
tcase_add_test(tc_alloc, test_alloc_realloc_group_choice);
|
||||
tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_realloc_group_choice);
|
||||
tcase_add_test(tc_alloc, test_alloc_pi_in_epilog);
|
||||
tcase_add_test(tc_alloc, test_alloc_comment_in_epilog);
|
||||
tcase_add_test(tc_alloc, test_alloc_realloc_long_attribute_value);
|
||||
tcase_add_test__ifdef_xml_dtd(tc_alloc,
|
||||
test_alloc_realloc_long_attribute_value);
|
||||
tcase_add_test(tc_alloc, test_alloc_attribute_whitespace);
|
||||
tcase_add_test(tc_alloc, test_alloc_attribute_predefined_entity);
|
||||
tcase_add_test(tc_alloc, test_alloc_long_attr_default_with_char_ref);
|
||||
tcase_add_test(tc_alloc, test_alloc_long_attr_value);
|
||||
tcase_add_test(tc_alloc, test_alloc_nested_entities);
|
||||
tcase_add_test(tc_alloc, test_alloc_realloc_param_entity_newline);
|
||||
tcase_add_test(tc_alloc, test_alloc_realloc_ce_extends_pe);
|
||||
tcase_add_test(tc_alloc, test_alloc_realloc_attributes);
|
||||
tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_nested_entities);
|
||||
tcase_add_test__ifdef_xml_dtd(tc_alloc,
|
||||
test_alloc_realloc_param_entity_newline);
|
||||
tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_realloc_ce_extends_pe);
|
||||
tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_realloc_attributes);
|
||||
tcase_add_test(tc_alloc, test_alloc_long_doc_name);
|
||||
tcase_add_test(tc_alloc, test_alloc_long_base);
|
||||
tcase_add_test(tc_alloc, test_alloc_long_public_id);
|
||||
@ -11563,6 +11981,13 @@ make_suite(void) {
|
||||
tcase_add_test(tc_nsalloc, test_nsalloc_long_systemid_in_ext);
|
||||
tcase_add_test(tc_nsalloc, test_nsalloc_prefixed_element);
|
||||
|
||||
#if defined(XML_DTD)
|
||||
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);
|
||||
#endif
|
||||
|
||||
return s;
|
||||
}
|
||||
|
||||
|
@ -1,24 +0,0 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio 2013
|
||||
VisualStudioVersion = 12.0.40629.0
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "runtests", "runtests.vcxproj", "{63D6D820-B526-4A5F-9605-9B8551FAC591}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Win32 = Debug|Win32
|
||||
Release|Win32 = Release|Win32
|
||||
Template|Win32 = Template|Win32
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{63D6D820-B526-4A5F-9605-9B8551FAC591}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||
{63D6D820-B526-4A5F-9605-9B8551FAC591}.Debug|Win32.Build.0 = Debug|Win32
|
||||
{63D6D820-B526-4A5F-9605-9B8551FAC591}.Release|Win32.ActiveCfg = Release|Win32
|
||||
{63D6D820-B526-4A5F-9605-9B8551FAC591}.Release|Win32.Build.0 = Release|Win32
|
||||
{63D6D820-B526-4A5F-9605-9B8551FAC591}.Template|Win32.ActiveCfg = Release|Win32
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
EndGlobal
|
@ -9,8 +9,8 @@
|
||||
\___/_/\_\ .__/ \__,_|\__|
|
||||
|_| XML parser
|
||||
|
||||
Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
|
||||
Copyright (c) 2000-2017 Expat development team
|
||||
Copyright (c) 2005 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
|
||||
Copyright (c) 2017 Sebastian Pipping <sebastian@pipping.org>
|
||||
Licensed under the MIT license:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
|
@ -6,8 +6,8 @@
|
||||
\___/_/\_\ .__/ \__,_|\__|
|
||||
|_| XML parser
|
||||
|
||||
Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
|
||||
Copyright (c) 2000-2017 Expat development team
|
||||
Copyright (c) 2017 Rhodri James <rhodri@wildebeest.org.uk>
|
||||
Copyright (c) 2017-2021 Sebastian Pipping <sebastian@pipping.org>
|
||||
Licensed under the MIT license:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
@ -30,9 +30,7 @@
|
||||
USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_EXPAT_CONFIG_H
|
||||
# include "expat_config.h"
|
||||
#endif
|
||||
#include "expat_config.h"
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdlib.h>
|
||||
|
@ -7,8 +7,7 @@
|
||||
\___/_/\_\ .__/ \__,_|\__|
|
||||
|_| XML parser
|
||||
|
||||
Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
|
||||
Copyright (c) 2000-2017 Expat development team
|
||||
Copyright (c) 2017 Rhodri James <rhodri@wildebeest.org.uk>
|
||||
Licensed under the MIT license:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
|
@ -6,7 +6,8 @@
|
||||
# \___/_/\_\ .__/ \__,_|\__|
|
||||
# |_| XML parser
|
||||
#
|
||||
# Copyright (c) 2017 Expat development team
|
||||
# Copyright (c) 2017 Rhodri James <rhodri@wildebeest.org.uk>
|
||||
# Copyright (c) 2017 Sebastian Pipping <sebastian@pipping.org>
|
||||
# Licensed under the MIT license:
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
|
@ -1,24 +1,55 @@
|
||||
#! /usr/bin/env bash
|
||||
|
||||
# EXPAT TEST SCRIPT FOR W3C XML TEST SUITE
|
||||
|
||||
#
|
||||
# This script can be used to exercise Expat against the
|
||||
# w3c.org xml test suite, available from
|
||||
# http://www.w3.org/XML/Test/xmlts20020606.zip.
|
||||
|
||||
#
|
||||
# To run this script, first set XMLWF below so that xmlwf can be
|
||||
# found, then set the output directory with OUTPUT.
|
||||
|
||||
#
|
||||
# The script lists all test cases where Expat shows a discrepancy
|
||||
# from the expected result. Test cases where only the canonical
|
||||
# output differs are prefixed with "Output differs:", and a diff file
|
||||
# is generated in the appropriate subdirectory under $OUTPUT.
|
||||
|
||||
#
|
||||
# If there are output files provided, the script will use
|
||||
# output from xmlwf and compare the desired output against it.
|
||||
# However, one has to take into account that the canonical output
|
||||
# produced by xmlwf conforms to an older definition of canonical XML
|
||||
# and does not generate notation declarations.
|
||||
#
|
||||
# __ __ _
|
||||
# ___\ \/ /_ __ __ _| |_
|
||||
# / _ \\ /| '_ \ / _` | __|
|
||||
# | __// \| |_) | (_| | |_
|
||||
# \___/_/\_\ .__/ \__,_|\__|
|
||||
# |_| XML parser
|
||||
#
|
||||
# Copyright (c) 2002-2004 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
|
||||
# Copyright (c) 2002 Karl Waclawek <karl@waclawek.net>
|
||||
# Copyright (c) 2008-2019 Sebastian Pipping <sebastian@pipping.org>
|
||||
# Copyright (c) 2017 Rhodri James <rhodri@wildebeest.org.uk>
|
||||
# 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.
|
||||
|
||||
shopt -s nullglob
|
||||
|
||||
|
@ -6,7 +6,7 @@
|
||||
# \___/_/\_\ .__/ \__,_|\__|
|
||||
# |_| XML parser
|
||||
#
|
||||
# Copyright (c) 2017 Expat development team
|
||||
# Copyright (c) 2017-2021 Sebastian Pipping <sebastian@pipping.org>
|
||||
# Licensed under the MIT license:
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
@ -37,12 +37,13 @@ xmlwf_SOURCES = \
|
||||
codepage.c \
|
||||
@FILEMAP@.c
|
||||
|
||||
xmlwf_CPPFLAGS = -I$(srcdir)/../lib
|
||||
xmlwf_CPPFLAGS = @AM_CPPFLAGS@ -I$(srcdir)/../lib
|
||||
xmlwf_LDFLAGS = @AM_LDFLAGS@ @LIBM@
|
||||
|
||||
if MINGW
|
||||
if UNICODE
|
||||
xmlwf_CPPFLAGS += -mwindows
|
||||
xmlwf_LDFLAGS = -municode
|
||||
xmlwf_LDFLAGS += -municode
|
||||
endif
|
||||
endif
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
# Makefile.in generated by automake 1.16.1 from Makefile.am.
|
||||
# Makefile.in generated by automake 1.16.5 from Makefile.am.
|
||||
# @configure_input@
|
||||
|
||||
# Copyright (C) 1994-2018 Free Software Foundation, Inc.
|
||||
# Copyright (C) 1994-2021 Free Software Foundation, Inc.
|
||||
|
||||
# This Makefile.in is free software; the Free Software Foundation
|
||||
# gives unlimited permission to copy and/or distribute it,
|
||||
@ -22,7 +22,7 @@
|
||||
# \___/_/\_\ .__/ \__,_|\__|
|
||||
# |_| XML parser
|
||||
#
|
||||
# Copyright (c) 2017 Expat development team
|
||||
# Copyright (c) 2017-2021 Sebastian Pipping <sebastian@pipping.org>
|
||||
# Licensed under the MIT license:
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
@ -120,6 +120,7 @@ build_triplet = @build@
|
||||
host_triplet = @host@
|
||||
bin_PROGRAMS = xmlwf$(EXEEXT)
|
||||
@MINGW_TRUE@@UNICODE_TRUE@am__append_1 = -mwindows
|
||||
@MINGW_TRUE@@UNICODE_TRUE@am__append_2 = -municode
|
||||
subdir = xmlwf
|
||||
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
||||
am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
|
||||
@ -215,14 +216,16 @@ am__define_uniq_tagged_files = \
|
||||
unique=`for i in $$list; do \
|
||||
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
||||
done | $(am__uniquify_input)`
|
||||
ETAGS = etags
|
||||
CTAGS = ctags
|
||||
am__DIST_COMMON = $(srcdir)/Makefile.in \
|
||||
$(top_srcdir)/conftools/depcomp
|
||||
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
||||
ACLOCAL = @ACLOCAL@
|
||||
AMTAR = @AMTAR@
|
||||
AM_CFLAGS = @AM_CFLAGS@
|
||||
AM_CPPFLAGS = @AM_CPPFLAGS@
|
||||
AM_CXXFLAGS = @AM_CXXFLAGS@
|
||||
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
|
||||
AM_LDFLAGS = @AM_LDFLAGS@
|
||||
AR = @AR@
|
||||
AS = @AS@
|
||||
AUTOCONF = @AUTOCONF@
|
||||
@ -232,8 +235,9 @@ AWK = @AWK@
|
||||
CC = @CC@
|
||||
CCDEPMODE = @CCDEPMODE@
|
||||
CFLAGS = @CFLAGS@
|
||||
CPP = @CPP@
|
||||
CPPFLAGS = @CPPFLAGS@
|
||||
CSCOPE = @CSCOPE@
|
||||
CTAGS = @CTAGS@
|
||||
CXX = @CXX@
|
||||
CXXCPP = @CXXCPP@
|
||||
CXXDEPMODE = @CXXDEPMODE@
|
||||
@ -249,7 +253,15 @@ ECHO_C = @ECHO_C@
|
||||
ECHO_N = @ECHO_N@
|
||||
ECHO_T = @ECHO_T@
|
||||
EGREP = @EGREP@
|
||||
ETAGS = @ETAGS@
|
||||
EXEEXT = @EXEEXT@
|
||||
EXPAT_ATTR_INFO = @EXPAT_ATTR_INFO@
|
||||
EXPAT_CHAR_TYPE = @EXPAT_CHAR_TYPE@
|
||||
EXPAT_CONTEXT_BYTES = @EXPAT_CONTEXT_BYTES@
|
||||
EXPAT_DTD = @EXPAT_DTD@
|
||||
EXPAT_LARGE_SIZE = @EXPAT_LARGE_SIZE@
|
||||
EXPAT_MIN_SIZE = @EXPAT_MIN_SIZE@
|
||||
EXPAT_NS = @EXPAT_NS@
|
||||
FGREP = @FGREP@
|
||||
FILEMAP = @FILEMAP@
|
||||
GREP = @GREP@
|
||||
@ -262,6 +274,8 @@ LD = @LD@
|
||||
LDFLAGS = @LDFLAGS@
|
||||
LIBAGE = @LIBAGE@
|
||||
LIBCURRENT = @LIBCURRENT@
|
||||
LIBDIR_BASENAME = @LIBDIR_BASENAME@
|
||||
LIBM = @LIBM@
|
||||
LIBOBJS = @LIBOBJS@
|
||||
LIBREVISION = @LIBREVISION@
|
||||
LIBS = @LIBS@
|
||||
@ -291,6 +305,9 @@ RANLIB = @RANLIB@
|
||||
SED = @SED@
|
||||
SET_MAKE = @SET_MAKE@
|
||||
SHELL = @SHELL@
|
||||
SO_MAJOR = @SO_MAJOR@
|
||||
SO_MINOR = @SO_MINOR@
|
||||
SO_PATCH = @SO_PATCH@
|
||||
STRIP = @STRIP@
|
||||
VERSION = @VERSION@
|
||||
abs_builddir = @abs_builddir@
|
||||
@ -301,6 +318,7 @@ ac_ct_AR = @ac_ct_AR@
|
||||
ac_ct_CC = @ac_ct_CC@
|
||||
ac_ct_CXX = @ac_ct_CXX@
|
||||
ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
|
||||
ac_cv_sizeof_void_p = @ac_cv_sizeof_void_p@
|
||||
am__include = @am__include@
|
||||
am__leading_dot = @am__leading_dot@
|
||||
am__quote = @am__quote@
|
||||
@ -338,6 +356,7 @@ pdfdir = @pdfdir@
|
||||
prefix = @prefix@
|
||||
program_transform_name = @program_transform_name@
|
||||
psdir = @psdir@
|
||||
runstatedir = @runstatedir@
|
||||
sbindir = @sbindir@
|
||||
sharedstatedir = @sharedstatedir@
|
||||
srcdir = @srcdir@
|
||||
@ -353,8 +372,8 @@ xmlwf_SOURCES = \
|
||||
codepage.c \
|
||||
@FILEMAP@.c
|
||||
|
||||
xmlwf_CPPFLAGS = -I$(srcdir)/../lib $(am__append_1)
|
||||
@MINGW_TRUE@@UNICODE_TRUE@xmlwf_LDFLAGS = -municode
|
||||
xmlwf_CPPFLAGS = @AM_CPPFLAGS@ -I$(srcdir)/../lib $(am__append_1)
|
||||
xmlwf_LDFLAGS = @AM_LDFLAGS@ @LIBM@ $(am__append_2)
|
||||
EXTRA_DIST = \
|
||||
codepage.h \
|
||||
ct.c \
|
||||
@ -605,7 +624,6 @@ cscopelist-am: $(am__tagged_files)
|
||||
|
||||
distclean-tags:
|
||||
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
|
||||
|
||||
distdir: $(BUILT_SOURCES)
|
||||
$(MAKE) $(AM_MAKEFLAGS) distdir-am
|
||||
|
||||
|
@ -7,7 +7,11 @@
|
||||
|_| XML parser
|
||||
|
||||
Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
|
||||
Copyright (c) 2000-2017 Expat development team
|
||||
Copyright (c) 2000 Clark Cooper <coopercc@users.sourceforge.net>
|
||||
Copyright (c) 2002 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
|
||||
Copyright (c) 2005-2006 Karl Waclawek <karl@waclawek.net>
|
||||
Copyright (c) 2016-2019 Sebastian Pipping <sebastian@pipping.org>
|
||||
Copyright (c) 2019 David Loffredo <loffredo@steptools.com>
|
||||
Licensed under the MIT license:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
@ -38,9 +42,11 @@
|
||||
# define WIN32_LEAN_AND_MEAN 1
|
||||
|
||||
# include <windows.h>
|
||||
#endif /* defined(_WIN32) */
|
||||
|
||||
int
|
||||
codepageMap(int cp, int *map) {
|
||||
#if defined(_WIN32)
|
||||
int i;
|
||||
CPINFO info;
|
||||
if (! GetCPInfo(cp, &info) || info.MaxCharSize > 2)
|
||||
@ -68,32 +74,25 @@ codepageMap(int cp, int *map) {
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
#else
|
||||
UNUSED_P(cp);
|
||||
UNUSED_P(map);
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
int
|
||||
codepageConvert(int cp, const char *p) {
|
||||
#if defined(_WIN32)
|
||||
unsigned short c;
|
||||
if (MultiByteToWideChar(cp, MB_PRECOMPOSED | MB_ERR_INVALID_CHARS, p, 2, &c,
|
||||
1)
|
||||
== 1)
|
||||
return c;
|
||||
return -1;
|
||||
}
|
||||
|
||||
#else /* not _WIN32 */
|
||||
|
||||
int
|
||||
codepageMap(int cp, int *map) {
|
||||
UNUSED_P(cp);
|
||||
UNUSED_P(map);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
codepageConvert(int cp, const char *p) {
|
||||
#else
|
||||
UNUSED_P(cp);
|
||||
UNUSED_P(p);
|
||||
return -1;
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif /* not _WIN32 */
|
||||
|
@ -7,7 +7,9 @@
|
||||
|_| XML parser
|
||||
|
||||
Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
|
||||
Copyright (c) 2000-2017 Expat development team
|
||||
Copyright (c) 2000 Clark Cooper <coopercc@users.sourceforge.net>
|
||||
Copyright (c) 2002 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
|
||||
Copyright (c) 2016-2017 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) 1997-2000 Thai Open Source Software Center Ltd
|
||||
Copyright (c) 2000-2017 Expat development team
|
||||
Copyright (c) 2002 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
|
||||
Copyright (c) 2016-2017 Sebastian Pipping <sebastian@pipping.org>
|
||||
Licensed under the MIT license:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
|
@ -7,7 +7,9 @@
|
||||
|_| XML parser
|
||||
|
||||
Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
|
||||
Copyright (c) 2000-2017 Expat development team
|
||||
Copyright (c) 2000 Clark Cooper <coopercc@users.sourceforge.net>
|
||||
Copyright (c) 2002 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
|
||||
Copyright (c) 2016-2017 Sebastian Pipping <sebastian@pipping.org>
|
||||
Licensed under the MIT license:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
|
@ -7,7 +7,12 @@
|
||||
|_| XML parser
|
||||
|
||||
Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
|
||||
Copyright (c) 2000-2017 Expat development team
|
||||
Copyright (c) 2000 Clark Cooper <coopercc@users.sourceforge.net>
|
||||
Copyright (c) 2001-2004 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
|
||||
Copyright (c) 2002-2009 Karl Waclawek <karl@waclawek.net>
|
||||
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>
|
||||
Licensed under the MIT license:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
|
@ -7,7 +7,11 @@
|
||||
|_| XML parser
|
||||
|
||||
Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
|
||||
Copyright (c) 2000-2017 Expat development team
|
||||
Copyright (c) 2000 Clark Cooper <coopercc@users.sourceforge.net>
|
||||
Copyright (c) 2001-2002 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
|
||||
Copyright (c) 2006 Karl Waclawek <karl@waclawek.net>
|
||||
Copyright (c) 2016-2017 Sebastian Pipping <sebastian@pipping.org>
|
||||
Copyright (c) 2017 Rhodri James <rhodri@wildebeest.org.uk>
|
||||
Licensed under the MIT license:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
|
@ -7,7 +7,9 @@
|
||||
|_| XML parser
|
||||
|
||||
Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
|
||||
Copyright (c) 2000-2017 Expat development team
|
||||
Copyright (c) 2000 Clark Cooper <coopercc@users.sourceforge.net>
|
||||
Copyright (c) 2002 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
|
||||
Copyright (c) 2016-2017 Sebastian Pipping <sebastian@pipping.org>
|
||||
Licensed under the MIT license:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
|
@ -7,7 +7,14 @@
|
||||
|_| XML parser
|
||||
|
||||
Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
|
||||
Copyright (c) 2000-2017 Expat development team
|
||||
Copyright (c) 2000 Clark Cooper <coopercc@users.sourceforge.net>
|
||||
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 <ssolie@users.sourceforge.net>
|
||||
Copyright (c) 2016-2021 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>
|
||||
Licensed under the MIT license:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
@ -30,6 +37,8 @@
|
||||
USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <expat_config.h>
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stddef.h>
|
||||
@ -38,9 +47,7 @@
|
||||
|
||||
#ifdef _WIN32
|
||||
# include "winconfig.h"
|
||||
#elif defined(HAVE_EXPAT_CONFIG_H)
|
||||
# include <expat_config.h>
|
||||
#endif /* ndef _WIN32 */
|
||||
#endif
|
||||
|
||||
#include "expat.h"
|
||||
#include "internal.h" /* for UNUSED_P only */
|
||||
@ -176,7 +183,7 @@ externalEntityRefFilemap(XML_Parser parser, const XML_Char *context,
|
||||
|
||||
static int
|
||||
processStream(const XML_Char *filename, XML_Parser parser) {
|
||||
/* passing NULL for filename means read intput from stdin */
|
||||
/* passing NULL for filename means read input from stdin */
|
||||
int fd = 0; /* 0 is the fileno for stdin */
|
||||
|
||||
if (filename != NULL) {
|
||||
|
@ -7,7 +7,10 @@
|
||||
|_| XML parser
|
||||
|
||||
Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
|
||||
Copyright (c) 2000-2017 Expat development team
|
||||
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>
|
||||
Licensed under the MIT license:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
|
@ -7,7 +7,9 @@
|
||||
|_| XML parser
|
||||
|
||||
Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
|
||||
Copyright (c) 2000-2017 Expat development team
|
||||
Copyright (c) 2002 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
|
||||
Copyright (c) 2016-2018 Sebastian Pipping <sebastian@pipping.org>
|
||||
Copyright (c) 2018 Marco Maggi <marco.maggi-ipsu@poste.it>
|
||||
Licensed under the MIT license:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
|
@ -7,7 +7,8 @@
|
||||
|_| XML parser
|
||||
|
||||
Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
|
||||
Copyright (c) 2000-2017 Expat development team
|
||||
Copyright (c) 2002 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
|
||||
Copyright (c) 2016-2017 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) 1997-2000 Thai Open Source Software Center Ltd
|
||||
Copyright (c) 2000-2017 Expat development team
|
||||
Copyright (c) 2016-2021 Sebastian Pipping <sebastian@pipping.org>
|
||||
Copyright (c) 2017 Rhodri James <rhodri@wildebeest.org.uk>
|
||||
Licensed under the MIT license:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
@ -54,6 +55,8 @@
|
||||
# define tmain wmain
|
||||
# define tremove _wremove
|
||||
# define tchar wchar_t
|
||||
# define tcstof wcstof
|
||||
# define tcstoull wcstoull
|
||||
#else /* not XML_UNICODE */
|
||||
# define T(x) x
|
||||
# define ftprintf fprintf
|
||||
@ -71,4 +74,6 @@
|
||||
# define tmain main
|
||||
# define tremove remove
|
||||
# define tchar char
|
||||
# define tcstof strtof
|
||||
# define tcstoull strtoull
|
||||
#endif /* not XML_UNICODE */
|
||||
|
@ -1,45 +0,0 @@
|
||||
/*
|
||||
__ __ _
|
||||
___\ \/ /_ __ __ _| |_
|
||||
/ _ \\ /| '_ \ / _` | __|
|
||||
| __// \| |_) | (_| | |_
|
||||
\___/_/\_\ .__/ \__,_|\__|
|
||||
|_| XML parser
|
||||
|
||||
Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
|
||||
Copyright (c) 2000-2017 Expat development team
|
||||
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
|
||||
|
||||
int XML_URLInit();
|
||||
void XML_URLUninit();
|
||||
int XML_ProcessURL(XML_Parser parser,
|
||||
const XML_Char *url,
|
||||
unsigned flags);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
186
xmlwf/xmlwf.c
186
xmlwf/xmlwf.c
@ -7,7 +7,16 @@
|
||||
|_| XML parser
|
||||
|
||||
Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
|
||||
Copyright (c) 2000-2017 Expat development team
|
||||
Copyright (c) 2000 Clark Cooper <coopercc@users.sourceforge.net>
|
||||
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 <ssolie@users.sourceforge.net>
|
||||
Copyright (c) 2016-2021 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>
|
||||
Licensed under the MIT license:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
@ -30,11 +39,15 @@
|
||||
USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <expat_config.h>
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stddef.h>
|
||||
#include <string.h>
|
||||
#include <math.h> /* for isnan */
|
||||
#include <errno.h>
|
||||
|
||||
#include "expat.h"
|
||||
#include "codepage.h"
|
||||
@ -50,6 +63,14 @@
|
||||
# include <wchar.h>
|
||||
#endif
|
||||
|
||||
enum ExitCode {
|
||||
XMLWF_EXIT_SUCCESS = 0,
|
||||
XMLWF_EXIT_INTERNAL_ERROR = 1,
|
||||
XMLWF_EXIT_NOT_WELLFORMED = 2,
|
||||
XMLWF_EXIT_OUTPUT_ERROR = 3,
|
||||
XMLWF_EXIT_USAGE_ERROR = 4,
|
||||
};
|
||||
|
||||
/* Structures for handler user data */
|
||||
typedef struct NotationList {
|
||||
struct NotationList *next;
|
||||
@ -322,6 +343,13 @@ freeNotations(XmlwfUserData *data) {
|
||||
data->notationListHead = NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
cleanupUserData(XmlwfUserData *userData) {
|
||||
free((void *)userData->currentDoctypeName);
|
||||
userData->currentDoctypeName = NULL;
|
||||
freeNotations(userData);
|
||||
}
|
||||
|
||||
static int
|
||||
xcscmp(const XML_Char *xs, const XML_Char *xt) {
|
||||
while (*xs != 0 && *xt != 0) {
|
||||
@ -848,16 +876,19 @@ usage(const XML_Char *prog, int rc) {
|
||||
stderr,
|
||||
/* Generated with:
|
||||
* $ xmlwf/xmlwf_helpgen.sh
|
||||
* To update, change xmlwf/xmlwf_helpgen.py, then paste the output of
|
||||
* xmlwf/xmlwf_helpgen.sh in here.
|
||||
*/
|
||||
/* clang-format off */
|
||||
T("usage: %s [-s] [-n] [-p] [-x] [-e ENCODING] [-w] [-r] [-d DIRECTORY]\n")
|
||||
T(" [-c | -m | -t] [-N]\n")
|
||||
T(" [FILE [FILE ...]]\n")
|
||||
T("usage:\n")
|
||||
T(" %s [OPTIONS] [FILE ...]\n")
|
||||
T(" %s -h\n")
|
||||
T(" %s -v\n")
|
||||
T("\n")
|
||||
T("xmlwf - Determines if an XML document is well-formed\n")
|
||||
T("\n")
|
||||
T("positional arguments:\n")
|
||||
T(" FILE files 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")
|
||||
@ -867,6 +898,7 @@ usage(const XML_Char *prog, int rc) {
|
||||
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("\n")
|
||||
T("output control arguments:\n")
|
||||
T(" -d DIRECTORY output [d]estination directory\n")
|
||||
@ -875,14 +907,27 @@ usage(const XML_Char *prog, int rc) {
|
||||
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("\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("\n")
|
||||
T("libexpat is software libre, licensed under the MIT license.\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("\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")
|
||||
, /* clang-format on */
|
||||
prog);
|
||||
prog, prog, prog);
|
||||
exit(rc);
|
||||
}
|
||||
|
||||
@ -891,6 +936,19 @@ usage(const XML_Char *prog, int rc) {
|
||||
int wmain(int argc, XML_Char **argv);
|
||||
#endif
|
||||
|
||||
#define XMLWF_SHIFT_ARG_INTO(constCharStarTarget, argc, argv, i, j) \
|
||||
{ \
|
||||
if (argv[i][j + 1] == T('\0')) { \
|
||||
if (++i == argc) \
|
||||
usage(argv[0], XMLWF_EXIT_USAGE_ERROR); \
|
||||
constCharStarTarget = argv[i]; \
|
||||
} else { \
|
||||
constCharStarTarget = argv[i] + j + 1; \
|
||||
} \
|
||||
i++; \
|
||||
j = 0; \
|
||||
}
|
||||
|
||||
int
|
||||
tmain(int argc, XML_Char **argv) {
|
||||
int i, j;
|
||||
@ -902,6 +960,13 @@ tmain(int argc, XML_Char **argv) {
|
||||
int useNamespaces = 0;
|
||||
int requireStandalone = 0;
|
||||
int requiresNotations = 0;
|
||||
int continueOnError = 0;
|
||||
|
||||
float attackMaximumAmplification = -1.0f; /* signaling "not set" */
|
||||
unsigned long long attackThresholdBytes;
|
||||
XML_Bool attackThresholdGiven = XML_FALSE;
|
||||
|
||||
int exitCode = XMLWF_EXIT_SUCCESS;
|
||||
enum XML_ParamEntityParsing paramEntityParsing
|
||||
= XML_PARAM_ENTITY_PARSING_NEVER;
|
||||
int useStdin = 0;
|
||||
@ -965,31 +1030,64 @@ tmain(int argc, XML_Char **argv) {
|
||||
j++;
|
||||
break;
|
||||
case T('d'):
|
||||
if (argv[i][j + 1] == T('\0')) {
|
||||
if (++i == argc)
|
||||
usage(argv[0], 2);
|
||||
outputDir = argv[i];
|
||||
} else
|
||||
outputDir = argv[i] + j + 1;
|
||||
i++;
|
||||
j = 0;
|
||||
XMLWF_SHIFT_ARG_INTO(outputDir, argc, argv, i, j);
|
||||
break;
|
||||
case T('e'):
|
||||
if (argv[i][j + 1] == T('\0')) {
|
||||
if (++i == argc)
|
||||
usage(argv[0], 2);
|
||||
encoding = argv[i];
|
||||
} else
|
||||
encoding = argv[i] + j + 1;
|
||||
i++;
|
||||
j = 0;
|
||||
XMLWF_SHIFT_ARG_INTO(encoding, argc, argv, i, j);
|
||||
break;
|
||||
case T('h'):
|
||||
usage(argv[0], 0);
|
||||
usage(argv[0], XMLWF_EXIT_SUCCESS);
|
||||
return 0;
|
||||
case T('v'):
|
||||
showVersion(argv[0]);
|
||||
return 0;
|
||||
case T('k'):
|
||||
continueOnError = 1;
|
||||
j++;
|
||||
break;
|
||||
case T('a'): {
|
||||
const XML_Char *valueText = NULL;
|
||||
XMLWF_SHIFT_ARG_INTO(valueText, argc, argv, i, j);
|
||||
|
||||
errno = 0;
|
||||
XML_Char *afterValueText = (XML_Char *)valueText;
|
||||
attackMaximumAmplification = tcstof(valueText, &afterValueText);
|
||||
if ((errno != 0) || (afterValueText[0] != T('\0'))
|
||||
|| isnan(attackMaximumAmplification)
|
||||
|| (attackMaximumAmplification < 1.0f)) {
|
||||
// This prevents tperror(..) from reporting misleading "[..]: Success"
|
||||
errno = ERANGE;
|
||||
tperror(T("invalid amplification limit") T(
|
||||
" (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"));
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
case T('b'): {
|
||||
const XML_Char *valueText = NULL;
|
||||
XMLWF_SHIFT_ARG_INTO(valueText, argc, argv, i, j);
|
||||
|
||||
errno = 0;
|
||||
XML_Char *afterValueText = (XML_Char *)valueText;
|
||||
attackThresholdBytes = tcstoull(valueText, &afterValueText, 10);
|
||||
if ((errno != 0) || (afterValueText[0] != T('\0'))) {
|
||||
// This prevents tperror(..) from reporting misleading "[..]: Success"
|
||||
errno = ERANGE;
|
||||
tperror(T("invalid ignore threshold")
|
||||
T(" (needs an integer from 0 to 2^64-1)"));
|
||||
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"));
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
case T('\0'):
|
||||
if (j > 1) {
|
||||
i++;
|
||||
@ -998,7 +1096,7 @@ tmain(int argc, XML_Char **argv) {
|
||||
}
|
||||
/* fall through */
|
||||
default:
|
||||
usage(argv[0], 2);
|
||||
usage(argv[0], XMLWF_EXIT_USAGE_ERROR);
|
||||
}
|
||||
}
|
||||
if (i == argc) {
|
||||
@ -1017,7 +1115,22 @@ tmain(int argc, XML_Char **argv) {
|
||||
|
||||
if (! parser) {
|
||||
tperror(T("Could not instantiate parser"));
|
||||
exit(1);
|
||||
exit(XMLWF_EXIT_INTERNAL_ERROR);
|
||||
}
|
||||
|
||||
if (attackMaximumAmplification != -1.0f) {
|
||||
#ifdef XML_DTD
|
||||
XML_SetBillionLaughsAttackProtectionMaximumAmplification(
|
||||
parser, attackMaximumAmplification);
|
||||
#endif
|
||||
}
|
||||
if (attackThresholdGiven) {
|
||||
#ifdef XML_DTD
|
||||
XML_SetBillionLaughsAttackProtectionActivationThreshold(
|
||||
parser, attackThresholdBytes);
|
||||
#else
|
||||
(void)attackThresholdBytes; // silence -Wunused-but-set-variable
|
||||
#endif
|
||||
}
|
||||
|
||||
if (requireStandalone)
|
||||
@ -1051,13 +1164,24 @@ tmain(int argc, XML_Char **argv) {
|
||||
}
|
||||
outName = (XML_Char *)malloc((tcslen(outputDir) + tcslen(file) + 2)
|
||||
* sizeof(XML_Char));
|
||||
if (! outName) {
|
||||
tperror(T("Could not allocate memory"));
|
||||
exit(XMLWF_EXIT_INTERNAL_ERROR);
|
||||
}
|
||||
tcscpy(outName, outputDir);
|
||||
tcscat(outName, delim);
|
||||
tcscat(outName, file);
|
||||
userData.fp = tfopen(outName, T("wb"));
|
||||
if (! userData.fp) {
|
||||
tperror(outName);
|
||||
exit(1);
|
||||
exitCode = XMLWF_EXIT_OUTPUT_ERROR;
|
||||
if (continueOnError) {
|
||||
free(outName);
|
||||
cleanupUserData(&userData);
|
||||
continue;
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
setvbuf(userData.fp, NULL, _IOFBF, 16384);
|
||||
#ifdef XML_UNICODE
|
||||
@ -1119,8 +1243,12 @@ tmain(int argc, XML_Char **argv) {
|
||||
}
|
||||
XML_ParserFree(parser);
|
||||
if (! result) {
|
||||
exit(2);
|
||||
exitCode = XMLWF_EXIT_NOT_WELLFORMED;
|
||||
cleanupUserData(&userData);
|
||||
if (! continueOnError) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
return exitCode;
|
||||
}
|
||||
|
@ -6,7 +6,8 @@
|
||||
# \___/_/\_\ .__/ \__,_|\__|
|
||||
# |_| XML parser
|
||||
#
|
||||
# Copyright (c) 2019 Expat development team
|
||||
# Copyright (c) 2019-2021 Sebastian Pipping <sebastian@pipping.org>
|
||||
# Copyright (c) 2021 Tim Bray <tbray@textuality.com>
|
||||
# Licensed under the MIT license:
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
@ -31,11 +32,25 @@
|
||||
import argparse
|
||||
|
||||
epilog = """
|
||||
libexpat is software libre, licensed under the MIT license.
|
||||
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
|
||||
|
||||
xmlwf of libexpat is software libre, licensed under the MIT license.
|
||||
Please report bugs at https://github.com/libexpat/libexpat/issues. Thank you!
|
||||
"""
|
||||
|
||||
usage = """
|
||||
%(prog)s [OPTIONS] [FILE ...]
|
||||
%(prog)s -h
|
||||
%(prog)s -v
|
||||
"""
|
||||
|
||||
parser = argparse.ArgumentParser(prog='xmlwf', add_help=False,
|
||||
usage=usage,
|
||||
description='xmlwf - Determines if an XML document is well-formed',
|
||||
formatter_class=argparse.RawTextHelpFormatter,
|
||||
epilog=epilog)
|
||||
@ -48,6 +63,7 @@
|
||||
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('-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')
|
||||
output_related.add_argument('-d', action='store', metavar='DIRECTORY', help='output [d]estination directory')
|
||||
@ -57,7 +73,15 @@
|
||||
output_mode.add_argument('-t', action='store_true', help='write no XML output for [t]iming of plain parsing')
|
||||
output_related.add_argument('-N', action='store_true', help='enable adding doctype and [n]otation declarations')
|
||||
|
||||
parser.add_argument('files', metavar='FILE', nargs='*', help='files to process (default: STDIN)')
|
||||
billion_laughs = parser.add_argument_group('billion laughs attack protection',
|
||||
description='NOTE: '
|
||||
'If you ever need to increase these values '
|
||||
'for non-attack payload, please file a bug report.')
|
||||
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)')
|
||||
|
||||
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()
|
||||
|
@ -6,7 +6,7 @@
|
||||
# \___/_/\_\ .__/ \__,_|\__|
|
||||
# |_| XML parser
|
||||
#
|
||||
# Copyright (c) 2019 Expat development team
|
||||
# Copyright (c) 2019-2021 Sebastian Pipping <sebastian@pipping.org>
|
||||
# Licensed under the MIT license:
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
@ -29,7 +29,8 @@
|
||||
# USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
./xmlwf/xmlwf_helpgen.py | sed \
|
||||
-e 's,usage: xmlwf,usage: %s,' \
|
||||
-e 's,usage: ,usage:,' \
|
||||
-e 's, xmlwf, %s,' \
|
||||
-e 's, \[-h | -v\],,' \
|
||||
-e 's,^, T(",' \
|
||||
-e 's,$,\\n"),'
|
||||
|
@ -1,427 +0,0 @@
|
||||
/*
|
||||
__ __ _
|
||||
___\ \/ /_ __ __ _| |_
|
||||
/ _ \\ /| '_ \ / _` | __|
|
||||
| __// \| |_) | (_| | |_
|
||||
\___/_/\_\ .__/ \__,_|\__|
|
||||
|_| XML parser
|
||||
|
||||
Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
|
||||
Copyright (c) 2000-2017 Expat development team
|
||||
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"
|
||||
#ifdef XML_UNICODE
|
||||
#define UNICODE
|
||||
#endif
|
||||
#include <windows.h>
|
||||
#include <urlmon.h>
|
||||
#include <wininet.h>
|
||||
#include <stdio.h>
|
||||
#include <tchar.h>
|
||||
#include "xmlurl.h"
|
||||
#include "xmlmime.h"
|
||||
|
||||
static int
|
||||
processURL(XML_Parser parser, IMoniker *baseMoniker, const XML_Char *url);
|
||||
|
||||
typedef void (*StopHandler)(void *, HRESULT);
|
||||
|
||||
class Callback : public IBindStatusCallback {
|
||||
public:
|
||||
// IUnknown methods
|
||||
STDMETHODIMP QueryInterface(REFIID,void **);
|
||||
STDMETHODIMP_(ULONG) AddRef();
|
||||
STDMETHODIMP_(ULONG) Release();
|
||||
// IBindStatusCallback methods
|
||||
STDMETHODIMP OnStartBinding(DWORD, IBinding *);
|
||||
STDMETHODIMP GetPriority(LONG *);
|
||||
STDMETHODIMP OnLowResource(DWORD);
|
||||
STDMETHODIMP OnProgress(ULONG, ULONG, ULONG, LPCWSTR);
|
||||
STDMETHODIMP OnStopBinding(HRESULT, LPCWSTR);
|
||||
STDMETHODIMP GetBindInfo(DWORD *, BINDINFO *);
|
||||
STDMETHODIMP OnDataAvailable(DWORD, DWORD, FORMATETC *, STGMEDIUM *);
|
||||
STDMETHODIMP OnObjectAvailable(REFIID, IUnknown *);
|
||||
Callback(XML_Parser, IMoniker *, StopHandler, void *);
|
||||
~Callback();
|
||||
int externalEntityRef(const XML_Char *context,
|
||||
const XML_Char *systemId, const XML_Char *publicId);
|
||||
private:
|
||||
XML_Parser parser_;
|
||||
IMoniker *baseMoniker_;
|
||||
DWORD totalRead_;
|
||||
ULONG ref_;
|
||||
IBinding *pBinding_;
|
||||
StopHandler stopHandler_;
|
||||
void *stopArg_;
|
||||
};
|
||||
|
||||
STDMETHODIMP_(ULONG)
|
||||
Callback::AddRef()
|
||||
{
|
||||
return ref_++;
|
||||
}
|
||||
|
||||
STDMETHODIMP_(ULONG)
|
||||
Callback::Release()
|
||||
{
|
||||
if (--ref_ == 0) {
|
||||
delete this;
|
||||
return 0;
|
||||
}
|
||||
return ref_;
|
||||
}
|
||||
|
||||
STDMETHODIMP
|
||||
Callback::QueryInterface(REFIID riid, void** ppv)
|
||||
{
|
||||
if (IsEqualGUID(riid, IID_IUnknown))
|
||||
*ppv = (IUnknown *)this;
|
||||
else if (IsEqualGUID(riid, IID_IBindStatusCallback))
|
||||
*ppv = (IBindStatusCallback *)this;
|
||||
else
|
||||
return E_NOINTERFACE;
|
||||
((LPUNKNOWN)*ppv)->AddRef();
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
STDMETHODIMP
|
||||
Callback::OnStartBinding(DWORD, IBinding* pBinding)
|
||||
{
|
||||
pBinding_ = pBinding;
|
||||
pBinding->AddRef();
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
STDMETHODIMP
|
||||
Callback::GetPriority(LONG *)
|
||||
{
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
STDMETHODIMP
|
||||
Callback::OnLowResource(DWORD)
|
||||
{
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
STDMETHODIMP
|
||||
Callback::OnProgress(ULONG, ULONG, ULONG, LPCWSTR)
|
||||
{
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
STDMETHODIMP
|
||||
Callback::OnStopBinding(HRESULT hr, LPCWSTR szError)
|
||||
{
|
||||
if (pBinding_) {
|
||||
pBinding_->Release();
|
||||
pBinding_ = 0;
|
||||
}
|
||||
if (baseMoniker_) {
|
||||
baseMoniker_->Release();
|
||||
baseMoniker_ = 0;
|
||||
}
|
||||
stopHandler_(stopArg_, hr);
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
STDMETHODIMP
|
||||
Callback::GetBindInfo(DWORD* pgrfBINDF, BINDINFO* pbindinfo)
|
||||
{
|
||||
*pgrfBINDF = BINDF_ASYNCHRONOUS;
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
static void
|
||||
reportError(XML_Parser parser)
|
||||
{
|
||||
int code = XML_GetErrorCode(parser);
|
||||
const XML_Char *message = XML_ErrorString(code);
|
||||
if (message)
|
||||
_ftprintf(stderr, _T("%s:%d:%ld: %s\n"),
|
||||
XML_GetBase(parser),
|
||||
XML_GetErrorLineNumber(parser),
|
||||
XML_GetErrorColumnNumber(parser),
|
||||
message);
|
||||
else
|
||||
_ftprintf(stderr, _T("%s: (unknown message %d)\n"),
|
||||
XML_GetBase(parser), code);
|
||||
}
|
||||
|
||||
STDMETHODIMP
|
||||
Callback::OnDataAvailable(DWORD grfBSCF,
|
||||
DWORD dwSize,
|
||||
FORMATETC *pfmtetc,
|
||||
STGMEDIUM* pstgmed)
|
||||
{
|
||||
if (grfBSCF & BSCF_FIRSTDATANOTIFICATION) {
|
||||
IWinInetHttpInfo *hp;
|
||||
HRESULT hr = pBinding_->QueryInterface(IID_IWinInetHttpInfo,
|
||||
(void **)&hp);
|
||||
if (SUCCEEDED(hr)) {
|
||||
char contentType[1024];
|
||||
DWORD bufSize = sizeof(contentType);
|
||||
DWORD flags = 0;
|
||||
contentType[0] = 0;
|
||||
hr = hp->QueryInfo(HTTP_QUERY_CONTENT_TYPE, contentType,
|
||||
&bufSize, 0, NULL);
|
||||
if (SUCCEEDED(hr)) {
|
||||
char charset[CHARSET_MAX];
|
||||
getXMLCharset(contentType, charset);
|
||||
if (charset[0]) {
|
||||
#ifdef XML_UNICODE
|
||||
XML_Char wcharset[CHARSET_MAX];
|
||||
XML_Char *p1 = wcharset;
|
||||
const char *p2 = charset;
|
||||
while ((*p1++ = (unsigned char)*p2++) != 0)
|
||||
;
|
||||
XML_SetEncoding(parser_, wcharset);
|
||||
#else
|
||||
XML_SetEncoding(parser_, charset);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
hp->Release();
|
||||
}
|
||||
}
|
||||
if (!parser_)
|
||||
return E_ABORT;
|
||||
if (pstgmed->tymed == TYMED_ISTREAM) {
|
||||
while (totalRead_ < dwSize) {
|
||||
#define READ_MAX (64*1024)
|
||||
DWORD nToRead = dwSize - totalRead_;
|
||||
if (nToRead > READ_MAX)
|
||||
nToRead = READ_MAX;
|
||||
void *buf = XML_GetBuffer(parser_, nToRead);
|
||||
if (!buf) {
|
||||
_ftprintf(stderr, _T("out of memory\n"));
|
||||
return E_ABORT;
|
||||
}
|
||||
DWORD nRead;
|
||||
HRESULT hr = pstgmed->pstm->Read(buf, nToRead, &nRead);
|
||||
if (SUCCEEDED(hr)) {
|
||||
totalRead_ += nRead;
|
||||
if (!XML_ParseBuffer(parser_,
|
||||
nRead,
|
||||
(grfBSCF & BSCF_LASTDATANOTIFICATION) != 0
|
||||
&& totalRead_ == dwSize)) {
|
||||
reportError(parser_);
|
||||
return E_ABORT;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
STDMETHODIMP
|
||||
Callback::OnObjectAvailable(REFIID, IUnknown *)
|
||||
{
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
int
|
||||
Callback::externalEntityRef(const XML_Char *context,
|
||||
const XML_Char *systemId,
|
||||
const XML_Char *publicId)
|
||||
{
|
||||
XML_Parser entParser = XML_ExternalEntityParserCreate(parser_, context, 0);
|
||||
XML_SetBase(entParser, systemId);
|
||||
int ret = processURL(entParser, baseMoniker_, systemId);
|
||||
XML_ParserFree(entParser);
|
||||
return ret;
|
||||
}
|
||||
|
||||
Callback::Callback(XML_Parser parser, IMoniker *baseMoniker,
|
||||
StopHandler stopHandler, void *stopArg)
|
||||
: parser_(parser),
|
||||
baseMoniker_(baseMoniker),
|
||||
ref_(0),
|
||||
pBinding_(0),
|
||||
totalRead_(0),
|
||||
stopHandler_(stopHandler),
|
||||
stopArg_(stopArg)
|
||||
{
|
||||
if (baseMoniker_)
|
||||
baseMoniker_->AddRef();
|
||||
}
|
||||
|
||||
Callback::~Callback()
|
||||
{
|
||||
if (pBinding_)
|
||||
pBinding_->Release();
|
||||
if (baseMoniker_)
|
||||
baseMoniker_->Release();
|
||||
}
|
||||
|
||||
static int
|
||||
externalEntityRef(void *arg,
|
||||
const XML_Char *context,
|
||||
const XML_Char *base,
|
||||
const XML_Char *systemId,
|
||||
const XML_Char *publicId)
|
||||
{
|
||||
return ((Callback *)arg)->externalEntityRef(context, systemId, publicId);
|
||||
}
|
||||
|
||||
|
||||
static HRESULT
|
||||
openStream(XML_Parser parser,
|
||||
IMoniker *baseMoniker,
|
||||
const XML_Char *uri,
|
||||
StopHandler stopHandler, void *stopArg)
|
||||
{
|
||||
if (!XML_SetBase(parser, uri))
|
||||
return E_OUTOFMEMORY;
|
||||
HRESULT hr;
|
||||
IMoniker *m;
|
||||
#ifdef XML_UNICODE
|
||||
hr = CreateURLMoniker(0, uri, &m);
|
||||
#else
|
||||
LPWSTR uriw = new wchar_t[strlen(uri) + 1];
|
||||
for (int i = 0;; i++) {
|
||||
uriw[i] = uri[i];
|
||||
if (uriw[i] == 0)
|
||||
break;
|
||||
}
|
||||
hr = CreateURLMoniker(baseMoniker, uriw, &m);
|
||||
delete [] uriw;
|
||||
#endif
|
||||
if (FAILED(hr))
|
||||
return hr;
|
||||
IBindStatusCallback *cb = new Callback(parser, m, stopHandler, stopArg);
|
||||
XML_SetExternalEntityRefHandler(parser, externalEntityRef);
|
||||
XML_SetExternalEntityRefHandlerArg(parser, cb);
|
||||
cb->AddRef();
|
||||
IBindCtx *b;
|
||||
if (FAILED(hr = CreateAsyncBindCtx(0, cb, 0, &b))) {
|
||||
cb->Release();
|
||||
m->Release();
|
||||
return hr;
|
||||
}
|
||||
cb->Release();
|
||||
IStream *pStream;
|
||||
hr = m->BindToStorage(b, 0, IID_IStream, (void **)&pStream);
|
||||
if (SUCCEEDED(hr)) {
|
||||
if (pStream)
|
||||
pStream->Release();
|
||||
}
|
||||
if (hr == MK_S_ASYNCHRONOUS)
|
||||
hr = S_OK;
|
||||
m->Release();
|
||||
b->Release();
|
||||
return hr;
|
||||
}
|
||||
|
||||
struct QuitInfo {
|
||||
const XML_Char *url;
|
||||
HRESULT hr;
|
||||
int stop;
|
||||
};
|
||||
|
||||
static void
|
||||
winPerror(const XML_Char *url, HRESULT hr)
|
||||
{
|
||||
LPVOID buf;
|
||||
if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER
|
||||
| FORMAT_MESSAGE_FROM_HMODULE,
|
||||
GetModuleHandleA("urlmon.dll"),
|
||||
hr,
|
||||
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
|
||||
(LPTSTR) &buf,
|
||||
0,
|
||||
NULL)
|
||||
|| FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER
|
||||
| FORMAT_MESSAGE_FROM_SYSTEM,
|
||||
0,
|
||||
hr,
|
||||
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
|
||||
(LPTSTR) &buf,
|
||||
0,
|
||||
NULL)) {
|
||||
/* The system error messages seem to end with a newline. */
|
||||
_ftprintf(stderr, _T("%s: %s"), url, buf);
|
||||
fflush(stderr);
|
||||
LocalFree(buf);
|
||||
}
|
||||
else
|
||||
_ftprintf(stderr, _T("%s: error %x\n"), url, hr);
|
||||
}
|
||||
|
||||
static void
|
||||
threadQuit(void *p, HRESULT hr)
|
||||
{
|
||||
QuitInfo *qi = (QuitInfo *)p;
|
||||
qi->hr = hr;
|
||||
qi->stop = 1;
|
||||
}
|
||||
|
||||
extern "C"
|
||||
int
|
||||
XML_URLInit(void)
|
||||
{
|
||||
return SUCCEEDED(CoInitialize(0));
|
||||
}
|
||||
|
||||
extern "C"
|
||||
void
|
||||
XML_URLUninit(void)
|
||||
{
|
||||
CoUninitialize();
|
||||
}
|
||||
|
||||
static int
|
||||
processURL(XML_Parser parser, IMoniker *baseMoniker,
|
||||
const XML_Char *url)
|
||||
{
|
||||
QuitInfo qi;
|
||||
qi.stop = 0;
|
||||
qi.url = url;
|
||||
|
||||
XML_SetBase(parser, url);
|
||||
HRESULT hr = openStream(parser, baseMoniker, url, threadQuit, &qi);
|
||||
if (FAILED(hr)) {
|
||||
winPerror(url, hr);
|
||||
return 0;
|
||||
}
|
||||
else if (FAILED(qi.hr)) {
|
||||
winPerror(url, qi.hr);
|
||||
return 0;
|
||||
}
|
||||
MSG msg;
|
||||
while (!qi.stop && GetMessage (&msg, NULL, 0, 0)) {
|
||||
TranslateMessage (&msg);
|
||||
DispatchMessage (&msg);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
extern "C"
|
||||
int
|
||||
XML_ProcessURL(XML_Parser parser,
|
||||
const XML_Char *url,
|
||||
unsigned flags)
|
||||
{
|
||||
return processURL(parser, 0, url);
|
||||
}
|
Loading…
Reference in New Issue
Block a user