From 134cbebc1f97546dec61707da083255fb213945f Mon Sep 17 00:00:00 2001 From: Sean Bright Date: Mon, 31 Jan 2022 13:52:26 -0500 Subject: [PATCH] manager.c: Generate valid XML if attribute names have leading digits. The XML Manager Event Interface (amxml) now generates attribute names that are compliant with the XML 1.1 specification. Previously, an attribute name that started with a digit would be rendered as-is, even though attribute names must not begin with a digit. We now prefix attribute names that start with a digit with an underscore ('_') to prevent XML validation failures. This is not backwards compatible but my assumption is that compliant XML parsers would already have been complaining about this. ASTERISK-29886 #close Change-Id: Icfaa56a131a082d803e9b7db5093806d455a0523 --- .../manager_amxml_attribute_fix.txt | 8 ++++++++ main/manager.c | 18 ++++++++++++++---- 2 files changed, 22 insertions(+), 4 deletions(-) create mode 100644 doc/UPGRADE-staging/manager_amxml_attribute_fix.txt diff --git a/doc/UPGRADE-staging/manager_amxml_attribute_fix.txt b/doc/UPGRADE-staging/manager_amxml_attribute_fix.txt new file mode 100644 index 0000000000..4b15ee92ec --- /dev/null +++ b/doc/UPGRADE-staging/manager_amxml_attribute_fix.txt @@ -0,0 +1,8 @@ +Subject: AMI + +The XML Manager Event Interface (amxml) now generates attribute names +that are compliant with the XML 1.1 specification. Previously, an +attribute name that started with a digit would be rendered as-is, even +though attribute names must not begin with a digit. We now prefix +attribute names that start with a digit with an underscore ('_') to +prevent XML validation failures. diff --git a/main/manager.c b/main/manager.c index 8307421b2e..129ef38ba1 100644 --- a/main/manager.c +++ b/main/manager.c @@ -7639,6 +7639,7 @@ static void xml_copy_escape(struct ast_str **out, const char *src, int mode) /* store in a local buffer to avoid calling ast_str_append too often */ char buf[256]; char *dst = buf; + const char *save = src; int space = sizeof(buf); /* repeat until done and nothing to flush */ for ( ; *src || dst != buf ; src++) { @@ -7652,10 +7653,19 @@ static void xml_copy_escape(struct ast_str **out, const char *src, int mode) } } - if ( (mode & 2) && !isalnum(*src)) { - *dst++ = '_'; - space--; - continue; + if (mode & 2) { + if (save == src && isdigit(*src)) { + /* The first character of an XML attribute cannot be a digit */ + *dst++ = '_'; + *dst++ = *src; + space -= 2; + continue; + } else if (!isalnum(*src)) { + /* Replace non-alphanumeric with an underscore */ + *dst++ = '_'; + space--; + continue; + } } switch (*src) { case '<':