From 8b51e75241e5f6e1707e9985f31ec9f1462fc643 Mon Sep 17 00:00:00 2001 From: Yi Duan Date: Thu, 28 Jul 2022 17:18:53 +0800 Subject: [PATCH] fix:(encoder) insufficient buffer size check for `OP_i32` (#269) --- encoder/assembler_amd64_go116.go | 4 +-- encoder/assembler_amd64_go117.go | 4 +-- encoder/assembler_test.go | 42 +++++++++++++++++++++++--------- 3 files changed, 35 insertions(+), 15 deletions(-) diff --git a/encoder/assembler_amd64_go116.go b/encoder/assembler_amd64_go116.go index 803796f..c7a9679 100644 --- a/encoder/assembler_amd64_go116.go +++ b/encoder/assembler_amd64_go116.go @@ -819,7 +819,7 @@ func (self *_Assembler) _asm_OP_i16(_ *_Instr) { } func (self *_Assembler) _asm_OP_i32(_ *_Instr) { - self.store_int(11, _F_i64toa, "MOVLQSX") + self.store_int(17, _F_i64toa, "MOVLQSX") } func (self *_Assembler) _asm_OP_i64(_ *_Instr) { @@ -835,7 +835,7 @@ func (self *_Assembler) _asm_OP_u16(_ *_Instr) { } func (self *_Assembler) _asm_OP_u32(_ *_Instr) { - self.store_int(10, _F_u64toa, "MOVLQZX") + self.store_int(16, _F_u64toa, "MOVLQZX") } func (self *_Assembler) _asm_OP_u64(_ *_Instr) { diff --git a/encoder/assembler_amd64_go117.go b/encoder/assembler_amd64_go117.go index 1677927..74d3653 100644 --- a/encoder/assembler_amd64_go117.go +++ b/encoder/assembler_amd64_go117.go @@ -832,7 +832,7 @@ func (self *_Assembler) _asm_OP_i16(_ *_Instr) { } func (self *_Assembler) _asm_OP_i32(_ *_Instr) { - self.store_int(11, _F_i64toa, "MOVLQSX") + self.store_int(17, _F_i64toa, "MOVLQSX") } func (self *_Assembler) _asm_OP_i64(_ *_Instr) { @@ -848,7 +848,7 @@ func (self *_Assembler) _asm_OP_u16(_ *_Instr) { } func (self *_Assembler) _asm_OP_u32(_ *_Instr) { - self.store_int(10, _F_u64toa, "MOVLQZX") + self.store_int(16, _F_u64toa, "MOVLQZX") } func (self *_Assembler) _asm_OP_u64(_ *_Instr) { diff --git a/encoder/assembler_test.go b/encoder/assembler_test.go index eb9952b..772f0ff 100644 --- a/encoder/assembler_test.go +++ b/encoder/assembler_test.go @@ -17,20 +17,40 @@ package encoder import ( - "encoding/hex" - "encoding/json" - "math" - "reflect" - "runtime" - "strings" - "testing" - "unsafe" + `encoding/hex` + `encoding/json` + `math` + `reflect` + `runtime` + `strings` + `testing` + `unsafe` - "github.com/bytedance/sonic/internal/rt" - "github.com/davecgh/go-spew/spew" - "github.com/stretchr/testify/assert" + `github.com/bytedance/sonic/internal/rt` + `github.com/davecgh/go-spew/spew` + `github.com/stretchr/testify/assert` ) +func TestEncoderMemoryCorruption(t *testing.T) { + println("TestEncoderMemoryCorruption") + var m = map[string]interface{}{ + "1": map[string]interface{} { + `"`+strings.Repeat("a", _MaxBuffer - 38)+`"`: "b", + "1": map[string]int32{ + "b": 1658219785, + }, + }, + } + out, err := Encode(m, SortMapKeys) + if err != nil { + t.Fatal(err) + } + println(len(out)) + if err := json.Unmarshal(out, &m); err != nil { + t.Fatal(err) + } +} + func TestAssembler_CompileAndLoad(t *testing.T) { p, err := newCompiler().compile(reflect.TypeOf((*bool)(nil))) assert.Nil(t, err)