From 546f5c3e67692e402e1dfdd42316a71fe9f550b3 Mon Sep 17 00:00:00 2001 From: Silvan Jegen Date: Sun, 14 Jun 2015 15:06:54 +0200 Subject: Fix off-by-one error and always check buffer length --- unxml.go | 39 ++++++++++++++++++++++++++++----------- 1 file changed, 28 insertions(+), 11 deletions(-) diff --git a/unxml.go b/unxml.go index 2bdb354..db191c0 100644 --- a/unxml.go +++ b/unxml.go @@ -158,16 +158,17 @@ func (r *ElementReader) Read(out []byte) (int, error) { } text := r.xr.tokenizer.Text() lentext := len(text) - if lentext <= lenout { + if lentext < lenout { + //fmt.Printf("HAD SPACE: %q, count: %d\n", text, r.xr.count) n = copy(out[r.xr.count:], text) r.xr.count += n lenout -= n - //fmt.Printf("HAD SPACE: %q, count: %d, err: %s\n", text, r.xr.count, err) } else { - n = copy(out[r.xr.count:], text[:lenout-1]) + //fmt.Printf("HAD NO SPACE: count: %d, lenout: %d\n", r.xr.count, lenout) + n = copy(out[r.xr.count:], text[:lenout]) r.xr.count += n - r.xr.lastread = text[lenout-1:] - //fmt.Printf("HAD NO SPACE: count: %d, err: %s\n", r.xr.count, err) + lenout -= n + r.xr.lastread = text[lenout:] return r.xr.count, err } @@ -182,9 +183,17 @@ func (r *ElementReader) Read(out []byte) (int, error) { intagtokeep = true raw := r.xr.tokenizer.Raw() //fmt.Printf("TokenRaw: %s\n", raw) - n := copy(out[r.xr.count:], raw) - r.xr.count += n - lenout -= n + if len(raw) < lenout { + n := copy(out[r.xr.count:], raw) + r.xr.count += n + lenout -= n + } else { + n = copy(out[r.xr.count:], raw[:lenout-1]) + r.xr.count += n + lenout -= n + r.xr.lastread = raw[lenout-1:] + return r.xr.count, err + } } case html.EndTagToken: @@ -199,9 +208,17 @@ func (r *ElementReader) Read(out []byte) (int, error) { r.tagsinstack[string(tn)]-- } raw := r.xr.tokenizer.Raw() - n := copy(out[r.xr.count:], raw) - r.xr.count += n - lenout -= n + if len(raw) < lenout { + n := copy(out[r.xr.count:], raw) + r.xr.count += n + lenout -= n + } else { + n = copy(out[r.xr.count:], raw[:lenout-1]) + r.xr.count += n + lenout -= n + r.xr.lastread = raw[lenout-1:] + return r.xr.count, err + } } } } -- cgit v1.2.1-18-gbd029