aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNigel Tao <nigeltao@golang.org>2015-06-29 16:22:54 +1000
committerNigel Tao <nigeltao@golang.org>2015-06-30 03:47:06 +0000
commitfea18f5a341e442783f84703a78924b882aceb5e (patch)
treeb236701aed693d08f37aa5732083e5470b80b788
parent53eb4783c2b325e1fc3673b780466db468c37ce7 (diff)
downloadgo-fea18f5a341e442783f84703a78924b882aceb5e.tar.gz
go-fea18f5a341e442783f84703a78924b882aceb5e.zip
compress/lzw: return the partial decoding for a truncated input.
This is needed by issue #9856. Change-Id: Idad570a7e55ad903aab55372d390bc746c4e19cf Reviewed-on: https://go-review.googlesource.com/11661 Reviewed-by: Rob Pike <r@golang.org>
-rw-r--r--src/compress/lzw/reader.go2
-rw-r--r--src/compress/lzw/reader_test.go9
2 files changed, 10 insertions, 1 deletions
diff --git a/src/compress/lzw/reader.go b/src/compress/lzw/reader.go
index 28e9f7514f..1353831eca 100644
--- a/src/compress/lzw/reader.go
+++ b/src/compress/lzw/reader.go
@@ -139,6 +139,7 @@ func (d *decoder) decode() {
err = io.ErrUnexpectedEOF
}
d.err = err
+ d.flush()
return
}
switch {
@@ -190,6 +191,7 @@ func (d *decoder) decode() {
}
default:
d.err = errors.New("lzw: invalid code")
+ d.flush()
return
}
d.last, d.hi = code, d.hi+1
diff --git a/src/compress/lzw/reader_test.go b/src/compress/lzw/reader_test.go
index 9006c91c23..c3a5c3a0aa 100644
--- a/src/compress/lzw/reader_test.go
+++ b/src/compress/lzw/reader_test.go
@@ -98,13 +98,20 @@ func TestReader(t *testing.T) {
defer rc.Close()
b.Reset()
n, err := io.Copy(&b, rc)
+ s := b.String()
if err != nil {
if err != tt.err {
t.Errorf("%s: io.Copy: %v want %v", tt.desc, err, tt.err)
}
+ if err == io.ErrUnexpectedEOF {
+ // Even if the input is truncated, we should still return the
+ // partial decoded result.
+ if n == 0 || !strings.HasPrefix(tt.raw, s) {
+ t.Errorf("got %d bytes (%q), want a non-empty prefix of %q", n, s, tt.raw)
+ }
+ }
continue
}
- s := b.String()
if s != tt.raw {
t.Errorf("%s: got %d-byte %q want %d-byte %q", tt.desc, n, s, len(tt.raw), tt.raw)
}