summaryrefslogtreecommitdiff
path: root/unxml.go
diff options
context:
space:
mode:
authorSilvan Jegen <s.jegen@gmail.com>2015-06-14 15:06:54 +0200
committerSilvan Jegen <s.jegen@gmail.com>2015-06-14 15:06:54 +0200
commit546f5c3e67692e402e1dfdd42316a71fe9f550b3 (patch)
tree88c31072454c89e08b18ff6940f7ca9e62fd19ad /unxml.go
parent184819b5888665844defa43324edcea09cab4429 (diff)
Fix off-by-one error and always check buffer length
Diffstat (limited to 'unxml.go')
-rw-r--r--unxml.go39
1 files 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
+ }
}
}
}