92#define NSSEP T('\001')
337 while (notationListHead !=
NULL) {
340 free((
void *)notationListHead->
systemId);
341 free((
void *)notationListHead->
publicId);
342 free(notationListHead);
343 notationListHead = next;
357 while (*
xs != 0 && *xt != 0) {
377 return xcscmp(
n1->notationName,
n2->notationName);
389 for (
p =
data->notationListHead;
p !=
NULL;
p =
p->next)
393 free((
void *)
data->currentDoctypeName);
443 free((
void *)
data->currentDoctypeName);
452 const char *
errorMessage =
"Unable to store NOTATION for output\n";
465 if (systemId !=
NULL) {
476 if (publicId !=
NULL) {
489 entry->
next =
data->notationListHead;
490 data->notationListHead = entry;
605 ftprintf(fp,
T(
"<attribute name=\"%s\" value=\""), atts[0]);
608 fputts(
T(
"\" defaulted=\"yes\"/>\n"), fp);
610 fputts(
T(
"\" id=\"yes\"/>\n"), fp);
613 }
while (*(atts += 2));
614 fputts(
T(
"</starttag>\n"), fp);
635 ftprintf(fp,
T(
"<pi target=\"%s\" data=\""), target);
647 fputts(
T(
"<comment data=\""), fp);
679 fputts(
T(
"<chars str=\""), fp);
719 ftprintf(fp,
T(
"<notation name=\"%s\""), notationName);
721 ftprintf(fp,
T(
" public=\"%s\""), publicId);
748 }
else if (notationName) {
751 ftprintf(fp,
T(
" public=\"%s\""), publicId);
755 ftprintf(fp,
T(
" notation=\"%s\""), notationName);
761 ftprintf(fp,
T(
" public=\"%s\""), publicId);
831 info->release = free;
835 *(
int *)
info->data = cp;
850 while ((
ch = *
s) != 0) {
889 T(
" %s [OPTIONS] [FILE ...]\n")
891 T(
" %s -v|--version\n")
893 T(
"xmlwf - Determines if an XML document is well-formed\n")
895 T(
"positional arguments:\n")
896 T(
" FILE file to process (default: STDIN)\n")
898 T(
"input control arguments:\n")
899 T(
" -s print an error if the document is not [s]tandalone\n")
900 T(
" -n enable [n]amespace processing\n")
901 T(
" -p enable processing of external DTDs and [p]arameter entities\n")
902 T(
" -x enable processing of e[x]ternal entities\n")
903 T(
" -e ENCODING override any in-document [e]ncoding declaration\n")
904 T(
" -w enable support for [W]indows code pages\n")
905 T(
" -r disable memory-mapping and use [r]ead calls instead\n")
906 T(
" -g BYTES buffer size to request per call pair to XML_[G]etBuffer and read (default: 8 KiB)\n")
907 T(
" -k when processing multiple files, [k]eep processing after first file with error\n")
909 T(
"output control arguments:\n")
910 T(
" -d DIRECTORY output [d]estination directory\n")
911 T(
" -c write a [c]opy of input XML, not canonical XML\n")
912 T(
" -m write [m]eta XML, not canonical XML\n")
913 T(
" -t write no XML output for [t]iming of plain parsing\n")
914 T(
" -N enable adding doctype and [n]otation declarations\n")
916 T(
"billion laughs attack protection:\n")
917 T(
" NOTE: If you ever need to increase these values for non-attack payload, please file a bug report.\n")
919 T(
" -a FACTOR set maximum tolerated [a]mplification factor (default: 100.0)\n")
920 T(
" -b BYTES set number of output [b]ytes needed to activate (default: 8 MiB)\n")
922 T(
"reparse deferral:\n")
923 T(
" -q disable reparse deferral, and allow [q]uadratic parse runtime with large tokens\n")
925 T(
"info arguments:\n")
926 T(
" -h, --help show this [h]elp message and exit\n")
927 T(
" -v, --version show program's [v]ersion number and exit\n")
930 T(
" 0 the input files are well-formed and the output (if requested) was written successfully\n")
931 T(
" 1 could not allocate data structures, signals a serious problem with execution environment\n")
932 T(
" 2 one or more input files were not well-formed\n")
933 T(
" 3 could not create an output file\n")
934 T(
" 4 command-line argument error\n")
936 T(
"xmlwf of libexpat is software libre, licensed under the MIT license.\n")
937 T(
"Please report bugs at https://github.com/libexpat/libexpat/issues -- thank you!\n")
943#if defined(__MINGW32__) && defined(XML_UNICODE)
948#define XMLWF_SHIFT_ARG_INTO(constCharStarTarget, argc, argv, i, j) \
950 if (argv[i][j + 1] == T('\0')) { \
952 usage(argv[0], XMLWF_EXIT_USAGE_ERROR); \
955 constCharStarTarget = argv[i]; \
957 constCharStarTarget = argv[i] + j + 1; \
998 if (
argv[
i][1] ==
T(
'-')) {
999 if (
argv[
i][2] ==
T(
'\0')) {
1012 switch (
argv[
i][j]) {
1079 " (needs an integer from 1 to INT_MAX/2+1 i.e. 1,073,741,824 on most platforms)"));
1101 tperror(
T(
"invalid amplification limit")
T(
1102 " (needs a floating point number greater or equal than 1.0)"));
1107 T(
"Warning: Given amplification limit ignored")
1108 T(
", xmlwf has been compiled without DTD/GE support.\n"));
1122 tperror(
T(
"invalid ignore threshold")
1123 T(
" (needs an integer from 0 to 2^64-1)"));
1129 T(
"Warning: Given attack threshold ignored")
1130 T(
", xmlwf has been compiled without DTD/GE support.\n"));
1166 tperror(
T(
"Could not instantiate parser"));
1190 tperror(
T(
"Failed to disable reparse deferral"));
1227 tperror(
T(
"Could not allocate memory"));
1234 if (! userData.
fp) {
const char apr_size_t len
int wmain(int argc, const wchar_t **wargv, const wchar_t **wenv)
int codepageConvert(int cp, const char *p)
int codepageMap(int cp, int *map)
int XML_GetCurrentByteCount(XML_Parser parser)
int XML_GetSpecifiedAttributeCount(XML_Parser parser)
XML_Bool XML_SetReparseDeferralEnabled(XML_Parser parser, XML_Bool enabled)
void XML_SetCdataSectionHandler(XML_Parser parser, XML_StartCdataSectionHandler start, XML_EndCdataSectionHandler end)
void XML_SetElementHandler(XML_Parser parser, XML_StartElementHandler start, XML_EndElementHandler end)
int XML_GetIdAttributeIndex(XML_Parser parser)
XML_Index XML_GetCurrentByteIndex(XML_Parser parser)
void XML_SetCommentHandler(XML_Parser parser, XML_CommentHandler handler)
void XML_SetNotStandaloneHandler(XML_Parser parser, XML_NotStandaloneHandler handler)
void XML_UseParserAsHandlerArg(XML_Parser parser)
void XML_SetCharacterDataHandler(XML_Parser parser, XML_CharacterDataHandler handler)
const XML_Char * XML_GetBase(XML_Parser parser)
void XML_SetEntityDeclHandler(XML_Parser parser, XML_EntityDeclHandler handler)
const XML_Feature * XML_GetFeatureList(void)
void XML_SetUnknownEncodingHandler(XML_Parser parser, XML_UnknownEncodingHandler handler, void *encodingHandlerData)
@ XML_PARAM_ENTITY_PARSING_ALWAYS
@ XML_PARAM_ENTITY_PARSING_NEVER
void XML_SetDoctypeDeclHandler(XML_Parser parser, XML_StartDoctypeDeclHandler start, XML_EndDoctypeDeclHandler end)
void XML_SetNamespaceDeclHandler(XML_Parser parser, XML_StartNamespaceDeclHandler start, XML_EndNamespaceDeclHandler end)
#define XML_GetUserData(parser)
XML_Parser XML_ParserCreate(const XML_Char *encoding)
void XML_ParserFree(XML_Parser parser)
void XML_SetDefaultHandler(XML_Parser parser, XML_DefaultHandler handler)
XML_Size XML_GetCurrentLineNumber(XML_Parser parser)
struct XML_ParserStruct * XML_Parser
void XML_SetNotationDeclHandler(XML_Parser parser, XML_NotationDeclHandler handler)
XML_Size XML_GetCurrentColumnNumber(XML_Parser parser)
void XML_SetUserData(XML_Parser parser, void *userData)
XML_Parser XML_ParserCreateNS(const XML_Char *encoding, XML_Char namespaceSeparator)
void XML_SetProcessingInstructionHandler(XML_Parser parser, XML_ProcessingInstructionHandler handler)
void XML_DefaultCurrent(XML_Parser parser)
const XML_LChar * XML_ExpatVersion(void)
int XML_SetParamEntityParsing(XML_Parser parser, enum XML_ParamEntityParsing parsing)
apr_bucket apr_bucket_brigade * a
const char apr_file_t * file
apr_array_header_t ** result
const char apr_status_t(*) apr_pool_t *poo __attribute__)((nonnull(2, 4)))
struct NotationList * next
const XML_Char * publicId
const XML_Char * systemId
const XML_Char * notationName
const XML_Char * currentDoctypeName
NotationList * notationListHead
typedef int(WSAAPI *apr_winapi_fpt_WSAPoll)(IN OUT LPWSAPOLLFD fdArray
int XML_ProcessFile(XML_Parser parser, const XML_Char *filename, unsigned flags)
#define XML_EXTERNAL_ENTITIES
static void XMLCALL metaEndDoctypeDecl(void *userData)
static void XMLCALL defaultCharacterData(void *userData, const XML_Char *s, int len)
static void XMLCALL nopCharacterData(void *userData, const XML_Char *s, int len)
static XML_Char * xcsdup(const XML_Char *s)
static void XMLCALL defaultProcessingInstruction(void *userData, const XML_Char *target, const XML_Char *data)
struct xmlwfUserData XmlwfUserData
static void XMLCALL metaProcessingInstruction(void *userData, const XML_Char *target, const XML_Char *data)
static void XMLCALL endElement(void *userData, const XML_Char *name)
static void XMLCALL endDoctypeDecl(void *userData)
static void XMLCALL defaultStartElement(void *userData, const XML_Char *name, const XML_Char **atts)
static void XMLCALL startElement(void *userData, const XML_Char *name, const XML_Char **atts)
static void XMLCALL metaStartDoctypeDecl(void *userData, const XML_Char *doctypeName, const XML_Char *sysid, const XML_Char *pubid, int has_internal_subset)
static void XMLCALL metaStartNamespaceDecl(void *userData, const XML_Char *prefix, const XML_Char *uri)
@ XMLWF_EXIT_NOT_WELLFORMED
@ XMLWF_EXIT_INTERNAL_ERROR
@ XMLWF_EXIT_OUTPUT_ERROR
static void cleanupUserData(XmlwfUserData *userData)
static void XMLCALL characterData(void *userData, const XML_Char *s, int len)
static void XMLCALL markup(void *userData, const XML_Char *s, int len)
static void XMLCALL endElementNS(void *userData, const XML_Char *name)
#define XMLWF_SHIFT_ARG_INTO(constCharStarTarget, argc, argv, i, j)
static void XMLCALL metaStartCdataSection(void *userData)
static void metaEndDocument(void *userData)
static void XMLCALL metaEndCdataSection(void *userData)
static void XMLCALL notationDecl(void *userData, const XML_Char *notationName, const XML_Char *base, const XML_Char *systemId, const XML_Char *publicId)
static void XMLCALL processingInstruction(void *userData, const XML_Char *target, const XML_Char *data)
static int xcscmp(const XML_Char *xs, const XML_Char *xt)
static void XMLCALL defaultEndElement(void *userData, const XML_Char *name)
static void XMLCALL metaCharacterData(void *userData, const XML_Char *s, int len)
static void XMLCALL metaNotationDecl(void *userData, const XML_Char *notationName, const XML_Char *base, const XML_Char *systemId, const XML_Char *publicId)
static void XMLCALL metaEndNamespaceDecl(void *userData, const XML_Char *prefix)
static int attcmp(const void *att1, const void *att2)
static void attributeValue(FILE *fp, const XML_Char *s)
static void XMLCALL metaEndElement(void *userData, const XML_Char *name)
static void metaLocation(XML_Parser parser)
static void XMLCALL nopEndElement(void *userData, const XML_Char *name)
static void XMLCALL metaStartElement(void *userData, const XML_Char *name, const XML_Char **atts)
static void showVersion(XML_Char *prog)
static void XMLCALL startDoctypeDecl(void *userData, const XML_Char *doctypeName, const XML_Char *sysid, const XML_Char *publid, int has_internal_subset)
static void XMLCALL nopStartElement(void *userData, const XML_Char *name, const XML_Char **atts)
static int XMLCALL notStandalone(void *userData)
static void XMLCALL nopProcessingInstruction(void *userData, const XML_Char *target, const XML_Char *data)
static void usage(const XML_Char *prog, int rc)
static int nsattcmp(const void *p1, const void *p2)
static int XMLCALL unknownEncodingConvert(void *data, const char *p)
static void metaStartDocument(void *userData)
static void XMLCALL startElementNS(void *userData, const XML_Char *name, const XML_Char **atts)
static int notationCmp(const void *a, const void *b)
static void XMLCALL metaComment(void *userData, const XML_Char *data)
static int XMLCALL unknownEncoding(void *userData, const XML_Char *name, XML_Encoding *info)
static void XMLCALL metaEntityDecl(void *userData, const XML_Char *entityName, int is_param, const XML_Char *value, int value_length, const XML_Char *base, const XML_Char *systemId, const XML_Char *publicId, const XML_Char *notationName)
static void freeNotations(XmlwfUserData *data)