diff options
Diffstat (limited to 'xmlwf')
-rw-r--r-- | xmlwf/Makefile.am | 2 | ||||
-rw-r--r-- | xmlwf/Makefile.in | 4 | ||||
-rw-r--r-- | xmlwf/codepage.c | 6 | ||||
-rw-r--r-- | xmlwf/codepage.h | 4 | ||||
-rw-r--r-- | xmlwf/ct.c | 3 | ||||
-rw-r--r-- | xmlwf/filemap.h | 4 | ||||
-rw-r--r-- | xmlwf/readfilemap.c | 7 | ||||
-rw-r--r-- | xmlwf/unixfilemap.c | 6 | ||||
-rw-r--r-- | xmlwf/win32filemap.c | 4 | ||||
-rw-r--r-- | xmlwf/xmlfile.c | 14 | ||||
-rw-r--r-- | xmlwf/xmlfile.h | 5 | ||||
-rw-r--r-- | xmlwf/xmlmime.c | 4 | ||||
-rw-r--r-- | xmlwf/xmlmime.h | 3 | ||||
-rw-r--r-- | xmlwf/xmltchar.h | 7 | ||||
-rw-r--r-- | xmlwf/xmlwf.c | 144 | ||||
-rwxr-xr-x | xmlwf/xmlwf_helpgen.py | 18 | ||||
-rwxr-xr-x | xmlwf/xmlwf_helpgen.sh | 5 |
17 files changed, 192 insertions, 48 deletions
diff --git a/xmlwf/Makefile.am b/xmlwf/Makefile.am index f35ade7a..f10a8798 100644 --- a/xmlwf/Makefile.am +++ b/xmlwf/Makefile.am @@ -6,7 +6,7 @@ # \___/_/\_\ .__/ \__,_|\__| # |_| XML parser # -# Copyright (c) 2017 Expat development team +# Copyright (c) 2017-2020 Sebastian Pipping <sebastian@pipping.org> # Licensed under the MIT license: # # Permission is hereby granted, free of charge, to any person obtaining diff --git a/xmlwf/Makefile.in b/xmlwf/Makefile.in index c764030a..f841c6e2 100644 --- a/xmlwf/Makefile.in +++ b/xmlwf/Makefile.in @@ -22,7 +22,7 @@ # \___/_/\_\ .__/ \__,_|\__| # |_| XML parser # -# Copyright (c) 2017 Expat development team +# Copyright (c) 2017-2020 Sebastian Pipping <sebastian@pipping.org> # Licensed under the MIT license: # # Permission is hereby granted, free of charge, to any person obtaining @@ -237,6 +237,7 @@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ +CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ @@ -317,6 +318,7 @@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_cv_sizeof_void_p = @ac_cv_sizeof_void_p@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ diff --git a/xmlwf/codepage.c b/xmlwf/codepage.c index 44d20358..8e0b5d19 100644 --- a/xmlwf/codepage.c +++ b/xmlwf/codepage.c @@ -7,7 +7,11 @@ |_| XML parser Copyright (c) 1997-2000 Thai Open Source Software Center Ltd - Copyright (c) 2000-2017 Expat development team + Copyright (c) 2000 Clark Cooper <coopercc@users.sourceforge.net> + Copyright (c) 2002 Fred L. Drake, Jr. <fdrake@users.sourceforge.net> + Copyright (c) 2005-2006 Karl Waclawek <karl@waclawek.net> + Copyright (c) 2016-2019 Sebastian Pipping <sebastian@pipping.org> + Copyright (c) 2019 David Loffredo <loffredo@steptools.com> Licensed under the MIT license: Permission is hereby granted, free of charge, to any person obtaining diff --git a/xmlwf/codepage.h b/xmlwf/codepage.h index 1b75d583..75ddbce4 100644 --- a/xmlwf/codepage.h +++ b/xmlwf/codepage.h @@ -7,7 +7,9 @@ |_| XML parser Copyright (c) 1997-2000 Thai Open Source Software Center Ltd - Copyright (c) 2000-2017 Expat development team + Copyright (c) 2000 Clark Cooper <coopercc@users.sourceforge.net> + Copyright (c) 2002 Fred L. Drake, Jr. <fdrake@users.sourceforge.net> + Copyright (c) 2016-2017 Sebastian Pipping <sebastian@pipping.org> Licensed under the MIT license: Permission is hereby granted, free of charge, to any person obtaining @@ -7,7 +7,8 @@ |_| XML parser Copyright (c) 1997-2000 Thai Open Source Software Center Ltd - Copyright (c) 2000-2017 Expat development team + Copyright (c) 2002 Fred L. Drake, Jr. <fdrake@users.sourceforge.net> + Copyright (c) 2016-2017 Sebastian Pipping <sebastian@pipping.org> Licensed under the MIT license: Permission is hereby granted, free of charge, to any person obtaining diff --git a/xmlwf/filemap.h b/xmlwf/filemap.h index ef661144..5e0c70fa 100644 --- a/xmlwf/filemap.h +++ b/xmlwf/filemap.h @@ -7,7 +7,9 @@ |_| XML parser Copyright (c) 1997-2000 Thai Open Source Software Center Ltd - Copyright (c) 2000-2017 Expat development team + Copyright (c) 2000 Clark Cooper <coopercc@users.sourceforge.net> + Copyright (c) 2002 Fred L. Drake, Jr. <fdrake@users.sourceforge.net> + Copyright (c) 2016-2017 Sebastian Pipping <sebastian@pipping.org> Licensed under the MIT license: Permission is hereby granted, free of charge, to any person obtaining diff --git a/xmlwf/readfilemap.c b/xmlwf/readfilemap.c index d5b84f99..59121f5b 100644 --- a/xmlwf/readfilemap.c +++ b/xmlwf/readfilemap.c @@ -7,7 +7,12 @@ |_| XML parser Copyright (c) 1997-2000 Thai Open Source Software Center Ltd - Copyright (c) 2000-2017 Expat development team + Copyright (c) 2000 Clark Cooper <coopercc@users.sourceforge.net> + Copyright (c) 2001-2004 Fred L. Drake, Jr. <fdrake@users.sourceforge.net> + Copyright (c) 2002-2009 Karl Waclawek <karl@waclawek.net> + Copyright (c) 2016-2017 Sebastian Pipping <sebastian@pipping.org> + Copyright (c) 2017 Rhodri James <rhodri@wildebeest.org.uk> + Copyright (c) 2017 Franek Korta <fkorta@gmail.com> Licensed under the MIT license: Permission is hereby granted, free of charge, to any person obtaining diff --git a/xmlwf/unixfilemap.c b/xmlwf/unixfilemap.c index 0d0dc042..d0ce9cc6 100644 --- a/xmlwf/unixfilemap.c +++ b/xmlwf/unixfilemap.c @@ -7,7 +7,11 @@ |_| XML parser Copyright (c) 1997-2000 Thai Open Source Software Center Ltd - Copyright (c) 2000-2017 Expat development team + Copyright (c) 2000 Clark Cooper <coopercc@users.sourceforge.net> + Copyright (c) 2001-2002 Fred L. Drake, Jr. <fdrake@users.sourceforge.net> + Copyright (c) 2006 Karl Waclawek <karl@waclawek.net> + Copyright (c) 2016-2017 Sebastian Pipping <sebastian@pipping.org> + Copyright (c) 2017 Rhodri James <rhodri@wildebeest.org.uk> Licensed under the MIT license: Permission is hereby granted, free of charge, to any person obtaining diff --git a/xmlwf/win32filemap.c b/xmlwf/win32filemap.c index 0c9b7ecc..bde47777 100644 --- a/xmlwf/win32filemap.c +++ b/xmlwf/win32filemap.c @@ -7,7 +7,9 @@ |_| XML parser Copyright (c) 1997-2000 Thai Open Source Software Center Ltd - Copyright (c) 2000-2017 Expat development team + Copyright (c) 2000 Clark Cooper <coopercc@users.sourceforge.net> + Copyright (c) 2002 Fred L. Drake, Jr. <fdrake@users.sourceforge.net> + Copyright (c) 2016-2017 Sebastian Pipping <sebastian@pipping.org> Licensed under the MIT license: Permission is hereby granted, free of charge, to any person obtaining diff --git a/xmlwf/xmlfile.c b/xmlwf/xmlfile.c index e3d22c57..50d02f8f 100644 --- a/xmlwf/xmlfile.c +++ b/xmlwf/xmlfile.c @@ -7,7 +7,13 @@ |_| XML parser Copyright (c) 1997-2000 Thai Open Source Software Center Ltd - Copyright (c) 2000-2017 Expat development team + Copyright (c) 2000 Clark Cooper <coopercc@users.sourceforge.net> + Copyright (c) 2002-2003 Fred L. Drake, Jr. <fdrake@users.sourceforge.net> + Copyright (c) 2004-2006 Karl Waclawek <karl@waclawek.net> + Copyright (c) 2005-2007 Steven Solie <ssolie@users.sourceforge.net> + Copyright (c) 2016-2021 Sebastian Pipping <sebastian@pipping.org> + Copyright (c) 2017 Rhodri James <rhodri@wildebeest.org.uk> + Copyright (c) 2019 David Loffredo <loffredo@steptools.com> Licensed under the MIT license: Permission is hereby granted, free of charge, to any person obtaining @@ -38,9 +44,9 @@ #ifdef _WIN32 # include "winconfig.h" -#elif defined(HAVE_EXPAT_CONFIG_H) -# include <expat_config.h> -#endif /* ndef _WIN32 */ +#endif + +#include <expat_config.h> #include "expat.h" #include "internal.h" /* for UNUSED_P only */ diff --git a/xmlwf/xmlfile.h b/xmlwf/xmlfile.h index 6e5d5b49..d75dda22 100644 --- a/xmlwf/xmlfile.h +++ b/xmlwf/xmlfile.h @@ -7,7 +7,10 @@ |_| XML parser Copyright (c) 1997-2000 Thai Open Source Software Center Ltd - Copyright (c) 2000-2017 Expat development team + Copyright (c) 2000 Clark Cooper <coopercc@users.sourceforge.net> + Copyright (c) 2002 Fred L. Drake, Jr. <fdrake@users.sourceforge.net> + Copyright (c) 2005 Karl Waclawek <karl@waclawek.net> + Copyright (c) 2016-2019 Sebastian Pipping <sebastian@pipping.org> Licensed under the MIT license: Permission is hereby granted, free of charge, to any person obtaining diff --git a/xmlwf/xmlmime.c b/xmlwf/xmlmime.c index 39160d71..883e293d 100644 --- a/xmlwf/xmlmime.c +++ b/xmlwf/xmlmime.c @@ -7,7 +7,9 @@ |_| XML parser Copyright (c) 1997-2000 Thai Open Source Software Center Ltd - Copyright (c) 2000-2017 Expat development team + Copyright (c) 2002 Fred L. Drake, Jr. <fdrake@users.sourceforge.net> + Copyright (c) 2016-2018 Sebastian Pipping <sebastian@pipping.org> + Copyright (c) 2018 Marco Maggi <marco.maggi-ipsu@poste.it> Licensed under the MIT license: Permission is hereby granted, free of charge, to any person obtaining diff --git a/xmlwf/xmlmime.h b/xmlwf/xmlmime.h index 04712862..591a8847 100644 --- a/xmlwf/xmlmime.h +++ b/xmlwf/xmlmime.h @@ -7,7 +7,8 @@ |_| XML parser Copyright (c) 1997-2000 Thai Open Source Software Center Ltd - Copyright (c) 2000-2017 Expat development team + Copyright (c) 2002 Fred L. Drake, Jr. <fdrake@users.sourceforge.net> + Copyright (c) 2016-2017 Sebastian Pipping <sebastian@pipping.org> Licensed under the MIT license: Permission is hereby granted, free of charge, to any person obtaining diff --git a/xmlwf/xmltchar.h b/xmlwf/xmltchar.h index d7e7b411..30283d08 100644 --- a/xmlwf/xmltchar.h +++ b/xmlwf/xmltchar.h @@ -7,7 +7,8 @@ |_| XML parser Copyright (c) 1997-2000 Thai Open Source Software Center Ltd - Copyright (c) 2000-2017 Expat development team + Copyright (c) 2016-2021 Sebastian Pipping <sebastian@pipping.org> + Copyright (c) 2017 Rhodri James <rhodri@wildebeest.org.uk> Licensed under the MIT license: Permission is hereby granted, free of charge, to any person obtaining @@ -54,6 +55,8 @@ # define tmain wmain # define tremove _wremove # define tchar wchar_t +# define tcstof wcstof +# define tcstoull wcstoull #else /* not XML_UNICODE */ # define T(x) x # define ftprintf fprintf @@ -71,4 +74,6 @@ # define tmain main # define tremove remove # define tchar char +# define tcstof strtof +# define tcstoull strtoull #endif /* not XML_UNICODE */ diff --git a/xmlwf/xmlwf.c b/xmlwf/xmlwf.c index 493b6973..342d6c59 100644 --- a/xmlwf/xmlwf.c +++ b/xmlwf/xmlwf.c @@ -7,7 +7,16 @@ |_| XML parser Copyright (c) 1997-2000 Thai Open Source Software Center Ltd - Copyright (c) 2000-2017 Expat development team + Copyright (c) 2000 Clark Cooper <coopercc@users.sourceforge.net> + Copyright (c) 2001-2003 Fred L. Drake, Jr. <fdrake@users.sourceforge.net> + Copyright (c) 2004-2009 Karl Waclawek <karl@waclawek.net> + Copyright (c) 2005-2007 Steven Solie <ssolie@users.sourceforge.net> + Copyright (c) 2016-2021 Sebastian Pipping <sebastian@pipping.org> + Copyright (c) 2017 Rhodri James <rhodri@wildebeest.org.uk> + Copyright (c) 2019 David Loffredo <loffredo@steptools.com> + Copyright (c) 2020 Joe Orton <jorton@redhat.com> + Copyright (c) 2020 Kleber TarcĂsio <klebertarcisio@yahoo.com.br> + Copyright (c) 2021 Tim Bray <tbray@textuality.com> Licensed under the MIT license: Permission is hereby granted, free of charge, to any person obtaining @@ -30,11 +39,15 @@ USE OR OTHER DEALINGS IN THE SOFTWARE. */ +#include <expat_config.h> + #include <assert.h> #include <stdio.h> #include <stdlib.h> #include <stddef.h> #include <string.h> +#include <math.h> /* for isnan */ +#include <errno.h> #include "expat.h" #include "codepage.h" @@ -50,6 +63,14 @@ # include <wchar.h> #endif +enum ExitCode { + XMLWF_EXIT_SUCCESS = 0, + XMLWF_EXIT_INTERNAL_ERROR = 1, + XMLWF_EXIT_NOT_WELLFORMED = 2, + XMLWF_EXIT_OUTPUT_ERROR = 3, + XMLWF_EXIT_USAGE_ERROR = 4, +}; + /* Structures for handler user data */ typedef struct NotationList { struct NotationList *next; @@ -859,9 +880,10 @@ usage(const XML_Char *prog, int rc) { * xmlwf/xmlwf_helpgen.sh in here. */ /* clang-format off */ - T("usage: %s [-s] [-n] [-p] [-x] [-e ENCODING] [-w] [-r] [-k] [-d DIRECTORY]\n") - T(" [-c | -m | -t] [-N]\n") - T(" [FILE [FILE ...]]\n") + T("usage:\n") + T(" %s [OPTIONS] [FILE ...]\n") + T(" %s -h\n") + T(" %s -v\n") T("\n") T("xmlwf - Determines if an XML document is well-formed\n") T("\n") @@ -885,6 +907,12 @@ usage(const XML_Char *prog, int rc) { T(" -t write no XML output for [t]iming of plain parsing\n") T(" -N enable adding doctype and [n]otation declarations\n") T("\n") + T("billion laughs attack protection:\n") + T(" NOTE: If you ever need to increase these values for non-attack payload, please file a bug report.\n") + T("\n") + T(" -a FACTOR set maximum tolerated [a]mplification factor (default: 100.0)\n") + T(" -b BYTES set number of output [b]ytes needed to activate (default: 8 MiB)\n") + T("\n") T("info arguments:\n") T(" -h show this [h]elp message and exit\n") T(" -v show program's [v]ersion number and exit\n") @@ -899,7 +927,7 @@ usage(const XML_Char *prog, int rc) { T("xmlwf of libexpat is software libre, licensed under the MIT license.\n") T("Please report bugs at https://github.com/libexpat/libexpat/issues. Thank you!\n") , /* clang-format on */ - prog); + prog, prog, prog); exit(rc); } @@ -908,6 +936,19 @@ usage(const XML_Char *prog, int rc) { int wmain(int argc, XML_Char **argv); #endif +#define XMLWF_SHIFT_ARG_INTO(constCharStarTarget, argc, argv, i, j) \ + { \ + if (argv[i][j + 1] == T('\0')) { \ + if (++i == argc) \ + usage(argv[0], XMLWF_EXIT_USAGE_ERROR); \ + constCharStarTarget = argv[i]; \ + } else { \ + constCharStarTarget = argv[i] + j + 1; \ + } \ + i++; \ + j = 0; \ + } + int tmain(int argc, XML_Char **argv) { int i, j; @@ -920,7 +961,12 @@ tmain(int argc, XML_Char **argv) { int requireStandalone = 0; int requiresNotations = 0; int continueOnError = 0; - int exitCode = 0; + + float attackMaximumAmplification = -1.0f; /* signaling "not set" */ + unsigned long long attackThresholdBytes; + XML_Bool attackThresholdGiven = XML_FALSE; + + int exitCode = XMLWF_EXIT_SUCCESS; enum XML_ParamEntityParsing paramEntityParsing = XML_PARAM_ENTITY_PARSING_NEVER; int useStdin = 0; @@ -984,27 +1030,13 @@ tmain(int argc, XML_Char **argv) { j++; break; case T('d'): - if (argv[i][j + 1] == T('\0')) { - if (++i == argc) - usage(argv[0], 4); - outputDir = argv[i]; - } else - outputDir = argv[i] + j + 1; - i++; - j = 0; + XMLWF_SHIFT_ARG_INTO(outputDir, argc, argv, i, j); break; case T('e'): - if (argv[i][j + 1] == T('\0')) { - if (++i == argc) - usage(argv[0], 4); - encoding = argv[i]; - } else - encoding = argv[i] + j + 1; - i++; - j = 0; + XMLWF_SHIFT_ARG_INTO(encoding, argc, argv, i, j); break; case T('h'): - usage(argv[0], 0); + usage(argv[0], XMLWF_EXIT_SUCCESS); return 0; case T('v'): showVersion(argv[0]); @@ -1013,6 +1045,49 @@ tmain(int argc, XML_Char **argv) { continueOnError = 1; j++; break; + case T('a'): { + const XML_Char *valueText = NULL; + XMLWF_SHIFT_ARG_INTO(valueText, argc, argv, i, j); + + errno = 0; + XML_Char *afterValueText = (XML_Char *)valueText; + attackMaximumAmplification = tcstof(valueText, &afterValueText); + if ((errno != 0) || (afterValueText[0] != T('\0')) + || isnan(attackMaximumAmplification) + || (attackMaximumAmplification < 1.0f)) { + // This prevents tperror(..) from reporting misleading "[..]: Success" + errno = ERANGE; + tperror(T("invalid amplification limit") T( + " (needs a floating point number greater or equal than 1.0)")); + exit(XMLWF_EXIT_USAGE_ERROR); + } +#ifndef XML_DTD + ftprintf(stderr, T("Warning: Given amplification limit ignored") T( + ", xmlwf has been compiled without DTD support.\n")); +#endif + break; + } + case T('b'): { + const XML_Char *valueText = NULL; + XMLWF_SHIFT_ARG_INTO(valueText, argc, argv, i, j); + + errno = 0; + XML_Char *afterValueText = (XML_Char *)valueText; + attackThresholdBytes = tcstoull(valueText, &afterValueText, 10); + if ((errno != 0) || (afterValueText[0] != T('\0'))) { + // This prevents tperror(..) from reporting misleading "[..]: Success" + errno = ERANGE; + tperror(T("invalid ignore threshold") + T(" (needs an integer from 0 to 2^64-1)")); + exit(XMLWF_EXIT_USAGE_ERROR); + } + attackThresholdGiven = XML_TRUE; +#ifndef XML_DTD + ftprintf(stderr, T("Warning: Given attack threshold ignored") T( + ", xmlwf has been compiled without DTD support.\n")); +#endif + break; + } case T('\0'): if (j > 1) { i++; @@ -1021,7 +1096,7 @@ tmain(int argc, XML_Char **argv) { } /* fall through */ default: - usage(argv[0], 4); + usage(argv[0], XMLWF_EXIT_USAGE_ERROR); } } if (i == argc) { @@ -1040,7 +1115,20 @@ tmain(int argc, XML_Char **argv) { if (! parser) { tperror(T("Could not instantiate parser")); - exit(1); + exit(XMLWF_EXIT_INTERNAL_ERROR); + } + + if (attackMaximumAmplification != -1.0f) { +#ifdef XML_DTD + XML_SetBillionLaughsAttackProtectionMaximumAmplification( + parser, attackMaximumAmplification); +#endif + } + if (attackThresholdGiven) { +#ifdef XML_DTD + XML_SetBillionLaughsAttackProtectionActivationThreshold( + parser, attackThresholdBytes); +#endif } if (requireStandalone) @@ -1076,7 +1164,7 @@ tmain(int argc, XML_Char **argv) { * sizeof(XML_Char)); if (! outName) { tperror(T("Could not allocate memory")); - exit(1); + exit(XMLWF_EXIT_INTERNAL_ERROR); } tcscpy(outName, outputDir); tcscat(outName, delim); @@ -1084,7 +1172,7 @@ tmain(int argc, XML_Char **argv) { userData.fp = tfopen(outName, T("wb")); if (! userData.fp) { tperror(outName); - exitCode = 3; + exitCode = XMLWF_EXIT_OUTPUT_ERROR; if (continueOnError) { free(outName); cleanupUserData(&userData); @@ -1153,7 +1241,7 @@ tmain(int argc, XML_Char **argv) { } XML_ParserFree(parser); if (! result) { - exitCode = 2; + exitCode = XMLWF_EXIT_NOT_WELLFORMED; cleanupUserData(&userData); if (! continueOnError) { break; diff --git a/xmlwf/xmlwf_helpgen.py b/xmlwf/xmlwf_helpgen.py index 60a86511..c2a527fd 100755 --- a/xmlwf/xmlwf_helpgen.py +++ b/xmlwf/xmlwf_helpgen.py @@ -6,7 +6,8 @@ # \___/_/\_\ .__/ \__,_|\__| # |_| XML parser # -# Copyright (c) 2019 Expat development team +# Copyright (c) 2019-2021 Sebastian Pipping <sebastian@pipping.org> +# Copyright (c) 2021 Tim Bray <tbray@textuality.com> # Licensed under the MIT license: # # Permission is hereby granted, free of charge, to any person obtaining @@ -42,7 +43,14 @@ xmlwf of libexpat is software libre, licensed under the MIT license. Please report bugs at https://github.com/libexpat/libexpat/issues. Thank you! """ +usage = """ + %(prog)s [OPTIONS] [FILE ...] + %(prog)s -h + %(prog)s -v +""" + parser = argparse.ArgumentParser(prog='xmlwf', add_help=False, + usage=usage, description='xmlwf - Determines if an XML document is well-formed', formatter_class=argparse.RawTextHelpFormatter, epilog=epilog) @@ -65,6 +73,14 @@ output_mode.add_argument('-m', action='store_true', help='write [m]eta XML, not output_mode.add_argument('-t', action='store_true', help='write no XML output for [t]iming of plain parsing') output_related.add_argument('-N', action='store_true', help='enable adding doctype and [n]otation declarations') +billion_laughs = parser.add_argument_group('billion laughs attack protection', + description='NOTE: ' + 'If you ever need to increase these values ' + 'for non-attack payload, please file a bug report.') +billion_laughs.add_argument('-a', metavar='FACTOR', + help='set maximum tolerated [a]mplification factor (default: 100.0)') +billion_laughs.add_argument('-b', metavar='BYTES', help='set number of output [b]ytes needed to activate (default: 8 MiB)') + parser.add_argument('files', metavar='FILE', nargs='*', help='file to process (default: STDIN)') info = parser.add_argument_group('info arguments') diff --git a/xmlwf/xmlwf_helpgen.sh b/xmlwf/xmlwf_helpgen.sh index 6b0fbf92..864e4708 100755 --- a/xmlwf/xmlwf_helpgen.sh +++ b/xmlwf/xmlwf_helpgen.sh @@ -6,7 +6,7 @@ # \___/_/\_\ .__/ \__,_|\__| # |_| XML parser # -# Copyright (c) 2019 Expat development team +# Copyright (c) 2019-2021 Sebastian Pipping <sebastian@pipping.org> # Licensed under the MIT license: # # Permission is hereby granted, free of charge, to any person obtaining @@ -29,7 +29,8 @@ # USE OR OTHER DEALINGS IN THE SOFTWARE. ./xmlwf/xmlwf_helpgen.py | sed \ - -e 's,usage: xmlwf,usage: %s,' \ + -e 's,usage: ,usage:,' \ + -e 's, xmlwf, %s,' \ -e 's, \[-h | -v\],,' \ -e 's,^, T(",' \ -e 's,$,\\n"),' |