From: Matt Joiner Date: Mon, 12 Feb 2018 13:44:05 +0000 (+1100) Subject: bencode: Support unmarshalling strings into slices of kind Uint8 X-Git-Tag: v1.0.0~180 X-Git-Url: http://www.git.stargrave.org/?a=commitdiff_plain;h=4b5203851a782bdd7d30d9491b38d26834f9068a;p=btrtrc.git bencode: Support unmarshalling strings into slices of kind Uint8 --- diff --git a/bencode/decode.go b/bencode/decode.go index 074db675..b07ae580 100644 --- a/bencode/decode.go +++ b/bencode/decode.go @@ -171,9 +171,7 @@ func (d *Decoder) parseString(v reflect.Value) error { Type: v.Type(), }) } - sl := make([]byte, len(d.buf.Bytes())) - copy(sl, d.buf.Bytes()) - v.Set(reflect.ValueOf(sl)) + v.SetBytes(append([]byte(nil), d.buf.Bytes()...)) default: return &UnmarshalTypeError{ Value: "string", diff --git a/bencode/decode_test.go b/bencode/decode_test.go index fa5212b9..7366102d 100644 --- a/bencode/decode_test.go +++ b/bencode/decode_test.go @@ -147,3 +147,23 @@ func TestIgnoreUnmarshalTypeError(t *testing.T) { require.Nil(t, Unmarshal([]byte("d6:Ignorei42ee"), &s)) assert.EqualValues(t, 42, s.Ignore) } + +// Test unmarshalling []byte into something that has the same kind but +// different type. +func TestDecodeCustomSlice(t *testing.T) { + type flag byte + var fs3, fs2 []flag + // We do a longer slice then a shorter slice to see if the buffers are + // shared. + d := NewDecoder(bytes.NewBufferString("3:\x01\x10\xff2:\x04\x0f")) + require.NoError(t, d.Decode(&fs3)) + require.NoError(t, d.Decode(&fs2)) + assert.EqualValues(t, []flag{1, 16, 255}, fs3) + assert.EqualValues(t, []flag{4, 15}, fs2) +} + +func TestUnmarshalUnusedBytes(t *testing.T) { + var i int + require.EqualValues(t, ErrUnusedTrailingBytes{1}, Unmarshal([]byte("i42ee"), &i)) + assert.EqualValues(t, 42, i) +}