From edcf8f0c7d88528e7a16fede0406664af174683b Mon Sep 17 00:00:00 2001
From: Waqas Hussain <waqas20@gmail.com>
Date: Sat, 5 Mar 2016 17:51:35 -0500
Subject: util.xml: Correct stanza.namespaces table construction when duplicate
 prefix names are encountered in the element tree.

---
 util/xml.lua | 16 +++++++++++-----
 1 file changed, 11 insertions(+), 5 deletions(-)

diff --git a/util/xml.lua b/util/xml.lua
index 9e12f0df..ec06fb01 100644
--- a/util/xml.lua
+++ b/util/xml.lua
@@ -1,6 +1,8 @@
 
 local st = require "util.stanza";
 local lxp = require "lxp";
+local t_insert = table.insert;
+local t_remove = table.remove;
 
 local _ENV = nil;
 
@@ -14,15 +16,19 @@ local parse_xml = (function()
 		--luacheck: ignore 212/self
 		local handler = {};
 		local stanza = st.stanza("root");
-		local namespaces = {}
+		local namespaces = {};
+		local prefixes = {};
 		function handler:StartNamespaceDecl(prefix, url)
 			if prefix ~= nil then
-				namespaces[prefix] = url
+				t_insert(namespaces, url);
+				t_insert(prefixes, prefix);
 			end
 		end
 		function handler:EndNamespaceDecl(prefix)
 			if prefix ~= nil then
-				namespaces[prefix] = nil
+				-- we depend on each StartNamespaceDecl having a paired EndNamespaceDecl
+				t_remove(namespaces);
+				t_remove(prefixes);
 			end
 		end
 		function handler:StartElement(tagname, attr)
@@ -46,8 +52,8 @@ local parse_xml = (function()
 				end
 			end
 			local n = {}
-			for prefix, url in pairs(namespaces) do
-				n[prefix] = url
+			for i=1,#namespaces do
+				n[prefixes[i]] = namespaces[i];
 			end
 			stanza:tag(name, attr, n);
 		end
-- 
cgit v1.2.3