Skip to content

Commit fea18f5

Browse files
committed
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 <[email protected]>
1 parent 53eb478 commit fea18f5

File tree

2 files changed

+10
-1
lines changed

2 files changed

+10
-1
lines changed

src/compress/lzw/reader.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,7 @@ func (d *decoder) decode() {
139139
err = io.ErrUnexpectedEOF
140140
}
141141
d.err = err
142+
d.flush()
142143
return
143144
}
144145
switch {
@@ -190,6 +191,7 @@ func (d *decoder) decode() {
190191
}
191192
default:
192193
d.err = errors.New("lzw: invalid code")
194+
d.flush()
193195
return
194196
}
195197
d.last, d.hi = code, d.hi+1

src/compress/lzw/reader_test.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,13 +98,20 @@ func TestReader(t *testing.T) {
9898
defer rc.Close()
9999
b.Reset()
100100
n, err := io.Copy(&b, rc)
101+
s := b.String()
101102
if err != nil {
102103
if err != tt.err {
103104
t.Errorf("%s: io.Copy: %v want %v", tt.desc, err, tt.err)
104105
}
106+
if err == io.ErrUnexpectedEOF {
107+
// Even if the input is truncated, we should still return the
108+
// partial decoded result.
109+
if n == 0 || !strings.HasPrefix(tt.raw, s) {
110+
t.Errorf("got %d bytes (%q), want a non-empty prefix of %q", n, s, tt.raw)
111+
}
112+
}
105113
continue
106114
}
107-
s := b.String()
108115
if s != tt.raw {
109116
t.Errorf("%s: got %d-byte %q want %d-byte %q", tt.desc, n, s, len(tt.raw), tt.raw)
110117
}

0 commit comments

Comments
 (0)