diff options
| author | Silvan Jegen <s.jegen@gmail.com> | 2015-06-14 15:06:54 +0200 | 
|---|---|---|
| committer | Silvan Jegen <s.jegen@gmail.com> | 2015-06-14 15:06:54 +0200 | 
| commit | 546f5c3e67692e402e1dfdd42316a71fe9f550b3 (patch) | |
| tree | 88c31072454c89e08b18ff6940f7ca9e62fd19ad | |
| parent | 184819b5888665844defa43324edcea09cab4429 (diff) | |
Fix off-by-one error and always check buffer length
| -rw-r--r-- | unxml.go | 39 | 
1 files changed, 28 insertions, 11 deletions
@@ -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 +				}  			}  		}  	}  | 
