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
--- /dev/null
+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.
/* 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++) {
}
}
- 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 '<':