Skip to content

Commit d53391f

Browse files
committed
fix: validate XML attribute names
1 parent c590147 commit d53391f

File tree

1 file changed

+39
-1
lines changed

1 file changed

+39
-1
lines changed

binxml.go

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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+
181218
func (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

Comments
 (0)