mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-10-31 18:55:19 +00:00 
			
		
		
		
	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
			
			
This commit is contained in:
		
				
					committed by
					
						 Friendly Automation
						Friendly Automation
					
				
			
			
				
	
			
			
			
						parent
						
							3d390c4df7
						
					
				
				
					commit
					b42dd930f4
				
			
							
								
								
									
										8
									
								
								doc/UPGRADE-staging/manager_amxml_attribute_fix.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								doc/UPGRADE-staging/manager_amxml_attribute_fix.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -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. | ||||
| @@ -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,11 +7653,20 @@ static void xml_copy_escape(struct ast_str **out, const char *src, int mode) | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		if ( (mode & 2) && !isalnum(*src)) { | ||||
| 		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 '<': | ||||
| 			strcpy(dst, "<"); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user