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:
Philip Paeps
2026-05-13 11:17:00 +08:00
22 changed files with 450 additions and 111 deletions
+26
View File
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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])
+1 -1
View File
@@ -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>
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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>">
+1 -1
View File
@@ -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
} }
+30 -6
View File
@@ -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,10 +7105,10 @@ 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 {
+2 -2
View File
@@ -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;
+295 -15
View File
@@ -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);
+3 -2
View File
@@ -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 -15
View File
@@ -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) {
+2
View File
@@ -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;
+3 -3
View File
@@ -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;
+5 -5
View File
@@ -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;
} }
+4 -3
View File
@@ -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;
+4 -3
View File
@@ -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;
} }
+3 -2
View File
@@ -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;
} }
+2 -2
View File
@@ -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
View File
@@ -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);
+3 -3
View File
@@ -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). */
+2 -2
View File
@@ -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