@@ -178,6 +178,43 @@ func (x *binxmlParseInfo) parseNsEnd(r *io.LimitedReader) error {
178178 return nil
179179}
180180
181+ func mapDisallowedNameRunes (r rune ) rune {
182+ // https://www.w3.org/TR/REC-xml/#NT-Name
183+ // ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF]
184+ //NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]
185+
186+ switch r {
187+ case ':' | '_' | '-' | '.' | '\u00B7' :
188+ return r
189+ }
190+
191+ if (r >= 'A' && r <= 'Z' ) || (r >= 'a' && r <= 'z' ) || (r >= '0' && r <= '9' ) {
192+ return r
193+ }
194+
195+ if (r >= '\u00C0' && r <= '\u00D6' ) || (r >= '\u00D8' && r <= '\u00F6' ) || (r >= '\u00F8' && r <= '\u02FF' ) {
196+ return r
197+ }
198+
199+ if (r >= '\u0300' && r <= '\u037D' ) || (r >= '\u037F' && r <= '\u1FFF' ) || (r >= '\u200C' && r <= '\u200D' ) {
200+ return r
201+ }
202+
203+ if (r >= '\u203F' && r <= '\u2040' ) || (r >= '\u2070' && r <= '\u218F' ) || (r >= '\u2C00' && r <= '\u2FEF' ) {
204+ return r
205+ }
206+
207+ if (r >= '\u3001' && r <= '\uD7FF' ) || (r >= '\uF900' && r <= '\uFDCF' ) || (r >= '\uFDF0' && r <= '\uFFFD' ) {
208+ return r
209+ }
210+
211+ if r >= '\U00010000' && r <= '\U000EFFFF' {
212+ return r
213+ }
214+
215+ return '_'
216+ }
217+
181218func (x * binxmlParseInfo ) parseTagStart (r * io.LimitedReader ) error {
182219 var namespaceIdx , nameIdx uint32
183220 var attrStart , attrSize , attrCount uint16
@@ -270,7 +307,7 @@ func (x *binxmlParseInfo) parseTagStart(r *io.LimitedReader) error {
270307 }
271308
272309 if attrNameFromStrings != "" {
273- attrName = attrNameFromStrings
310+ attrName = strings . Map ( mapDisallowedNameRunes , attrNameFromStrings )
274311 } else if attrNameSpace == "" {
275312 attrNameSpace = "http://schemas.android.com/apk/res/android"
276313 }
@@ -317,6 +354,7 @@ func (x *binxmlParseInfo) parseTagStart(r *io.LimitedReader) error {
317354 default :
318355 resultAttr .Value = strconv .FormatInt (int64 (int32 (attr .Res .Data )), 10 )
319356 }
357+
320358 tok .Attr = append (tok .Attr , resultAttr )
321359 }
322360
0 commit comments