Commit 49e6db1c authored by Marcel van Lohuizen's avatar Marcel van Lohuizen Committed by Brad Fitzpatrick

idna: bug fix imported from x/text

See CL 73730: avoid memory leak in validation codes
Upstream at 8253218a.

Change-Id: I3d4860989c8e057f9cc4c9087a78c9c800c5aa7d
Reviewed-on: https://go-review.googlesource.com/74954Reviewed-by: 's avatarBrad Fitzpatrick <bradfitz@golang.org>
parent ea0da6f3
...@@ -309,7 +309,7 @@ func (p *Profile) process(s string, toASCII bool) (string, error) { ...@@ -309,7 +309,7 @@ func (p *Profile) process(s string, toASCII bool) (string, error) {
for ; len(s) > 0 && s[0] == '.'; s = s[1:] { for ; len(s) > 0 && s[0] == '.'; s = s[1:] {
} }
} }
// TODO: allow for a quick check the tables data. // TODO: allow for a quick check of the tables data.
// It seems like we should only create this error on ToASCII, but the // It seems like we should only create this error on ToASCII, but the
// UTS 46 conformance tests suggests we should always check this. // UTS 46 conformance tests suggests we should always check this.
if err == nil && p.verifyDNSLength && s == "" { if err == nil && p.verifyDNSLength && s == "" {
...@@ -405,6 +405,9 @@ func validateRegistration(p *Profile, s string) (idem string, bidi bool, err err ...@@ -405,6 +405,9 @@ func validateRegistration(p *Profile, s string) (idem string, bidi bool, err err
} }
for i := 0; i < len(s); { for i := 0; i < len(s); {
v, sz := trie.lookupString(s[i:]) v, sz := trie.lookupString(s[i:])
if sz == 0 {
return s, bidi, runeError(utf8.RuneError)
}
bidi = bidi || info(v).isBidi(s[i:]) bidi = bidi || info(v).isBidi(s[i:])
// Copy bytes not copied so far. // Copy bytes not copied so far.
switch p.simplify(info(v).category()) { switch p.simplify(info(v).category()) {
...@@ -446,6 +449,15 @@ func validateAndMap(p *Profile, s string) (vm string, bidi bool, err error) { ...@@ -446,6 +449,15 @@ func validateAndMap(p *Profile, s string) (vm string, bidi bool, err error) {
var combinedInfoBits info var combinedInfoBits info
for i := 0; i < len(s); { for i := 0; i < len(s); {
v, sz := trie.lookupString(s[i:]) v, sz := trie.lookupString(s[i:])
if sz == 0 {
b = append(b, s[k:i]...)
b = append(b, "\ufffd"...)
k = len(s)
if err == nil {
err = runeError(utf8.RuneError)
}
break
}
combinedInfoBits |= info(v) combinedInfoBits |= info(v)
bidi = bidi || info(v).isBidi(s[i:]) bidi = bidi || info(v).isBidi(s[i:])
start := i start := i
...@@ -584,6 +596,9 @@ func validateFromPunycode(p *Profile, s string) error { ...@@ -584,6 +596,9 @@ func validateFromPunycode(p *Profile, s string) error {
// loop. // loop.
for i := 0; i < len(s); { for i := 0; i < len(s); {
v, sz := trie.lookupString(s[i:]) v, sz := trie.lookupString(s[i:])
if sz == 0 {
return runeError(utf8.RuneError)
}
if c := p.simplify(info(v).category()); c != valid && c != deviation { if c := p.simplify(info(v).category()); c != valid && c != deviation {
return &labelError{s, "V6"} return &labelError{s, "V6"}
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment