mirror of
https://github.com/pgsty/minio.git
synced 2026-10-17 15:16:00 +03:00
fix: reset Signature when unmarshaling legacy V1 xl.meta headers
The V1 header wire format has no Signature field, so decoding into a reused header leaked the previous object's signature. Reset it along with EcN/EcM so a decode fully replaces the header contents. Signed-off-by: Julien Laurenceau <julien.laurenceau@pepitedata.com>
This commit is contained in:
@@ -40,6 +40,9 @@ func (x *xlMetaV2VersionHeader) unmarshalV(v uint8, bts []byte) (o []byte, err e
|
|||||||
|
|
||||||
// unmarshalV1 decodes version 1, never released.
|
// unmarshalV1 decodes version 1, never released.
|
||||||
func (x *xlMetaV2VersionHeader) unmarshalV1(bts []byte) (o []byte, err error) {
|
func (x *xlMetaV2VersionHeader) unmarshalV1(bts []byte) (o []byte, err error) {
|
||||||
|
// Fields absent from the V1 wire format must be reset since the
|
||||||
|
// header may be reused across decodes.
|
||||||
|
x.Signature = [4]byte{}
|
||||||
x.EcN, x.EcM = 0, 0
|
x.EcN, x.EcM = 0, 0
|
||||||
var zb0001 uint32
|
var zb0001 uint32
|
||||||
zb0001, bts, err = msgp.ReadArrayHeaderBytes(bts)
|
zb0001, bts, err = msgp.ReadArrayHeaderBytes(bts)
|
||||||
|
|||||||
@@ -1234,12 +1234,16 @@ func TestXLMetaV2HeaderLegacyUnmarshalResetsEc(t *testing.T) {
|
|||||||
|
|
||||||
header = base
|
header = base
|
||||||
header.EcN, header.EcM = 4, 8
|
header.EcN, header.EcM = 4, 8
|
||||||
|
header.Signature = [4]byte{9, 9, 9, 9}
|
||||||
if _, err := header.unmarshalV1(v1); err != nil {
|
if _, err := header.unmarshalV1(v1); err != nil {
|
||||||
t.Fatalf("legacy V1 header unmarshal failed: %v", err)
|
t.Fatalf("legacy V1 header unmarshal failed: %v", err)
|
||||||
}
|
}
|
||||||
if header.EcN != 0 || header.EcM != 0 {
|
if header.EcN != 0 || header.EcM != 0 {
|
||||||
t.Fatalf("stale erasure metadata leaked on V1 decode: EcN %d, EcM %d", header.EcN, header.EcM)
|
t.Fatalf("stale erasure metadata leaked on V1 decode: EcN %d, EcM %d", header.EcN, header.EcM)
|
||||||
}
|
}
|
||||||
|
if header.Signature != ([4]byte{}) {
|
||||||
|
t.Fatalf("stale signature leaked on V1 decode: %v", header.Signature)
|
||||||
|
}
|
||||||
|
|
||||||
// Current headers must keep their erasure metadata.
|
// Current headers must keep their erasure metadata.
|
||||||
current := base
|
current := base
|
||||||
|
|||||||
Reference in New Issue
Block a user