contrib/expat: import expat 2.8.1
Changes: https://github.com/libexpat/libexpat/blob/R_2_8_1/expat/Changes Security: CVE-2026-45186 MFC after: 1 week
This commit is contained in:
@@ -29,6 +29,32 @@
|
|||||||
!! THANK YOU! Sebastian Pipping -- Berlin, 2026-03-17 !!
|
!! THANK YOU! Sebastian Pipping -- Berlin, 2026-03-17 !!
|
||||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||||
|
|
||||||
|
Release 2.8.1 Sun May 10 2026
|
||||||
|
Security fixes:
|
||||||
|
#1216 CVE-2026-45186 -- Fix quadratic runtime from attribute name
|
||||||
|
collision checks that allowed denial of service attacks
|
||||||
|
through moderately sized crafted XML input (CWE-407).
|
||||||
|
Please note that a layer of compression around XML can
|
||||||
|
significantly reduce the minimum attack payload size.
|
||||||
|
|
||||||
|
Other changes:
|
||||||
|
#1209 #1213 Drop more casts related to `void *` that C99 does not need
|
||||||
|
#1213 xmlwf: Streamline use of `mmap`
|
||||||
|
#1214 #1217 Version info bumped from 13:0:12 (libexpat*.so.1.12.0)
|
||||||
|
to 13:1:12 (libexpat*.so.1.12.1); see https://verbump.de/
|
||||||
|
for what these numbers do
|
||||||
|
|
||||||
|
Infrastructure:
|
||||||
|
#1210 CI: Cover compilation with Visual Studio 18 2026 on Windows
|
||||||
|
#1215 CI: Cover compilation for ARM64 on Windows
|
||||||
|
#1212 CI: Bump WASI SDK from 32 to 33
|
||||||
|
|
||||||
|
Special thanks to:
|
||||||
|
Berkay Eren Ürün
|
||||||
|
Matthew Fernandez
|
||||||
|
Nick Wellnhofer
|
||||||
|
Tania Somanna
|
||||||
|
|
||||||
Release 2.8.0 Fri April 24 2026
|
Release 2.8.0 Fri April 24 2026
|
||||||
Security fixes:
|
Security fixes:
|
||||||
#47 #1183 CVE-2026-41080 -- The existing hash flooding protection
|
#47 #1183 CVE-2026-41080 -- The existing hash flooding protection
|
||||||
|
|||||||
@@ -11,7 +11,7 @@
|
|||||||
> at the top of the `Changes` file.
|
> at the top of the `Changes` file.
|
||||||
|
|
||||||
|
|
||||||
# Expat, Release 2.8.0
|
# Expat, Release 2.8.1
|
||||||
|
|
||||||
This is Expat, a C99 library for parsing
|
This is Expat, a C99 library for parsing
|
||||||
[XML 1.0 Fourth Edition](https://www.w3.org/TR/2006/REC-xml-20060816/), started by
|
[XML 1.0 Fourth Edition](https://www.w3.org/TR/2006/REC-xml-20060816/), started by
|
||||||
|
|||||||
@@ -90,7 +90,7 @@ dnl If the API changes incompatibly set LIBAGE back to 0
|
|||||||
dnl
|
dnl
|
||||||
|
|
||||||
LIBCURRENT=13 # sync
|
LIBCURRENT=13 # sync
|
||||||
LIBREVISION=0 # with
|
LIBREVISION=1 # with
|
||||||
LIBAGE=12 # CMakeLists.txt!
|
LIBAGE=12 # CMakeLists.txt!
|
||||||
|
|
||||||
AC_CONFIG_HEADERS([expat_config.h])
|
AC_CONFIG_HEADERS([expat_config.h])
|
||||||
|
|||||||
@@ -53,7 +53,7 @@
|
|||||||
<body>
|
<body>
|
||||||
<div>
|
<div>
|
||||||
<h1>
|
<h1>
|
||||||
The Expat XML Parser <small>Release 2.8.0</small>
|
The Expat XML Parser <small>Release 2.8.1</small>
|
||||||
</h1>
|
</h1>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
\\$2 \(la\\$1\(ra\\$3
|
\\$2 \(la\\$1\(ra\\$3
|
||||||
..
|
..
|
||||||
.if \n(.g .mso www.tmac
|
.if \n(.g .mso www.tmac
|
||||||
.TH XMLWF 1 "April 24, 2026" "" ""
|
.TH XMLWF 1 "May 10, 2026" "" ""
|
||||||
.SH NAME
|
.SH NAME
|
||||||
xmlwf \- Determines if an XML document is well-formed
|
xmlwf \- Determines if an XML document is well-formed
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
|
"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
|
||||||
<!ENTITY dhfirstname "<firstname>Scott</firstname>">
|
<!ENTITY dhfirstname "<firstname>Scott</firstname>">
|
||||||
<!ENTITY dhsurname "<surname>Bronson</surname>">
|
<!ENTITY dhsurname "<surname>Bronson</surname>">
|
||||||
<!ENTITY dhdate "<date>April 24, 2026</date>">
|
<!ENTITY dhdate "<date>May 10, 2026</date>">
|
||||||
<!-- Please adjust this^^ date whenever cutting a new release. -->
|
<!-- Please adjust this^^ date whenever cutting a new release. -->
|
||||||
<!ENTITY dhsection "<manvolnum>1</manvolnum>">
|
<!ENTITY dhsection "<manvolnum>1</manvolnum>">
|
||||||
<!ENTITY dhemail "<email>bronson@rinspin.com</email>">
|
<!ENTITY dhemail "<email>bronson@rinspin.com</email>">
|
||||||
|
|||||||
@@ -1094,7 +1094,7 @@ XML_SetReparseDeferralEnabled(XML_Parser parser, XML_Bool enabled);
|
|||||||
*/
|
*/
|
||||||
# define XML_MAJOR_VERSION 2
|
# define XML_MAJOR_VERSION 2
|
||||||
# define XML_MINOR_VERSION 8
|
# define XML_MINOR_VERSION 8
|
||||||
# define XML_MICRO_VERSION 0
|
# define XML_MICRO_VERSION 1
|
||||||
|
|
||||||
# ifdef __cplusplus
|
# ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
/* a5d18f6a50f536615ac1c70304f87d94f99cc85a86b502188952440610ccf0f8 (2.8.0+)
|
/* 75ef4224f81c052e9e5aeea2ac7de75357d2169ff9908e39edc08b9dc3052513 (2.8.1+)
|
||||||
__ __ _
|
__ __ _
|
||||||
___\ \/ /_ __ __ _| |_
|
___\ \/ /_ __ __ _| |_
|
||||||
/ _ \\ /| '_ \ / _` | __|
|
/ _ \\ /| '_ \ / _` | __|
|
||||||
@@ -387,6 +387,7 @@ typedef struct {
|
|||||||
int nDefaultAtts;
|
int nDefaultAtts;
|
||||||
int allocDefaultAtts;
|
int allocDefaultAtts;
|
||||||
DEFAULT_ATTRIBUTE *defaultAtts;
|
DEFAULT_ATTRIBUTE *defaultAtts;
|
||||||
|
HASH_TABLE defaultAttsNames;
|
||||||
} ELEMENT_TYPE;
|
} ELEMENT_TYPE;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
@@ -3769,6 +3770,8 @@ storeAtts(XML_Parser parser, const ENCODING *enc, const char *attStr,
|
|||||||
sizeof(ELEMENT_TYPE));
|
sizeof(ELEMENT_TYPE));
|
||||||
if (! elementType)
|
if (! elementType)
|
||||||
return XML_ERROR_NO_MEMORY;
|
return XML_ERROR_NO_MEMORY;
|
||||||
|
if (! elementType->defaultAttsNames.parser)
|
||||||
|
hashTableInit(&(elementType->defaultAttsNames), parser);
|
||||||
if (parser->m_ns && ! setElementTypePrefix(parser, elementType))
|
if (parser->m_ns && ! setElementTypePrefix(parser, elementType))
|
||||||
return XML_ERROR_NO_MEMORY;
|
return XML_ERROR_NO_MEMORY;
|
||||||
}
|
}
|
||||||
@@ -7102,9 +7105,9 @@ defineAttribute(ELEMENT_TYPE *type, ATTRIBUTE_ID *attId, XML_Bool isCdata,
|
|||||||
if (value || isId) {
|
if (value || isId) {
|
||||||
/* The handling of default attributes gets messed up if we have
|
/* The handling of default attributes gets messed up if we have
|
||||||
a default which duplicates a non-default. */
|
a default which duplicates a non-default. */
|
||||||
int i;
|
NAMED *const nameFound
|
||||||
for (i = 0; i < type->nDefaultAtts; i++)
|
= (NAMED *)lookup(parser, &(type->defaultAttsNames), attId->name, 0);
|
||||||
if (attId == type->defaultAtts[i].id)
|
if (nameFound)
|
||||||
return 1;
|
return 1;
|
||||||
if (isId && ! type->idAtt && ! attId->xmlns)
|
if (isId && ! type->idAtt && ! attId->xmlns)
|
||||||
type->idAtt = attId;
|
type->idAtt = attId;
|
||||||
@@ -7152,6 +7155,12 @@ defineAttribute(ELEMENT_TYPE *type, ATTRIBUTE_ID *attId, XML_Bool isCdata,
|
|||||||
att->isCdata = isCdata;
|
att->isCdata = isCdata;
|
||||||
if (! isCdata)
|
if (! isCdata)
|
||||||
attId->maybeTokenized = XML_TRUE;
|
attId->maybeTokenized = XML_TRUE;
|
||||||
|
|
||||||
|
NAMED *const nameAddedOrFound = (NAMED *)lookup(
|
||||||
|
parser, &(type->defaultAttsNames), attId->name, sizeof(NAMED));
|
||||||
|
if (! nameAddedOrFound)
|
||||||
|
return 0;
|
||||||
|
|
||||||
type->nDefaultAtts += 1;
|
type->nDefaultAtts += 1;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@@ -7477,6 +7486,7 @@ dtdReset(DTD *p, XML_Parser parser) {
|
|||||||
ELEMENT_TYPE *e = (ELEMENT_TYPE *)hashTableIterNext(&iter);
|
ELEMENT_TYPE *e = (ELEMENT_TYPE *)hashTableIterNext(&iter);
|
||||||
if (! e)
|
if (! e)
|
||||||
break;
|
break;
|
||||||
|
hashTableDestroy(&(e->defaultAttsNames));
|
||||||
if (e->allocDefaultAtts != 0)
|
if (e->allocDefaultAtts != 0)
|
||||||
FREE(parser, e->defaultAtts);
|
FREE(parser, e->defaultAtts);
|
||||||
}
|
}
|
||||||
@@ -7518,6 +7528,7 @@ dtdDestroy(DTD *p, XML_Bool isDocEntity, XML_Parser parser) {
|
|||||||
ELEMENT_TYPE *e = (ELEMENT_TYPE *)hashTableIterNext(&iter);
|
ELEMENT_TYPE *e = (ELEMENT_TYPE *)hashTableIterNext(&iter);
|
||||||
if (! e)
|
if (! e)
|
||||||
break;
|
break;
|
||||||
|
hashTableDestroy(&(e->defaultAttsNames));
|
||||||
if (e->allocDefaultAtts != 0)
|
if (e->allocDefaultAtts != 0)
|
||||||
FREE(parser, e->defaultAtts);
|
FREE(parser, e->defaultAtts);
|
||||||
}
|
}
|
||||||
@@ -7611,6 +7622,10 @@ dtdCopy(XML_Parser oldParser, DTD *newDtd, const DTD *oldDtd,
|
|||||||
sizeof(ELEMENT_TYPE));
|
sizeof(ELEMENT_TYPE));
|
||||||
if (! newE)
|
if (! newE)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
if (! newE->defaultAttsNames.parser)
|
||||||
|
hashTableInit(&(newE->defaultAttsNames), parser);
|
||||||
|
|
||||||
if (oldE->nDefaultAtts) {
|
if (oldE->nDefaultAtts) {
|
||||||
/* Detect and prevent integer overflow.
|
/* Detect and prevent integer overflow.
|
||||||
* The preprocessor guard addresses the "always false" warning
|
* The preprocessor guard addresses the "always false" warning
|
||||||
@@ -7635,8 +7650,9 @@ dtdCopy(XML_Parser oldParser, DTD *newDtd, const DTD *oldDtd,
|
|||||||
newE->prefix = (PREFIX *)lookup(oldParser, &(newDtd->prefixes),
|
newE->prefix = (PREFIX *)lookup(oldParser, &(newDtd->prefixes),
|
||||||
oldE->prefix->name, 0);
|
oldE->prefix->name, 0);
|
||||||
for (i = 0; i < newE->nDefaultAtts; i++) {
|
for (i = 0; i < newE->nDefaultAtts; i++) {
|
||||||
|
const XML_Char *const attributeName = oldE->defaultAtts[i].id->name;
|
||||||
newE->defaultAtts[i].id = (ATTRIBUTE_ID *)lookup(
|
newE->defaultAtts[i].id = (ATTRIBUTE_ID *)lookup(
|
||||||
oldParser, &(newDtd->attributeIds), oldE->defaultAtts[i].id->name, 0);
|
oldParser, &(newDtd->attributeIds), attributeName, 0);
|
||||||
newE->defaultAtts[i].isCdata = oldE->defaultAtts[i].isCdata;
|
newE->defaultAtts[i].isCdata = oldE->defaultAtts[i].isCdata;
|
||||||
if (oldE->defaultAtts[i].value) {
|
if (oldE->defaultAtts[i].value) {
|
||||||
newE->defaultAtts[i].value
|
newE->defaultAtts[i].value
|
||||||
@@ -7645,6 +7661,12 @@ dtdCopy(XML_Parser oldParser, DTD *newDtd, const DTD *oldDtd,
|
|||||||
return 0;
|
return 0;
|
||||||
} else
|
} else
|
||||||
newE->defaultAtts[i].value = NULL;
|
newE->defaultAtts[i].value = NULL;
|
||||||
|
|
||||||
|
NAMED *const nameAddedOrFound = (NAMED *)lookup(
|
||||||
|
parser, &(newE->defaultAttsNames), attributeName, sizeof(NAMED));
|
||||||
|
if (! nameAddedOrFound) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -8391,6 +8413,8 @@ getElementType(XML_Parser parser, const ENCODING *enc, const char *ptr,
|
|||||||
sizeof(ELEMENT_TYPE));
|
sizeof(ELEMENT_TYPE));
|
||||||
if (! ret)
|
if (! ret)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
if (! ret->defaultAttsNames.parser)
|
||||||
|
hashTableInit(&(ret->defaultAttsNames), getRootParserOf(parser, NULL));
|
||||||
if (ret->name != name)
|
if (ret->name != name)
|
||||||
poolDiscard(&dtd->pool);
|
poolDiscard(&dtd->pool);
|
||||||
else {
|
else {
|
||||||
|
|||||||
@@ -20,6 +20,7 @@
|
|||||||
Copyright (c) 2021 Donghee Na <donghee.na@python.org>
|
Copyright (c) 2021 Donghee Na <donghee.na@python.org>
|
||||||
Copyright (c) 2023 Sony Corporation / Snild Dolkow <snild@sony.com>
|
Copyright (c) 2023 Sony Corporation / Snild Dolkow <snild@sony.com>
|
||||||
Copyright (c) 2025 Berkay Eren Ürün <berkay.ueruen@siemens.com>
|
Copyright (c) 2025 Berkay Eren Ürün <berkay.ueruen@siemens.com>
|
||||||
|
Copyright (c) 2026 Matthew Fernandez <matthew.fernandez@gmail.com>
|
||||||
Licensed under the MIT license:
|
Licensed under the MIT license:
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
@@ -2136,8 +2137,7 @@ START_TEST(test_alloc_tracker_pointer_alignment) {
|
|||||||
XML_Parser parser = XML_ParserCreate(NULL);
|
XML_Parser parser = XML_ParserCreate(NULL);
|
||||||
#if XML_GE == 1
|
#if XML_GE == 1
|
||||||
assert_true(sizeof(long long) >= sizeof(size_t)); // self-test
|
assert_true(sizeof(long long) >= sizeof(size_t)); // self-test
|
||||||
long long *const ptr
|
long long *const ptr = expat_malloc(parser, 4 * sizeof(long long), -1);
|
||||||
= (long long *)expat_malloc(parser, 4 * sizeof(long long), -1);
|
|
||||||
ptr[0] = 0LL;
|
ptr[0] = 0LL;
|
||||||
ptr[1] = 1LL;
|
ptr[1] = 1LL;
|
||||||
ptr[2] = 2LL;
|
ptr[2] = 2LL;
|
||||||
|
|||||||
@@ -19,8 +19,9 @@
|
|||||||
Copyright (c) 2020 Tim Gates <tim.gates@iress.com>
|
Copyright (c) 2020 Tim Gates <tim.gates@iress.com>
|
||||||
Copyright (c) 2021 Donghee Na <donghee.na@python.org>
|
Copyright (c) 2021 Donghee Na <donghee.na@python.org>
|
||||||
Copyright (c) 2023-2024 Sony Corporation / Snild Dolkow <snild@sony.com>
|
Copyright (c) 2023-2024 Sony Corporation / Snild Dolkow <snild@sony.com>
|
||||||
Copyright (c) 2024-2025 Berkay Eren Ürün <berkay.ueruen@siemens.com>
|
Copyright (c) 2024-2026 Berkay Eren Ürün <berkay.ueruen@siemens.com>
|
||||||
Copyright (c) 2026 Francesco Bertolaccini
|
Copyright (c) 2026 Francesco Bertolaccini
|
||||||
|
Copyright (c) 2026 Matthew Fernandez <matthew.fernandez@gmail.com>
|
||||||
Licensed under the MIT license:
|
Licensed under the MIT license:
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
@@ -2491,11 +2492,9 @@ START_TEST(test_attributes) {
|
|||||||
{XCS("id"), XCS("one")},
|
{XCS("id"), XCS("one")},
|
||||||
{NULL, NULL}};
|
{NULL, NULL}};
|
||||||
AttrInfo tag_info[] = {{XCS("c"), XCS("3")}, {NULL, NULL}};
|
AttrInfo tag_info[] = {{XCS("c"), XCS("3")}, {NULL, NULL}};
|
||||||
ElementInfo info[] = {{XCS("doc"), 3, XCS("id"), NULL},
|
ElementInfo info[] = {{XCS("doc"), 3, 0, XCS("id"), doc_info},
|
||||||
{XCS("tag"), 1, NULL, NULL},
|
{XCS("tag"), 1, 0, NULL, tag_info},
|
||||||
{NULL, 0, NULL, NULL}};
|
{NULL, 0, 0, NULL, NULL}};
|
||||||
info[0].attributes = doc_info;
|
|
||||||
info[1].attributes = tag_info;
|
|
||||||
|
|
||||||
XML_Parser parser = XML_ParserCreate(NULL);
|
XML_Parser parser = XML_ParserCreate(NULL);
|
||||||
assert_true(parser != NULL);
|
assert_true(parser != NULL);
|
||||||
@@ -2514,6 +2513,279 @@ START_TEST(test_attributes) {
|
|||||||
}
|
}
|
||||||
END_TEST
|
END_TEST
|
||||||
|
|
||||||
|
START_TEST(test_duplicate_cdata_attribute) {
|
||||||
|
/*
|
||||||
|
https://www.w3.org/TR/xml/#attdecls
|
||||||
|
|
||||||
|
Test the following statement from the linked specification:
|
||||||
|
When more than one definition is provided for the same attribute of a given
|
||||||
|
element type, the first declaration is binding and later declarations are
|
||||||
|
ignored.
|
||||||
|
*/
|
||||||
|
|
||||||
|
const char *text
|
||||||
|
= "<!DOCTYPE doc [\n"
|
||||||
|
" <!ATTLIST doc attribute CDATA 'expected' attribute CDATA 'ignored'>\n"
|
||||||
|
"]>\n"
|
||||||
|
"<doc/>\n";
|
||||||
|
AttrInfo doc_info[] = {{XCS("attribute"), XCS("expected")}, {NULL, NULL}};
|
||||||
|
ElementInfo info[]
|
||||||
|
= {{XCS("doc"), 0, 1, NULL, doc_info}, {NULL, 0, 0, NULL, NULL}};
|
||||||
|
|
||||||
|
XML_Parser parser = XML_ParserCreate(NULL);
|
||||||
|
assert_true(parser != NULL);
|
||||||
|
|
||||||
|
ParserAndElementInfo parserAndElementInfos = {
|
||||||
|
parser,
|
||||||
|
info,
|
||||||
|
};
|
||||||
|
|
||||||
|
XML_SetStartElementHandler(parser, counting_start_element_handler);
|
||||||
|
XML_SetUserData(parser, &parserAndElementInfos);
|
||||||
|
|
||||||
|
if (_XML_Parse_SINGLE_BYTES(parser, text, (int)strlen(text), XML_TRUE)
|
||||||
|
!= XML_STATUS_OK)
|
||||||
|
xml_failure(parser);
|
||||||
|
|
||||||
|
XML_ParserFree(parser);
|
||||||
|
}
|
||||||
|
END_TEST
|
||||||
|
|
||||||
|
START_TEST(test_duplicate_id_attribute_1) {
|
||||||
|
/*
|
||||||
|
https://www.w3.org/TR/xml/#attdecls
|
||||||
|
|
||||||
|
Test the following statement from the linked specification:
|
||||||
|
When more than one definition is provided for the same attribute of a given
|
||||||
|
element type, the first declaration is binding and later declarations are
|
||||||
|
ignored.
|
||||||
|
*/
|
||||||
|
|
||||||
|
const char *text
|
||||||
|
= "<!DOCTYPE doc [\n"
|
||||||
|
" <!ATTLIST doc identifier CDATA 'expected' identifier ID #REQUIRED>\n"
|
||||||
|
"]>\n"
|
||||||
|
"<doc/>\n";
|
||||||
|
AttrInfo doc_info[] = {{XCS("identifier"), XCS("expected")}, {NULL, NULL}};
|
||||||
|
ElementInfo info[]
|
||||||
|
= {{XCS("doc"), 0, 1, NULL, doc_info}, {NULL, 0, 0, NULL, NULL}};
|
||||||
|
|
||||||
|
XML_Parser parser = XML_ParserCreate(NULL);
|
||||||
|
assert_true(parser != NULL);
|
||||||
|
|
||||||
|
ParserAndElementInfo parserAndElementInfos = {
|
||||||
|
parser,
|
||||||
|
info,
|
||||||
|
};
|
||||||
|
|
||||||
|
XML_SetStartElementHandler(parser, counting_start_element_handler);
|
||||||
|
XML_SetUserData(parser, &parserAndElementInfos);
|
||||||
|
|
||||||
|
if (_XML_Parse_SINGLE_BYTES(parser, text, (int)strlen(text), XML_TRUE)
|
||||||
|
!= XML_STATUS_OK)
|
||||||
|
xml_failure(parser);
|
||||||
|
|
||||||
|
XML_ParserFree(parser);
|
||||||
|
}
|
||||||
|
END_TEST
|
||||||
|
|
||||||
|
START_TEST(test_duplicate_id_attribute_2) {
|
||||||
|
/*
|
||||||
|
https://www.w3.org/TR/xml/#attdecls
|
||||||
|
|
||||||
|
Test the following statement from the linked specification:
|
||||||
|
When more than one definition is provided for the same attribute of a given
|
||||||
|
element type, the first declaration is binding and later declarations are
|
||||||
|
ignored.
|
||||||
|
*/
|
||||||
|
|
||||||
|
const char *text
|
||||||
|
= "<!DOCTYPE doc [\n"
|
||||||
|
" <!ATTLIST doc identifier ID #REQUIRED identifier CDATA 'unexpected'>\n"
|
||||||
|
"]>\n"
|
||||||
|
"<doc/>\n";
|
||||||
|
AttrInfo doc_info[] = {{NULL, NULL}};
|
||||||
|
|
||||||
|
ElementInfo info[]
|
||||||
|
= {{XCS("doc"), 0, 0, NULL, doc_info}, {NULL, 0, 0, NULL, NULL}};
|
||||||
|
|
||||||
|
XML_Parser parser = XML_ParserCreate(NULL);
|
||||||
|
assert_true(parser != NULL);
|
||||||
|
|
||||||
|
ParserAndElementInfo parserAndElementInfos = {
|
||||||
|
parser,
|
||||||
|
info,
|
||||||
|
};
|
||||||
|
|
||||||
|
XML_SetStartElementHandler(parser, counting_start_element_handler);
|
||||||
|
XML_SetUserData(parser, &parserAndElementInfos);
|
||||||
|
|
||||||
|
if (_XML_Parse_SINGLE_BYTES(parser, text, (int)strlen(text), XML_TRUE)
|
||||||
|
!= XML_STATUS_OK)
|
||||||
|
xml_failure(parser);
|
||||||
|
|
||||||
|
XML_ParserFree(parser);
|
||||||
|
}
|
||||||
|
END_TEST
|
||||||
|
|
||||||
|
START_TEST(test_duplicate_cdata_attribute_multiple_attlistdecl) {
|
||||||
|
/*
|
||||||
|
https://www.w3.org/TR/xml/#attdecls
|
||||||
|
|
||||||
|
Test the following statement from the linked specification:
|
||||||
|
When more than one AttlistDecl is provided for a given element type,
|
||||||
|
the contents of all those provided are merged.
|
||||||
|
*/
|
||||||
|
const char *text = "<!DOCTYPE doc [\n"
|
||||||
|
" <!ATTLIST doc attribute CDATA 'expected'>\n"
|
||||||
|
" <!ATTLIST doc attribute CDATA 'ignored'>\n"
|
||||||
|
"]>\n"
|
||||||
|
"<doc/>\n";
|
||||||
|
AttrInfo doc_info[] = {{XCS("attribute"), XCS("expected")}, {NULL, NULL}};
|
||||||
|
ElementInfo info[]
|
||||||
|
= {{XCS("doc"), 0, 1, NULL, doc_info}, {NULL, 0, 0, NULL, NULL}};
|
||||||
|
|
||||||
|
XML_Parser parser = XML_ParserCreate(NULL);
|
||||||
|
assert_true(parser != NULL);
|
||||||
|
|
||||||
|
ParserAndElementInfo parserAndElementInfos = {
|
||||||
|
parser,
|
||||||
|
info,
|
||||||
|
};
|
||||||
|
|
||||||
|
XML_SetStartElementHandler(parser, counting_start_element_handler);
|
||||||
|
XML_SetUserData(parser, &parserAndElementInfos);
|
||||||
|
|
||||||
|
if (_XML_Parse_SINGLE_BYTES(parser, text, (int)strlen(text), XML_TRUE)
|
||||||
|
!= XML_STATUS_OK)
|
||||||
|
xml_failure(parser);
|
||||||
|
|
||||||
|
XML_ParserFree(parser);
|
||||||
|
}
|
||||||
|
END_TEST
|
||||||
|
|
||||||
|
START_TEST(test_duplicate_cdata_attribute_multiple_attlistdecl_2) {
|
||||||
|
/*
|
||||||
|
https://www.w3.org/TR/xml/#attdecls
|
||||||
|
|
||||||
|
Test the following statement from the linked specification:
|
||||||
|
When more than one AttlistDecl is provided for a given element type,
|
||||||
|
the contents of all those provided are merged.
|
||||||
|
*/
|
||||||
|
const char *text = "<!DOCTYPE doc [\n"
|
||||||
|
" <!ATTLIST doc attribute CDATA 'expected_doc'>\n"
|
||||||
|
" <!ATTLIST tag attribute CDATA 'expected_tag'>\n"
|
||||||
|
" <!ATTLIST doc attribute CDATA 'ignored_doc'>\n"
|
||||||
|
"]>\n"
|
||||||
|
"<doc><tag></tag></doc>\n";
|
||||||
|
AttrInfo doc_info[] = {{XCS("attribute"), XCS("expected_doc")}, {NULL, NULL}};
|
||||||
|
AttrInfo tag_info[] = {{XCS("attribute"), XCS("expected_tag")}, {NULL, NULL}};
|
||||||
|
ElementInfo info[] = {{XCS("doc"), 0, 1, NULL, doc_info},
|
||||||
|
{XCS("tag"), 0, 1, NULL, tag_info},
|
||||||
|
{NULL, 0, 0, NULL, NULL}};
|
||||||
|
|
||||||
|
XML_Parser parser = XML_ParserCreate(NULL);
|
||||||
|
assert_true(parser != NULL);
|
||||||
|
|
||||||
|
ParserAndElementInfo parserAndElementInfos = {
|
||||||
|
parser,
|
||||||
|
info,
|
||||||
|
};
|
||||||
|
|
||||||
|
XML_SetStartElementHandler(parser, counting_start_element_handler);
|
||||||
|
XML_SetUserData(parser, &parserAndElementInfos);
|
||||||
|
|
||||||
|
if (_XML_Parse_SINGLE_BYTES(parser, text, (int)strlen(text), XML_TRUE)
|
||||||
|
!= XML_STATUS_OK)
|
||||||
|
xml_failure(parser);
|
||||||
|
|
||||||
|
XML_ParserFree(parser);
|
||||||
|
}
|
||||||
|
END_TEST
|
||||||
|
|
||||||
|
START_TEST(test_duplicate_cdata_attribute_multiple_attlistdecl_3) {
|
||||||
|
/*
|
||||||
|
https://www.w3.org/TR/xml/#attdecls
|
||||||
|
|
||||||
|
Test the following statement from the linked specification:
|
||||||
|
When more than one AttlistDecl is provided for a given element type,
|
||||||
|
the contents of all those provided are merged.
|
||||||
|
*/
|
||||||
|
const char *text
|
||||||
|
= "<!DOCTYPE doc [\n"
|
||||||
|
" <!ATTLIST doc attribute CDATA 'expected_doc'>\n"
|
||||||
|
" <!ATTLIST tag attribute CDATA 'expected_tag'>\n"
|
||||||
|
" <!ATTLIST doc second_attribute CDATA 'second_expected_doc' attribute CDATA 'ignored_doc'>\n"
|
||||||
|
"]>\n"
|
||||||
|
"<doc><tag></tag></doc>\n";
|
||||||
|
AttrInfo doc_info[] = {{XCS("attribute"), XCS("expected_doc")},
|
||||||
|
{XCS("second_attribute"), XCS("second_expected_doc")},
|
||||||
|
{NULL, NULL}};
|
||||||
|
AttrInfo tag_info[] = {{XCS("attribute"), XCS("expected_tag")}, {NULL, NULL}};
|
||||||
|
ElementInfo info[] = {{XCS("doc"), 0, 2, NULL, doc_info},
|
||||||
|
{XCS("tag"), 0, 1, NULL, tag_info},
|
||||||
|
{NULL, 0, 0, NULL, NULL}};
|
||||||
|
|
||||||
|
XML_Parser parser = XML_ParserCreate(NULL);
|
||||||
|
assert_true(parser != NULL);
|
||||||
|
|
||||||
|
ParserAndElementInfo parserAndElementInfos = {
|
||||||
|
parser,
|
||||||
|
info,
|
||||||
|
};
|
||||||
|
|
||||||
|
XML_SetStartElementHandler(parser, counting_start_element_handler);
|
||||||
|
XML_SetUserData(parser, &parserAndElementInfos);
|
||||||
|
|
||||||
|
if (_XML_Parse_SINGLE_BYTES(parser, text, (int)strlen(text), XML_TRUE)
|
||||||
|
!= XML_STATUS_OK)
|
||||||
|
xml_failure(parser);
|
||||||
|
|
||||||
|
XML_ParserFree(parser);
|
||||||
|
}
|
||||||
|
END_TEST
|
||||||
|
|
||||||
|
START_TEST(test_duplicate_id_attribute_multiple_attlistdecl) {
|
||||||
|
/*
|
||||||
|
https://www.w3.org/TR/xml/#attdecls
|
||||||
|
|
||||||
|
Test the following statement from the linked specification:
|
||||||
|
When more than one AttlistDecl is provided for a given element type,
|
||||||
|
the contents of all those provided are merged.
|
||||||
|
*/
|
||||||
|
const char *text = "<!DOCTYPE doc [\n"
|
||||||
|
" <!ATTLIST doc identifier ID #REQUIRED>\n"
|
||||||
|
" <!ATTLIST tag identifier CDATA 'identifier_tag'>\n"
|
||||||
|
" <!ATTLIST doc identifier CDATA 'ignored'>\n"
|
||||||
|
"]>\n"
|
||||||
|
"<doc identifier='doc_identity'><tag></tag></doc>\n";
|
||||||
|
AttrInfo doc_info[]
|
||||||
|
= {{XCS("identifier"), XCS("doc_identity")}, {NULL, NULL}};
|
||||||
|
AttrInfo tag_info[]
|
||||||
|
= {{XCS("identifier"), XCS("identifier_tag")}, {NULL, NULL}};
|
||||||
|
ElementInfo info[] = {{XCS("doc"), 1, 0, XCS("identifier"), doc_info},
|
||||||
|
{XCS("tag"), 0, 1, NULL, tag_info},
|
||||||
|
{NULL, 0, 0, NULL, NULL}};
|
||||||
|
|
||||||
|
XML_Parser parser = XML_ParserCreate(NULL);
|
||||||
|
assert_true(parser != NULL);
|
||||||
|
|
||||||
|
ParserAndElementInfo parserAndElementInfos = {
|
||||||
|
parser,
|
||||||
|
info,
|
||||||
|
};
|
||||||
|
|
||||||
|
XML_SetStartElementHandler(parser, counting_start_element_handler);
|
||||||
|
XML_SetUserData(parser, &parserAndElementInfos);
|
||||||
|
|
||||||
|
if (_XML_Parse_SINGLE_BYTES(parser, text, (int)strlen(text), XML_TRUE)
|
||||||
|
!= XML_STATUS_OK)
|
||||||
|
xml_failure(parser);
|
||||||
|
|
||||||
|
XML_ParserFree(parser);
|
||||||
|
}
|
||||||
|
END_TEST
|
||||||
|
|
||||||
/* Test reset works correctly in the middle of processing an internal
|
/* Test reset works correctly in the middle of processing an internal
|
||||||
* entity. Exercises some obscure code in XML_ParserReset().
|
* entity. Exercises some obscure code in XML_ParserReset().
|
||||||
*/
|
*/
|
||||||
@@ -3435,8 +3707,7 @@ external_bom_checker(XML_Parser parser, const XML_Char *context,
|
|||||||
fail("Could not create external entity parser");
|
fail("Could not create external entity parser");
|
||||||
|
|
||||||
if (! xcstrcmp(systemId, XCS("004-2.ent"))) {
|
if (! xcstrcmp(systemId, XCS("004-2.ent"))) {
|
||||||
struct bom_testdata *const testdata
|
struct bom_testdata *const testdata = XML_GetUserData(parser);
|
||||||
= (struct bom_testdata *)XML_GetUserData(parser);
|
|
||||||
const char *const external = testdata->external;
|
const char *const external = testdata->external;
|
||||||
const int split = testdata->split;
|
const int split = testdata->split;
|
||||||
testdata->nested_callback_happened = XML_TRUE;
|
testdata->nested_callback_happened = XML_TRUE;
|
||||||
@@ -5501,7 +5772,7 @@ START_TEST(test_deep_nested_entity) {
|
|||||||
const size_t N_LINES = 60000;
|
const size_t N_LINES = 60000;
|
||||||
const size_t SIZE_PER_LINE = 50;
|
const size_t SIZE_PER_LINE = 50;
|
||||||
|
|
||||||
char *const text = (char *)malloc((N_LINES + 4) * SIZE_PER_LINE);
|
char *const text = malloc((N_LINES + 4) * SIZE_PER_LINE);
|
||||||
if (text == NULL) {
|
if (text == NULL) {
|
||||||
fail("malloc failed");
|
fail("malloc failed");
|
||||||
}
|
}
|
||||||
@@ -5547,7 +5818,7 @@ START_TEST(test_deep_nested_attribute_entity) {
|
|||||||
const size_t N_LINES = 60000;
|
const size_t N_LINES = 60000;
|
||||||
const size_t SIZE_PER_LINE = 100;
|
const size_t SIZE_PER_LINE = 100;
|
||||||
|
|
||||||
char *const text = (char *)malloc((N_LINES + 4) * SIZE_PER_LINE);
|
char *const text = malloc((N_LINES + 4) * SIZE_PER_LINE);
|
||||||
if (text == NULL) {
|
if (text == NULL) {
|
||||||
fail("malloc failed");
|
fail("malloc failed");
|
||||||
}
|
}
|
||||||
@@ -5568,8 +5839,8 @@ START_TEST(test_deep_nested_attribute_entity) {
|
|||||||
(long unsigned)(N_LINES - 1));
|
(long unsigned)(N_LINES - 1));
|
||||||
|
|
||||||
AttrInfo doc_info[] = {{XCS("name"), XCS("deepText")}, {NULL, NULL}};
|
AttrInfo doc_info[] = {{XCS("name"), XCS("deepText")}, {NULL, NULL}};
|
||||||
ElementInfo info[] = {{XCS("foo"), 1, NULL, NULL}, {NULL, 0, NULL, NULL}};
|
ElementInfo info[]
|
||||||
info[0].attributes = doc_info;
|
= {{XCS("foo"), 1, 0, NULL, doc_info}, {NULL, 0, 0, NULL, NULL}};
|
||||||
|
|
||||||
XML_Parser parser = XML_ParserCreate(NULL);
|
XML_Parser parser = XML_ParserCreate(NULL);
|
||||||
ParserAndElementInfo parserPlusElemenInfo = {parser, info};
|
ParserAndElementInfo parserPlusElemenInfo = {parser, info};
|
||||||
@@ -5590,7 +5861,7 @@ START_TEST(test_deep_nested_entity_delayed_interpretation) {
|
|||||||
const size_t N_LINES = 70000;
|
const size_t N_LINES = 70000;
|
||||||
const size_t SIZE_PER_LINE = 100;
|
const size_t SIZE_PER_LINE = 100;
|
||||||
|
|
||||||
char *const text = (char *)malloc((N_LINES + 4) * SIZE_PER_LINE);
|
char *const text = malloc((N_LINES + 4) * SIZE_PER_LINE);
|
||||||
if (text == NULL) {
|
if (text == NULL) {
|
||||||
fail("malloc failed");
|
fail("malloc failed");
|
||||||
}
|
}
|
||||||
@@ -6069,7 +6340,7 @@ START_TEST(test_bypass_heuristic_when_close_to_bufsize) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const int document_length = 65536;
|
const int document_length = 65536;
|
||||||
char *const document = (char *)malloc(document_length);
|
char *const document = malloc(document_length);
|
||||||
assert_true(document != NULL);
|
assert_true(document != NULL);
|
||||||
|
|
||||||
const XML_Memory_Handling_Suite memfuncs = {
|
const XML_Memory_Handling_Suite memfuncs = {
|
||||||
@@ -6180,7 +6451,7 @@ START_TEST(test_varying_buffer_fills) {
|
|||||||
return; // this test is slow, and doesn't use _XML_Parse_SINGLE_BYTES().
|
return; // this test is slow, and doesn't use _XML_Parse_SINGLE_BYTES().
|
||||||
}
|
}
|
||||||
|
|
||||||
char *const document = (char *)malloc(document_length);
|
char *const document = malloc(document_length);
|
||||||
assert_true(document != NULL);
|
assert_true(document != NULL);
|
||||||
memset(document, 'x', document_length);
|
memset(document, 'x', document_length);
|
||||||
document[0] = '<';
|
document[0] = '<';
|
||||||
@@ -6400,6 +6671,15 @@ make_basic_test_case(Suite *s) {
|
|||||||
tcase_add_test__ifdef_xml_dtd(tc_basic, test_empty_foreign_dtd);
|
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_set_base);
|
||||||
tcase_add_test(tc_basic, test_attributes);
|
tcase_add_test(tc_basic, test_attributes);
|
||||||
|
tcase_add_test(tc_basic, test_duplicate_cdata_attribute);
|
||||||
|
tcase_add_test(tc_basic, test_duplicate_id_attribute_1);
|
||||||
|
tcase_add_test(tc_basic, test_duplicate_id_attribute_2);
|
||||||
|
tcase_add_test(tc_basic, test_duplicate_cdata_attribute_multiple_attlistdecl);
|
||||||
|
tcase_add_test(tc_basic,
|
||||||
|
test_duplicate_cdata_attribute_multiple_attlistdecl_2);
|
||||||
|
tcase_add_test(tc_basic,
|
||||||
|
test_duplicate_cdata_attribute_multiple_attlistdecl_3);
|
||||||
|
tcase_add_test(tc_basic, test_duplicate_id_attribute_multiple_attlistdecl);
|
||||||
tcase_add_test__if_xml_ge(tc_basic, test_reset_in_entity);
|
tcase_add_test__if_xml_ge(tc_basic, test_reset_in_entity);
|
||||||
tcase_add_test(tc_basic, test_resume_invalid_parse);
|
tcase_add_test(tc_basic, test_resume_invalid_parse);
|
||||||
tcase_add_test(tc_basic, test_resume_resuspended);
|
tcase_add_test(tc_basic, test_resume_resuspended);
|
||||||
|
|||||||
@@ -19,6 +19,7 @@
|
|||||||
Copyright (c) 2020 Tim Gates <tim.gates@iress.com>
|
Copyright (c) 2020 Tim Gates <tim.gates@iress.com>
|
||||||
Copyright (c) 2021 Donghee Na <donghee.na@python.org>
|
Copyright (c) 2021 Donghee Na <donghee.na@python.org>
|
||||||
Copyright (c) 2023-2024 Sony Corporation / Snild Dolkow <snild@sony.com>
|
Copyright (c) 2023-2024 Sony Corporation / Snild Dolkow <snild@sony.com>
|
||||||
|
Copyright (c) 2026 Matthew Fernandez <matthew.fernandez@gmail.com>
|
||||||
Licensed under the MIT license:
|
Licensed under the MIT license:
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
@@ -261,7 +262,7 @@ _run_attribute_check(const char *text, const XML_Char *expected,
|
|||||||
void
|
void
|
||||||
_run_ext_character_check(const char *text, ExtTest *test_data,
|
_run_ext_character_check(const char *text, ExtTest *test_data,
|
||||||
const XML_Char *expected, const char *file, int line) {
|
const XML_Char *expected, const char *file, int line) {
|
||||||
CharData *const storage = (CharData *)malloc(sizeof(CharData));
|
CharData *const storage = malloc(sizeof(CharData));
|
||||||
|
|
||||||
CharData_Init(storage);
|
CharData_Init(storage);
|
||||||
test_data->storage = storage;
|
test_data->storage = storage;
|
||||||
@@ -320,7 +321,7 @@ portable_strndup(const char *s, size_t n) {
|
|||||||
|
|
||||||
n = portable_strnlen(s, n);
|
n = portable_strnlen(s, n);
|
||||||
|
|
||||||
char *const buffer = (char *)malloc(n + 1);
|
char *const buffer = malloc(n + 1);
|
||||||
if (buffer == NULL) {
|
if (buffer == NULL) {
|
||||||
errno = ENOMEM;
|
errno = ENOMEM;
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|||||||
@@ -19,6 +19,8 @@
|
|||||||
Copyright (c) 2020 Tim Gates <tim.gates@iress.com>
|
Copyright (c) 2020 Tim Gates <tim.gates@iress.com>
|
||||||
Copyright (c) 2021 Donghee Na <donghee.na@python.org>
|
Copyright (c) 2021 Donghee Na <donghee.na@python.org>
|
||||||
Copyright (c) 2023-2024 Sony Corporation / Snild Dolkow <snild@sony.com>
|
Copyright (c) 2023-2024 Sony Corporation / Snild Dolkow <snild@sony.com>
|
||||||
|
Copyright (c) 2026 Matthew Fernandez <matthew.fernandez@gmail.com>
|
||||||
|
Copyright (c) 2026 Berkay Eren Ürün <berkay.ueruen@siemens.com>
|
||||||
Licensed under the MIT license:
|
Licensed under the MIT license:
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
@@ -137,7 +139,7 @@ counting_start_element_handler(void *userData, const XML_Char *name,
|
|||||||
fail("ID does not have the correct name");
|
fail("ID does not have the correct name");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
for (i = 0; i < info->attr_count; i++) {
|
for (i = 0; i < info->attr_count + info->default_attr_count; i++) {
|
||||||
attr = info->attributes;
|
attr = info->attributes;
|
||||||
while (attr->name != NULL) {
|
while (attr->name != NULL) {
|
||||||
if (! xcstrcmp(atts[0], attr->name))
|
if (! xcstrcmp(atts[0], attr->name))
|
||||||
@@ -155,6 +157,9 @@ counting_start_element_handler(void *userData, const XML_Char *name,
|
|||||||
/* Remember, two entries in atts per attribute (see above) */
|
/* Remember, two entries in atts per attribute (see above) */
|
||||||
atts += 2;
|
atts += 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Self-test that the test case's list of expected attributes is complete
|
||||||
|
assert_true(atts[0] == NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
void XMLCALL
|
void XMLCALL
|
||||||
@@ -423,7 +428,7 @@ int XMLCALL
|
|||||||
external_entity_optioner(XML_Parser parser, const XML_Char *context,
|
external_entity_optioner(XML_Parser parser, const XML_Char *context,
|
||||||
const XML_Char *base, const XML_Char *systemId,
|
const XML_Char *base, const XML_Char *systemId,
|
||||||
const XML_Char *publicId) {
|
const XML_Char *publicId) {
|
||||||
ExtOption *options = (ExtOption *)XML_GetUserData(parser);
|
ExtOption *options = XML_GetUserData(parser);
|
||||||
XML_Parser ext_parser;
|
XML_Parser ext_parser;
|
||||||
|
|
||||||
UNUSED_P(base);
|
UNUSED_P(base);
|
||||||
@@ -449,7 +454,7 @@ int XMLCALL
|
|||||||
external_entity_loader(XML_Parser parser, const XML_Char *context,
|
external_entity_loader(XML_Parser parser, const XML_Char *context,
|
||||||
const XML_Char *base, const XML_Char *systemId,
|
const XML_Char *base, const XML_Char *systemId,
|
||||||
const XML_Char *publicId) {
|
const XML_Char *publicId) {
|
||||||
ExtTest *test_data = (ExtTest *)XML_GetUserData(parser);
|
ExtTest *test_data = XML_GetUserData(parser);
|
||||||
XML_Parser extparser;
|
XML_Parser extparser;
|
||||||
|
|
||||||
UNUSED_P(base);
|
UNUSED_P(base);
|
||||||
@@ -477,7 +482,7 @@ external_entity_faulter(XML_Parser parser, const XML_Char *context,
|
|||||||
const XML_Char *base, const XML_Char *systemId,
|
const XML_Char *base, const XML_Char *systemId,
|
||||||
const XML_Char *publicId) {
|
const XML_Char *publicId) {
|
||||||
XML_Parser ext_parser;
|
XML_Parser ext_parser;
|
||||||
ExtFaults *fault = (ExtFaults *)XML_GetUserData(parser);
|
ExtFaults *fault = XML_GetUserData(parser);
|
||||||
|
|
||||||
UNUSED_P(base);
|
UNUSED_P(base);
|
||||||
UNUSED_P(systemId);
|
UNUSED_P(systemId);
|
||||||
@@ -650,7 +655,7 @@ external_entity_suspending_faulter(XML_Parser parser, const XML_Char *context,
|
|||||||
const XML_Char *systemId,
|
const XML_Char *systemId,
|
||||||
const XML_Char *publicId) {
|
const XML_Char *publicId) {
|
||||||
XML_Parser ext_parser;
|
XML_Parser ext_parser;
|
||||||
ExtFaults *fault = (ExtFaults *)XML_GetUserData(parser);
|
ExtFaults *fault = XML_GetUserData(parser);
|
||||||
void *buffer;
|
void *buffer;
|
||||||
int parse_len = (int)strlen(fault->parse_text);
|
int parse_len = (int)strlen(fault->parse_text);
|
||||||
|
|
||||||
@@ -981,7 +986,7 @@ external_entity_valuer(XML_Parser parser, const XML_Char *context,
|
|||||||
== XML_STATUS_ERROR)
|
== XML_STATUS_ERROR)
|
||||||
xml_failure(ext_parser);
|
xml_failure(ext_parser);
|
||||||
} else if (! xcstrcmp(systemId, XCS("004-2.ent"))) {
|
} else if (! xcstrcmp(systemId, XCS("004-2.ent"))) {
|
||||||
ExtFaults *fault = (ExtFaults *)XML_GetUserData(parser);
|
ExtFaults *fault = XML_GetUserData(parser);
|
||||||
enum XML_Status status;
|
enum XML_Status status;
|
||||||
enum XML_Error error;
|
enum XML_Error error;
|
||||||
|
|
||||||
@@ -1083,7 +1088,7 @@ int XMLCALL
|
|||||||
external_entity_public(XML_Parser parser, const XML_Char *context,
|
external_entity_public(XML_Parser parser, const XML_Char *context,
|
||||||
const XML_Char *base, const XML_Char *systemId,
|
const XML_Char *base, const XML_Char *systemId,
|
||||||
const XML_Char *publicId) {
|
const XML_Char *publicId) {
|
||||||
const char *text1 = (const char *)XML_GetUserData(parser);
|
const char *text1 = XML_GetUserData(parser);
|
||||||
const char *text2 = "<!ATTLIST doc a CDATA 'value'>";
|
const char *text2 = "<!ATTLIST doc a CDATA 'value'>";
|
||||||
const char *text = NULL;
|
const char *text = NULL;
|
||||||
XML_Parser ext_parser;
|
XML_Parser ext_parser;
|
||||||
@@ -1139,7 +1144,7 @@ int XMLCALL
|
|||||||
external_entity_oneshot_loader(XML_Parser parser, const XML_Char *context,
|
external_entity_oneshot_loader(XML_Parser parser, const XML_Char *context,
|
||||||
const XML_Char *base, const XML_Char *systemId,
|
const XML_Char *base, const XML_Char *systemId,
|
||||||
const XML_Char *publicId) {
|
const XML_Char *publicId) {
|
||||||
ExtHdlrData *test_data = (ExtHdlrData *)XML_GetUserData(parser);
|
ExtHdlrData *test_data = XML_GetUserData(parser);
|
||||||
XML_Parser ext_parser;
|
XML_Parser ext_parser;
|
||||||
|
|
||||||
UNUSED_P(base);
|
UNUSED_P(base);
|
||||||
@@ -1164,7 +1169,7 @@ int XMLCALL
|
|||||||
external_entity_loader2(XML_Parser parser, const XML_Char *context,
|
external_entity_loader2(XML_Parser parser, const XML_Char *context,
|
||||||
const XML_Char *base, const XML_Char *systemId,
|
const XML_Char *base, const XML_Char *systemId,
|
||||||
const XML_Char *publicId) {
|
const XML_Char *publicId) {
|
||||||
ExtTest2 *test_data = (ExtTest2 *)XML_GetUserData(parser);
|
ExtTest2 *test_data = XML_GetUserData(parser);
|
||||||
XML_Parser extparser;
|
XML_Parser extparser;
|
||||||
|
|
||||||
UNUSED_P(base);
|
UNUSED_P(base);
|
||||||
@@ -1191,7 +1196,7 @@ int XMLCALL
|
|||||||
external_entity_faulter2(XML_Parser parser, const XML_Char *context,
|
external_entity_faulter2(XML_Parser parser, const XML_Char *context,
|
||||||
const XML_Char *base, const XML_Char *systemId,
|
const XML_Char *base, const XML_Char *systemId,
|
||||||
const XML_Char *publicId) {
|
const XML_Char *publicId) {
|
||||||
ExtFaults2 *test_data = (ExtFaults2 *)XML_GetUserData(parser);
|
ExtFaults2 *test_data = XML_GetUserData(parser);
|
||||||
XML_Parser extparser;
|
XML_Parser extparser;
|
||||||
|
|
||||||
UNUSED_P(base);
|
UNUSED_P(base);
|
||||||
@@ -1309,7 +1314,7 @@ int XMLCALL
|
|||||||
external_entity_dbl_handler(XML_Parser parser, const XML_Char *context,
|
external_entity_dbl_handler(XML_Parser parser, const XML_Char *context,
|
||||||
const XML_Char *base, const XML_Char *systemId,
|
const XML_Char *base, const XML_Char *systemId,
|
||||||
const XML_Char *publicId) {
|
const XML_Char *publicId) {
|
||||||
int *pcallno = (int *)XML_GetUserData(parser);
|
int *pcallno = XML_GetUserData(parser);
|
||||||
int callno = *pcallno;
|
int callno = *pcallno;
|
||||||
const char *text;
|
const char *text;
|
||||||
XML_Parser new_parser = NULL;
|
XML_Parser new_parser = NULL;
|
||||||
@@ -1366,7 +1371,7 @@ int XMLCALL
|
|||||||
external_entity_dbl_handler_2(XML_Parser parser, const XML_Char *context,
|
external_entity_dbl_handler_2(XML_Parser parser, const XML_Char *context,
|
||||||
const XML_Char *base, const XML_Char *systemId,
|
const XML_Char *base, const XML_Char *systemId,
|
||||||
const XML_Char *publicId) {
|
const XML_Char *publicId) {
|
||||||
int *pcallno = (int *)XML_GetUserData(parser);
|
int *pcallno = XML_GetUserData(parser);
|
||||||
int callno = *pcallno;
|
int callno = *pcallno;
|
||||||
const char *text;
|
const char *text;
|
||||||
XML_Parser new_parser;
|
XML_Parser new_parser;
|
||||||
@@ -1461,7 +1466,7 @@ int XMLCALL
|
|||||||
external_entity_alloc(XML_Parser parser, const XML_Char *context,
|
external_entity_alloc(XML_Parser parser, const XML_Char *context,
|
||||||
const XML_Char *base, const XML_Char *systemId,
|
const XML_Char *base, const XML_Char *systemId,
|
||||||
const XML_Char *publicId) {
|
const XML_Char *publicId) {
|
||||||
const char *text = (const char *)XML_GetUserData(parser);
|
const char *text = XML_GetUserData(parser);
|
||||||
XML_Parser ext_parser;
|
XML_Parser ext_parser;
|
||||||
int parse_res;
|
int parse_res;
|
||||||
|
|
||||||
@@ -1516,8 +1521,7 @@ accounting_external_entity_ref_handler(XML_Parser parser,
|
|||||||
UNUSED_P(base);
|
UNUSED_P(base);
|
||||||
UNUSED_P(publicId);
|
UNUSED_P(publicId);
|
||||||
|
|
||||||
const struct AccountingTestCase *const testCase
|
const struct AccountingTestCase *const testCase = XML_GetUserData(parser);
|
||||||
= (const struct AccountingTestCase *)XML_GetUserData(parser);
|
|
||||||
|
|
||||||
const char *externalText = NULL;
|
const char *externalText = NULL;
|
||||||
if (xcstrcmp(systemId, XCS("first.ent")) == 0) {
|
if (xcstrcmp(systemId, XCS("first.ent")) == 0) {
|
||||||
|
|||||||
@@ -19,6 +19,7 @@
|
|||||||
Copyright (c) 2020 Tim Gates <tim.gates@iress.com>
|
Copyright (c) 2020 Tim Gates <tim.gates@iress.com>
|
||||||
Copyright (c) 2021 Donghee Na <donghee.na@python.org>
|
Copyright (c) 2021 Donghee Na <donghee.na@python.org>
|
||||||
Copyright (c) 2023 Sony Corporation / Snild Dolkow <snild@sony.com>
|
Copyright (c) 2023 Sony Corporation / Snild Dolkow <snild@sony.com>
|
||||||
|
Copyright (c) 2026 Berkay Eren Ürün <berkay.ueruen@siemens.com>
|
||||||
Licensed under the MIT license:
|
Licensed under the MIT license:
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
@@ -88,6 +89,7 @@ typedef struct attrInfo {
|
|||||||
typedef struct elementInfo {
|
typedef struct elementInfo {
|
||||||
const XML_Char *name;
|
const XML_Char *name;
|
||||||
int attr_count;
|
int attr_count;
|
||||||
|
int default_attr_count;
|
||||||
const XML_Char *id_name;
|
const XML_Char *id_name;
|
||||||
AttrInfo *attributes;
|
AttrInfo *attributes;
|
||||||
} ElementInfo;
|
} ElementInfo;
|
||||||
|
|||||||
@@ -9,6 +9,7 @@
|
|||||||
Copyright (c) 2017 Rhodri James <rhodri@wildebeest.org.uk>
|
Copyright (c) 2017 Rhodri James <rhodri@wildebeest.org.uk>
|
||||||
Copyright (c) 2017-2023 Sebastian Pipping <sebastian@pipping.org>
|
Copyright (c) 2017-2023 Sebastian Pipping <sebastian@pipping.org>
|
||||||
Copyright (c) 2022 Sean McBride <sean@rogue-research.com>
|
Copyright (c) 2022 Sean McBride <sean@rogue-research.com>
|
||||||
|
Copyright (c) 2026 Matthew Fernandez <matthew.fernandez@gmail.com>
|
||||||
Licensed under the MIT license:
|
Licensed under the MIT license:
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
@@ -55,8 +56,7 @@ static AllocationEntry *find_allocation(const void *ptr);
|
|||||||
/* Allocate some memory and keep track of it. */
|
/* Allocate some memory and keep track of it. */
|
||||||
void *
|
void *
|
||||||
tracking_malloc(size_t size) {
|
tracking_malloc(size_t size) {
|
||||||
AllocationEntry *const entry
|
AllocationEntry *const entry = malloc(sizeof(AllocationEntry));
|
||||||
= (AllocationEntry *)malloc(sizeof(AllocationEntry));
|
|
||||||
|
|
||||||
if (entry == NULL) {
|
if (entry == NULL) {
|
||||||
printf("Allocator failure\n");
|
printf("Allocator failure\n");
|
||||||
@@ -142,7 +142,7 @@ tracking_realloc(void *ptr, size_t size) {
|
|||||||
entry = find_allocation(ptr);
|
entry = find_allocation(ptr);
|
||||||
if (entry == NULL) {
|
if (entry == NULL) {
|
||||||
printf("Attempting to realloc unallocated memory at %p\n", ptr);
|
printf("Attempting to realloc unallocated memory at %p\n", ptr);
|
||||||
entry = (AllocationEntry *)malloc(sizeof(AllocationEntry));
|
entry = malloc(sizeof(AllocationEntry));
|
||||||
if (entry == NULL) {
|
if (entry == NULL) {
|
||||||
printf("Reallocator failure\n");
|
printf("Reallocator failure\n");
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
Copyright (c) 2018 Marco Maggi <marco.maggi-ipsu@poste.it>
|
Copyright (c) 2018 Marco Maggi <marco.maggi-ipsu@poste.it>
|
||||||
Copyright (c) 2019 David Loffredo <loffredo@steptools.com>
|
Copyright (c) 2019 David Loffredo <loffredo@steptools.com>
|
||||||
Copyright (c) 2023-2024 Sony Corporation / Snild Dolkow <snild@sony.com>
|
Copyright (c) 2023-2024 Sony Corporation / Snild Dolkow <snild@sony.com>
|
||||||
|
Copyright (c) 2026 Matthew Fernandez <matthew.fernandez@gmail.com>
|
||||||
Licensed under the MIT license:
|
Licensed under the MIT license:
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
@@ -54,7 +55,7 @@
|
|||||||
|
|
||||||
Suite *
|
Suite *
|
||||||
suite_create(const char *name) {
|
suite_create(const char *name) {
|
||||||
Suite *suite = (Suite *)calloc(1, sizeof(Suite));
|
Suite *suite = calloc(1, sizeof(Suite));
|
||||||
if (suite != NULL) {
|
if (suite != NULL) {
|
||||||
suite->name = name;
|
suite->name = name;
|
||||||
}
|
}
|
||||||
@@ -63,7 +64,7 @@ suite_create(const char *name) {
|
|||||||
|
|
||||||
TCase *
|
TCase *
|
||||||
tcase_create(const char *name) {
|
tcase_create(const char *name) {
|
||||||
TCase *tc = (TCase *)calloc(1, sizeof(TCase));
|
TCase *tc = calloc(1, sizeof(TCase));
|
||||||
if (tc != NULL) {
|
if (tc != NULL) {
|
||||||
tc->name = name;
|
tc->name = name;
|
||||||
}
|
}
|
||||||
@@ -94,8 +95,7 @@ tcase_add_test(TCase *tc, tcase_test_function test) {
|
|||||||
if (tc->allocated == tc->ntests) {
|
if (tc->allocated == tc->ntests) {
|
||||||
int nalloc = tc->allocated + 100;
|
int nalloc = tc->allocated + 100;
|
||||||
size_t new_size = sizeof(tcase_test_function) * nalloc;
|
size_t new_size = sizeof(tcase_test_function) * nalloc;
|
||||||
tcase_test_function *const new_tests
|
tcase_test_function *const new_tests = realloc(tc->tests, new_size);
|
||||||
= (tcase_test_function *)realloc(tc->tests, new_size);
|
|
||||||
assert(new_tests != NULL);
|
assert(new_tests != NULL);
|
||||||
tc->tests = new_tests;
|
tc->tests = new_tests;
|
||||||
tc->allocated = nalloc;
|
tc->allocated = nalloc;
|
||||||
@@ -130,7 +130,7 @@ suite_free(Suite *suite) {
|
|||||||
|
|
||||||
SRunner *
|
SRunner *
|
||||||
srunner_create(Suite *suite) {
|
srunner_create(Suite *suite) {
|
||||||
SRunner *const runner = (SRunner *)calloc(1, sizeof(SRunner));
|
SRunner *const runner = calloc(1, sizeof(SRunner));
|
||||||
if (runner != NULL) {
|
if (runner != NULL) {
|
||||||
runner->suite = suite;
|
runner->suite = suite;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,6 +20,7 @@
|
|||||||
Copyright (c) 2021 Donghee Na <donghee.na@python.org>
|
Copyright (c) 2021 Donghee Na <donghee.na@python.org>
|
||||||
Copyright (c) 2023 Sony Corporation / Snild Dolkow <snild@sony.com>
|
Copyright (c) 2023 Sony Corporation / Snild Dolkow <snild@sony.com>
|
||||||
Copyright (c) 2025 Berkay Eren Ürün <berkay.ueruen@siemens.com>
|
Copyright (c) 2025 Berkay Eren Ürün <berkay.ueruen@siemens.com>
|
||||||
|
Copyright (c) 2026 Matthew Fernandez <matthew.fernandez@gmail.com>
|
||||||
Licensed under the MIT license:
|
Licensed under the MIT license:
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
@@ -212,7 +213,7 @@ START_TEST(test_misc_version) {
|
|||||||
if (! versions_equal(&read_version, &parsed_version))
|
if (! versions_equal(&read_version, &parsed_version))
|
||||||
fail("Version mismatch");
|
fail("Version mismatch");
|
||||||
|
|
||||||
if (xcstrcmp(version_text, XCS("expat_2.8.0"))
|
if (xcstrcmp(version_text, XCS("expat_2.8.1"))
|
||||||
!= 0) /* needs bump on releases */
|
!= 0) /* needs bump on releases */
|
||||||
fail("XML_*_VERSION in expat.h out of sync?\n");
|
fail("XML_*_VERSION in expat.h out of sync?\n");
|
||||||
}
|
}
|
||||||
@@ -298,7 +299,7 @@ START_TEST(test_misc_stop_during_end_handler_issue_240_1) {
|
|||||||
|
|
||||||
parser = XML_ParserCreate(NULL);
|
parser = XML_ParserCreate(NULL);
|
||||||
XML_SetElementHandler(parser, start_element_issue_240, end_element_issue_240);
|
XML_SetElementHandler(parser, start_element_issue_240, end_element_issue_240);
|
||||||
mydata = (DataIssue240 *)malloc(sizeof(DataIssue240));
|
mydata = malloc(sizeof(DataIssue240));
|
||||||
assert_true(mydata != NULL);
|
assert_true(mydata != NULL);
|
||||||
mydata->parser = parser;
|
mydata->parser = parser;
|
||||||
mydata->deep = 0;
|
mydata->deep = 0;
|
||||||
@@ -320,7 +321,7 @@ START_TEST(test_misc_stop_during_end_handler_issue_240_2) {
|
|||||||
|
|
||||||
parser = XML_ParserCreate(NULL);
|
parser = XML_ParserCreate(NULL);
|
||||||
XML_SetElementHandler(parser, start_element_issue_240, end_element_issue_240);
|
XML_SetElementHandler(parser, start_element_issue_240, end_element_issue_240);
|
||||||
mydata = (DataIssue240 *)malloc(sizeof(DataIssue240));
|
mydata = malloc(sizeof(DataIssue240));
|
||||||
assert_true(mydata != NULL);
|
assert_true(mydata != NULL);
|
||||||
mydata->parser = parser;
|
mydata->parser = parser;
|
||||||
mydata->deep = 0;
|
mydata->deep = 0;
|
||||||
|
|||||||
@@ -9,6 +9,7 @@
|
|||||||
Copyright (c) 2017 Rhodri James <rhodri@wildebeest.org.uk>
|
Copyright (c) 2017 Rhodri James <rhodri@wildebeest.org.uk>
|
||||||
Copyright (c) 2017-2023 Sebastian Pipping <sebastian@pipping.org>
|
Copyright (c) 2017-2023 Sebastian Pipping <sebastian@pipping.org>
|
||||||
Copyright (c) 2022 Sean McBride <sean@rogue-research.com>
|
Copyright (c) 2022 Sean McBride <sean@rogue-research.com>
|
||||||
|
Copyright (c) 2026 Matthew Fernandez <matthew.fernandez@gmail.com>
|
||||||
Licensed under the MIT license:
|
Licensed under the MIT license:
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
@@ -61,7 +62,7 @@
|
|||||||
static XML_Char *
|
static XML_Char *
|
||||||
xmlstrdup(const XML_Char *s) {
|
xmlstrdup(const XML_Char *s) {
|
||||||
size_t byte_count = (xcstrlen(s) + 1) * sizeof(XML_Char);
|
size_t byte_count = (xcstrlen(s) + 1) * sizeof(XML_Char);
|
||||||
XML_Char *const dup = (XML_Char *)malloc(byte_count);
|
XML_Char *const dup = malloc(byte_count);
|
||||||
|
|
||||||
assert(dup != NULL);
|
assert(dup != NULL);
|
||||||
memcpy(dup, s, byte_count);
|
memcpy(dup, s, byte_count);
|
||||||
@@ -87,8 +88,8 @@ StructData_AddItem(StructData *storage, const XML_Char *s, int data0, int data1,
|
|||||||
StructDataEntry *new_entries;
|
StructDataEntry *new_entries;
|
||||||
|
|
||||||
storage->max_count += STRUCT_EXTENSION_COUNT;
|
storage->max_count += STRUCT_EXTENSION_COUNT;
|
||||||
new_entries = (StructDataEntry *)realloc(
|
new_entries = realloc(storage->entries,
|
||||||
storage->entries, storage->max_count * sizeof(StructDataEntry));
|
storage->max_count * sizeof(StructDataEntry));
|
||||||
assert(new_entries != NULL);
|
assert(new_entries != NULL);
|
||||||
storage->entries = new_entries;
|
storage->entries = new_entries;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,6 +12,7 @@
|
|||||||
Copyright (c) 2006 Karl Waclawek <karl@waclawek.net>
|
Copyright (c) 2006 Karl Waclawek <karl@waclawek.net>
|
||||||
Copyright (c) 2016-2025 Sebastian Pipping <sebastian@pipping.org>
|
Copyright (c) 2016-2025 Sebastian Pipping <sebastian@pipping.org>
|
||||||
Copyright (c) 2017 Rhodri James <rhodri@wildebeest.org.uk>
|
Copyright (c) 2017 Rhodri James <rhodri@wildebeest.org.uk>
|
||||||
|
Copyright (c) 2026 Matthew Fernandez <matthew.fernandez@gmail.com>
|
||||||
Licensed under the MIT license:
|
Licensed under the MIT license:
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
@@ -95,13 +96,13 @@ filemap(const tchar *name,
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
p = mmap(NULL, nbytes, PROT_READ, MAP_FILE | MAP_PRIVATE, fd, (off_t)0);
|
p = mmap(NULL, nbytes, PROT_READ, MAP_FILE | MAP_PRIVATE, fd, (off_t)0);
|
||||||
if (p == (void *)-1) {
|
if (p == MAP_FAILED) {
|
||||||
tperror(name);
|
tperror(name);
|
||||||
close(fd);
|
close(fd);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
processor(p, nbytes, name, arg);
|
processor(p, nbytes, name, arg);
|
||||||
munmap((void *)p, nbytes);
|
munmap(p, nbytes);
|
||||||
close(fd);
|
close(fd);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,6 +17,7 @@
|
|||||||
Copyright (c) 2021 Donghee Na <donghee.na@python.org>
|
Copyright (c) 2021 Donghee Na <donghee.na@python.org>
|
||||||
Copyright (c) 2024 Hanno Böck <hanno@gentoo.org>
|
Copyright (c) 2024 Hanno Böck <hanno@gentoo.org>
|
||||||
Copyright (c) 2025 Alfonso Gregory <gfunni234@gmail.com>
|
Copyright (c) 2025 Alfonso Gregory <gfunni234@gmail.com>
|
||||||
|
Copyright (c) 2026 Matthew Fernandez <matthew.fernandez@gmail.com>
|
||||||
Licensed under the MIT license:
|
Licensed under the MIT license:
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
@@ -138,8 +139,7 @@ resolveSystemId(const XML_Char *base, const XML_Char *systemId,
|
|||||||
#endif
|
#endif
|
||||||
)
|
)
|
||||||
return systemId;
|
return systemId;
|
||||||
*toFree = (XML_Char *)malloc((tcslen(base) + tcslen(systemId) + 2)
|
*toFree = malloc((tcslen(base) + tcslen(systemId) + 2) * sizeof(XML_Char));
|
||||||
* sizeof(XML_Char));
|
|
||||||
if (! *toFree)
|
if (! *toFree)
|
||||||
return systemId;
|
return systemId;
|
||||||
tcscpy(*toFree, base);
|
tcscpy(*toFree, base);
|
||||||
|
|||||||
+41
-42
@@ -20,6 +20,7 @@
|
|||||||
Copyright (c) 2022 Martin Ettl <ettl.martin78@googlemail.com>
|
Copyright (c) 2022 Martin Ettl <ettl.martin78@googlemail.com>
|
||||||
Copyright (c) 2022 Sean McBride <sean@rogue-research.com>
|
Copyright (c) 2022 Sean McBride <sean@rogue-research.com>
|
||||||
Copyright (c) 2025 Alfonso Gregory <gfunni234@gmail.com>
|
Copyright (c) 2025 Alfonso Gregory <gfunni234@gmail.com>
|
||||||
|
Copyright (c) 2026 Matthew Fernandez <matthew.fernandez@gmail.com>
|
||||||
Licensed under the MIT license:
|
Licensed under the MIT license:
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
@@ -196,7 +197,7 @@ startElement(void *userData, const XML_Char *name, const XML_Char **atts) {
|
|||||||
++p;
|
++p;
|
||||||
nAtts = (int)((p - atts) >> 1);
|
nAtts = (int)((p - atts) >> 1);
|
||||||
if (nAtts > 1)
|
if (nAtts > 1)
|
||||||
qsort((void *)atts, nAtts, sizeof(XML_Char *) * 2, attcmp);
|
qsort(atts, nAtts, sizeof(XML_Char *) * 2, attcmp);
|
||||||
while (*atts) {
|
while (*atts) {
|
||||||
puttc(T(' '), fp);
|
puttc(T(' '), fp);
|
||||||
fputts(*atts++, fp);
|
fputts(*atts++, fp);
|
||||||
@@ -252,7 +253,7 @@ startElementNS(void *userData, const XML_Char *name, const XML_Char **atts) {
|
|||||||
++p;
|
++p;
|
||||||
nAtts = (int)((p - atts) >> 1);
|
nAtts = (int)((p - atts) >> 1);
|
||||||
if (nAtts > 1)
|
if (nAtts > 1)
|
||||||
qsort((void *)atts, nAtts, sizeof(XML_Char *) * 2, nsattcmp);
|
qsort(atts, nAtts, sizeof(XML_Char *) * 2, nsattcmp);
|
||||||
while (*atts) {
|
while (*atts) {
|
||||||
name = *atts++;
|
name = *atts++;
|
||||||
sep = tcsrchr(name, NSSEP);
|
sep = tcsrchr(name, NSSEP);
|
||||||
@@ -324,7 +325,7 @@ static void XMLCALL
|
|||||||
startDoctypeDecl(void *userData, const XML_Char *doctypeName,
|
startDoctypeDecl(void *userData, const XML_Char *doctypeName,
|
||||||
const XML_Char *sysid, const XML_Char *publid,
|
const XML_Char *sysid, const XML_Char *publid,
|
||||||
int has_internal_subset) {
|
int has_internal_subset) {
|
||||||
XmlwfUserData *data = (XmlwfUserData *)userData;
|
XmlwfUserData *data = userData;
|
||||||
UNUSED_P(sysid);
|
UNUSED_P(sysid);
|
||||||
UNUSED_P(publid);
|
UNUSED_P(publid);
|
||||||
UNUSED_P(has_internal_subset);
|
UNUSED_P(has_internal_subset);
|
||||||
@@ -380,7 +381,7 @@ notationCmp(const void *a, const void *b) {
|
|||||||
|
|
||||||
static void XMLCALL
|
static void XMLCALL
|
||||||
endDoctypeDecl(void *userData) {
|
endDoctypeDecl(void *userData) {
|
||||||
XmlwfUserData *data = (XmlwfUserData *)userData;
|
XmlwfUserData *data = userData;
|
||||||
NotationList **notations;
|
NotationList **notations;
|
||||||
int notationCount = 0;
|
int notationCount = 0;
|
||||||
NotationList *p;
|
NotationList *p;
|
||||||
@@ -447,7 +448,7 @@ endDoctypeDecl(void *userData) {
|
|||||||
static void XMLCALL
|
static void XMLCALL
|
||||||
notationDecl(void *userData, const XML_Char *notationName, const XML_Char *base,
|
notationDecl(void *userData, const XML_Char *notationName, const XML_Char *base,
|
||||||
const XML_Char *systemId, const XML_Char *publicId) {
|
const XML_Char *systemId, const XML_Char *publicId) {
|
||||||
XmlwfUserData *data = (XmlwfUserData *)userData;
|
XmlwfUserData *data = userData;
|
||||||
NotationList *entry = malloc(sizeof(NotationList));
|
NotationList *entry = malloc(sizeof(NotationList));
|
||||||
const char *errorMessage = "Unable to store NOTATION for output\n";
|
const char *errorMessage = "Unable to store NOTATION for output\n";
|
||||||
|
|
||||||
@@ -496,7 +497,7 @@ static void XMLCALL
|
|||||||
defaultCharacterData(void *userData, const XML_Char *s, int len) {
|
defaultCharacterData(void *userData, const XML_Char *s, int len) {
|
||||||
UNUSED_P(s);
|
UNUSED_P(s);
|
||||||
UNUSED_P(len);
|
UNUSED_P(len);
|
||||||
XML_DefaultCurrent((XML_Parser)userData);
|
XML_DefaultCurrent(userData);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void XMLCALL
|
static void XMLCALL
|
||||||
@@ -504,13 +505,13 @@ defaultStartElement(void *userData, const XML_Char *name,
|
|||||||
const XML_Char **atts) {
|
const XML_Char **atts) {
|
||||||
UNUSED_P(name);
|
UNUSED_P(name);
|
||||||
UNUSED_P(atts);
|
UNUSED_P(atts);
|
||||||
XML_DefaultCurrent((XML_Parser)userData);
|
XML_DefaultCurrent(userData);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void XMLCALL
|
static void XMLCALL
|
||||||
defaultEndElement(void *userData, const XML_Char *name) {
|
defaultEndElement(void *userData, const XML_Char *name) {
|
||||||
UNUSED_P(name);
|
UNUSED_P(name);
|
||||||
XML_DefaultCurrent((XML_Parser)userData);
|
XML_DefaultCurrent(userData);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void XMLCALL
|
static void XMLCALL
|
||||||
@@ -518,7 +519,7 @@ defaultProcessingInstruction(void *userData, const XML_Char *target,
|
|||||||
const XML_Char *data) {
|
const XML_Char *data) {
|
||||||
UNUSED_P(target);
|
UNUSED_P(target);
|
||||||
UNUSED_P(data);
|
UNUSED_P(data);
|
||||||
XML_DefaultCurrent((XML_Parser)userData);
|
XML_DefaultCurrent(userData);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void XMLCALL
|
static void XMLCALL
|
||||||
@@ -551,7 +552,7 @@ nopProcessingInstruction(void *userData, const XML_Char *target,
|
|||||||
|
|
||||||
static void XMLCALL
|
static void XMLCALL
|
||||||
markup(void *userData, const XML_Char *s, int len) {
|
markup(void *userData, const XML_Char *s, int len) {
|
||||||
FILE *fp = ((XmlwfUserData *)XML_GetUserData((XML_Parser)userData))->fp;
|
FILE *fp = ((XmlwfUserData *)XML_GetUserData(userData))->fp;
|
||||||
for (; len > 0; --len, ++s)
|
for (; len > 0; --len, ++s)
|
||||||
puttc(*s, fp);
|
puttc(*s, fp);
|
||||||
}
|
}
|
||||||
@@ -573,20 +574,18 @@ metaLocation(XML_Parser parser) {
|
|||||||
|
|
||||||
static void
|
static void
|
||||||
metaStartDocument(void *userData) {
|
metaStartDocument(void *userData) {
|
||||||
fputts(T("<document>\n"),
|
fputts(T("<document>\n"), ((XmlwfUserData *)XML_GetUserData(userData))->fp);
|
||||||
((XmlwfUserData *)XML_GetUserData((XML_Parser)userData))->fp);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
metaEndDocument(void *userData) {
|
metaEndDocument(void *userData) {
|
||||||
fputts(T("</document>\n"),
|
fputts(T("</document>\n"), ((XmlwfUserData *)XML_GetUserData(userData))->fp);
|
||||||
((XmlwfUserData *)XML_GetUserData((XML_Parser)userData))->fp);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void XMLCALL
|
static void XMLCALL
|
||||||
metaStartElement(void *userData, const XML_Char *name, const XML_Char **atts) {
|
metaStartElement(void *userData, const XML_Char *name, const XML_Char **atts) {
|
||||||
XML_Parser parser = (XML_Parser)userData;
|
XML_Parser parser = userData;
|
||||||
XmlwfUserData *data = (XmlwfUserData *)XML_GetUserData(parser);
|
XmlwfUserData *data = XML_GetUserData(parser);
|
||||||
FILE *fp = data->fp;
|
FILE *fp = data->fp;
|
||||||
const XML_Char **specifiedAttsEnd
|
const XML_Char **specifiedAttsEnd
|
||||||
= atts + XML_GetSpecifiedAttributeCount(parser);
|
= atts + XML_GetSpecifiedAttributeCount(parser);
|
||||||
@@ -618,8 +617,8 @@ metaStartElement(void *userData, const XML_Char *name, const XML_Char **atts) {
|
|||||||
|
|
||||||
static void XMLCALL
|
static void XMLCALL
|
||||||
metaEndElement(void *userData, const XML_Char *name) {
|
metaEndElement(void *userData, const XML_Char *name) {
|
||||||
XML_Parser parser = (XML_Parser)userData;
|
XML_Parser parser = userData;
|
||||||
XmlwfUserData *data = (XmlwfUserData *)XML_GetUserData(parser);
|
XmlwfUserData *data = XML_GetUserData(parser);
|
||||||
FILE *fp = data->fp;
|
FILE *fp = data->fp;
|
||||||
ftprintf(fp, T("<endtag name=\"%s\""), name);
|
ftprintf(fp, T("<endtag name=\"%s\""), name);
|
||||||
metaLocation(parser);
|
metaLocation(parser);
|
||||||
@@ -629,8 +628,8 @@ metaEndElement(void *userData, const XML_Char *name) {
|
|||||||
static void XMLCALL
|
static void XMLCALL
|
||||||
metaProcessingInstruction(void *userData, const XML_Char *target,
|
metaProcessingInstruction(void *userData, const XML_Char *target,
|
||||||
const XML_Char *data) {
|
const XML_Char *data) {
|
||||||
XML_Parser parser = (XML_Parser)userData;
|
XML_Parser parser = userData;
|
||||||
XmlwfUserData *usrData = (XmlwfUserData *)XML_GetUserData(parser);
|
XmlwfUserData *usrData = XML_GetUserData(parser);
|
||||||
FILE *fp = usrData->fp;
|
FILE *fp = usrData->fp;
|
||||||
ftprintf(fp, T("<pi target=\"%s\" data=\""), target);
|
ftprintf(fp, T("<pi target=\"%s\" data=\""), target);
|
||||||
characterData(usrData, data, (int)tcslen(data));
|
characterData(usrData, data, (int)tcslen(data));
|
||||||
@@ -641,8 +640,8 @@ metaProcessingInstruction(void *userData, const XML_Char *target,
|
|||||||
|
|
||||||
static void XMLCALL
|
static void XMLCALL
|
||||||
metaComment(void *userData, const XML_Char *data) {
|
metaComment(void *userData, const XML_Char *data) {
|
||||||
XML_Parser parser = (XML_Parser)userData;
|
XML_Parser parser = userData;
|
||||||
XmlwfUserData *usrData = (XmlwfUserData *)XML_GetUserData(parser);
|
XmlwfUserData *usrData = XML_GetUserData(parser);
|
||||||
FILE *fp = usrData->fp;
|
FILE *fp = usrData->fp;
|
||||||
fputts(T("<comment data=\""), fp);
|
fputts(T("<comment data=\""), fp);
|
||||||
characterData(usrData, data, (int)tcslen(data));
|
characterData(usrData, data, (int)tcslen(data));
|
||||||
@@ -653,8 +652,8 @@ metaComment(void *userData, const XML_Char *data) {
|
|||||||
|
|
||||||
static void XMLCALL
|
static void XMLCALL
|
||||||
metaStartCdataSection(void *userData) {
|
metaStartCdataSection(void *userData) {
|
||||||
XML_Parser parser = (XML_Parser)userData;
|
XML_Parser parser = userData;
|
||||||
XmlwfUserData *data = (XmlwfUserData *)XML_GetUserData(parser);
|
XmlwfUserData *data = XML_GetUserData(parser);
|
||||||
FILE *fp = data->fp;
|
FILE *fp = data->fp;
|
||||||
fputts(T("<startcdata"), fp);
|
fputts(T("<startcdata"), fp);
|
||||||
metaLocation(parser);
|
metaLocation(parser);
|
||||||
@@ -663,8 +662,8 @@ metaStartCdataSection(void *userData) {
|
|||||||
|
|
||||||
static void XMLCALL
|
static void XMLCALL
|
||||||
metaEndCdataSection(void *userData) {
|
metaEndCdataSection(void *userData) {
|
||||||
XML_Parser parser = (XML_Parser)userData;
|
XML_Parser parser = userData;
|
||||||
XmlwfUserData *data = (XmlwfUserData *)XML_GetUserData(parser);
|
XmlwfUserData *data = XML_GetUserData(parser);
|
||||||
FILE *fp = data->fp;
|
FILE *fp = data->fp;
|
||||||
fputts(T("<endcdata"), fp);
|
fputts(T("<endcdata"), fp);
|
||||||
metaLocation(parser);
|
metaLocation(parser);
|
||||||
@@ -673,8 +672,8 @@ metaEndCdataSection(void *userData) {
|
|||||||
|
|
||||||
static void XMLCALL
|
static void XMLCALL
|
||||||
metaCharacterData(void *userData, const XML_Char *s, int len) {
|
metaCharacterData(void *userData, const XML_Char *s, int len) {
|
||||||
XML_Parser parser = (XML_Parser)userData;
|
XML_Parser parser = userData;
|
||||||
XmlwfUserData *data = (XmlwfUserData *)XML_GetUserData(parser);
|
XmlwfUserData *data = XML_GetUserData(parser);
|
||||||
FILE *fp = data->fp;
|
FILE *fp = data->fp;
|
||||||
fputts(T("<chars str=\""), fp);
|
fputts(T("<chars str=\""), fp);
|
||||||
characterData(data, s, len);
|
characterData(data, s, len);
|
||||||
@@ -687,8 +686,8 @@ static void XMLCALL
|
|||||||
metaStartDoctypeDecl(void *userData, const XML_Char *doctypeName,
|
metaStartDoctypeDecl(void *userData, const XML_Char *doctypeName,
|
||||||
const XML_Char *sysid, const XML_Char *pubid,
|
const XML_Char *sysid, const XML_Char *pubid,
|
||||||
int has_internal_subset) {
|
int has_internal_subset) {
|
||||||
XML_Parser parser = (XML_Parser)userData;
|
XML_Parser parser = userData;
|
||||||
XmlwfUserData *data = (XmlwfUserData *)XML_GetUserData(parser);
|
XmlwfUserData *data = XML_GetUserData(parser);
|
||||||
FILE *fp = data->fp;
|
FILE *fp = data->fp;
|
||||||
UNUSED_P(sysid);
|
UNUSED_P(sysid);
|
||||||
UNUSED_P(pubid);
|
UNUSED_P(pubid);
|
||||||
@@ -700,8 +699,8 @@ metaStartDoctypeDecl(void *userData, const XML_Char *doctypeName,
|
|||||||
|
|
||||||
static void XMLCALL
|
static void XMLCALL
|
||||||
metaEndDoctypeDecl(void *userData) {
|
metaEndDoctypeDecl(void *userData) {
|
||||||
XML_Parser parser = (XML_Parser)userData;
|
XML_Parser parser = userData;
|
||||||
XmlwfUserData *data = (XmlwfUserData *)XML_GetUserData(parser);
|
XmlwfUserData *data = XML_GetUserData(parser);
|
||||||
FILE *fp = data->fp;
|
FILE *fp = data->fp;
|
||||||
fputts(T("<enddoctype"), fp);
|
fputts(T("<enddoctype"), fp);
|
||||||
metaLocation(parser);
|
metaLocation(parser);
|
||||||
@@ -712,8 +711,8 @@ static void XMLCALL
|
|||||||
metaNotationDecl(void *userData, const XML_Char *notationName,
|
metaNotationDecl(void *userData, const XML_Char *notationName,
|
||||||
const XML_Char *base, const XML_Char *systemId,
|
const XML_Char *base, const XML_Char *systemId,
|
||||||
const XML_Char *publicId) {
|
const XML_Char *publicId) {
|
||||||
XML_Parser parser = (XML_Parser)userData;
|
XML_Parser parser = userData;
|
||||||
XmlwfUserData *data = (XmlwfUserData *)XML_GetUserData(parser);
|
XmlwfUserData *data = XML_GetUserData(parser);
|
||||||
FILE *fp = data->fp;
|
FILE *fp = data->fp;
|
||||||
UNUSED_P(base);
|
UNUSED_P(base);
|
||||||
ftprintf(fp, T("<notation name=\"%s\""), notationName);
|
ftprintf(fp, T("<notation name=\"%s\""), notationName);
|
||||||
@@ -733,8 +732,8 @@ metaEntityDecl(void *userData, const XML_Char *entityName, int is_param,
|
|||||||
const XML_Char *value, int value_length, const XML_Char *base,
|
const XML_Char *value, int value_length, const XML_Char *base,
|
||||||
const XML_Char *systemId, const XML_Char *publicId,
|
const XML_Char *systemId, const XML_Char *publicId,
|
||||||
const XML_Char *notationName) {
|
const XML_Char *notationName) {
|
||||||
XML_Parser parser = (XML_Parser)userData;
|
XML_Parser parser = userData;
|
||||||
XmlwfUserData *data = (XmlwfUserData *)XML_GetUserData(parser);
|
XmlwfUserData *data = XML_GetUserData(parser);
|
||||||
FILE *fp = data->fp;
|
FILE *fp = data->fp;
|
||||||
|
|
||||||
UNUSED_P(is_param);
|
UNUSED_P(is_param);
|
||||||
@@ -770,8 +769,8 @@ metaEntityDecl(void *userData, const XML_Char *entityName, int is_param,
|
|||||||
static void XMLCALL
|
static void XMLCALL
|
||||||
metaStartNamespaceDecl(void *userData, const XML_Char *prefix,
|
metaStartNamespaceDecl(void *userData, const XML_Char *prefix,
|
||||||
const XML_Char *uri) {
|
const XML_Char *uri) {
|
||||||
XML_Parser parser = (XML_Parser)userData;
|
XML_Parser parser = userData;
|
||||||
XmlwfUserData *data = (XmlwfUserData *)XML_GetUserData(parser);
|
XmlwfUserData *data = XML_GetUserData(parser);
|
||||||
FILE *fp = data->fp;
|
FILE *fp = data->fp;
|
||||||
fputts(T("<startns"), fp);
|
fputts(T("<startns"), fp);
|
||||||
if (prefix)
|
if (prefix)
|
||||||
@@ -786,8 +785,8 @@ metaStartNamespaceDecl(void *userData, const XML_Char *prefix,
|
|||||||
|
|
||||||
static void XMLCALL
|
static void XMLCALL
|
||||||
metaEndNamespaceDecl(void *userData, const XML_Char *prefix) {
|
metaEndNamespaceDecl(void *userData, const XML_Char *prefix) {
|
||||||
XML_Parser parser = (XML_Parser)userData;
|
XML_Parser parser = userData;
|
||||||
XmlwfUserData *data = (XmlwfUserData *)XML_GetUserData(parser);
|
XmlwfUserData *data = XML_GetUserData(parser);
|
||||||
FILE *fp = data->fp;
|
FILE *fp = data->fp;
|
||||||
if (! prefix)
|
if (! prefix)
|
||||||
fputts(T("<endns/>\n"), fp);
|
fputts(T("<endns/>\n"), fp);
|
||||||
@@ -1235,8 +1234,8 @@ tmain(int argc, XML_Char **argv) {
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
outName = (XML_Char *)malloc((tcslen(outputDir) + tcslen(file) + 2)
|
outName
|
||||||
* sizeof(XML_Char));
|
= malloc((tcslen(outputDir) + tcslen(file) + 2) * sizeof(XML_Char));
|
||||||
if (! outName) {
|
if (! outName) {
|
||||||
tperror(T("Could not allocate memory"));
|
tperror(T("Could not allocate memory"));
|
||||||
exit(XMLWF_EXIT_INTERNAL_ERROR);
|
exit(XMLWF_EXIT_INTERNAL_ERROR);
|
||||||
|
|||||||
@@ -89,7 +89,7 @@
|
|||||||
#define PACKAGE_NAME "expat"
|
#define PACKAGE_NAME "expat"
|
||||||
|
|
||||||
/* Define to the full name and version of this package. */
|
/* Define to the full name and version of this package. */
|
||||||
#define PACKAGE_STRING "expat 2.8.0"
|
#define PACKAGE_STRING "expat 2.8.1"
|
||||||
|
|
||||||
/* Define to the one symbol short name of this package. */
|
/* Define to the one symbol short name of this package. */
|
||||||
#define PACKAGE_TARNAME "expat"
|
#define PACKAGE_TARNAME "expat"
|
||||||
@@ -98,7 +98,7 @@
|
|||||||
#define PACKAGE_URL ""
|
#define PACKAGE_URL ""
|
||||||
|
|
||||||
/* Define to the version of this package. */
|
/* Define to the version of this package. */
|
||||||
#define PACKAGE_VERSION "2.8.0"
|
#define PACKAGE_VERSION "2.8.1"
|
||||||
|
|
||||||
/* Define to 1 if all of the C89 standard headers exist (not just the ones
|
/* Define to 1 if all of the C89 standard headers exist (not just the ones
|
||||||
required in a freestanding environment). This macro is provided for
|
required in a freestanding environment). This macro is provided for
|
||||||
@@ -106,7 +106,7 @@
|
|||||||
#define STDC_HEADERS 1
|
#define STDC_HEADERS 1
|
||||||
|
|
||||||
/* Version number of package */
|
/* Version number of package */
|
||||||
#define VERSION "2.8.0"
|
#define VERSION "2.8.1"
|
||||||
|
|
||||||
/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
|
/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
|
||||||
significant byte first (like Motorola and SPARC, unlike Intel). */
|
significant byte first (like Motorola and SPARC, unlike Intel). */
|
||||||
|
|||||||
@@ -23,7 +23,7 @@
|
|||||||
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
.\" SUCH DAMAGE.
|
.\" SUCH DAMAGE.
|
||||||
.\"/
|
.\"/
|
||||||
.Dd April 27, 2026
|
.Dd May 13, 2026
|
||||||
.Dt LIBBSDXML 3
|
.Dt LIBBSDXML 3
|
||||||
.Os
|
.Os
|
||||||
.Sh NAME
|
.Sh NAME
|
||||||
@@ -34,7 +34,7 @@
|
|||||||
.Sh DESCRIPTION
|
.Sh DESCRIPTION
|
||||||
The
|
The
|
||||||
.Nm
|
.Nm
|
||||||
library is a verbatim copy of the eXpat XML library version 2.8.0.
|
library is a verbatim copy of the eXpat XML library version 2.8.1.
|
||||||
.Pp
|
.Pp
|
||||||
The
|
The
|
||||||
.Nm
|
.Nm
|
||||||
|
|||||||
Reference in New Issue
Block a user