From 7abeefd2b1a03932891e581f1f90656ffebebce4 Mon Sep 17 00:00:00 2001 From: Dominik Honnef Date: Fri, 12 Jan 2024 20:46:14 +0100 Subject: [PATCH] internal/trace/v2: reject events for goroutines with unknown states Change-Id: Ifc472ed4cf0433d06f43559930ac80df23656a6e Reviewed-on: https://go-review.googlesource.com/c/go/+/555496 LUCI-TryBot-Result: Go LUCI Reviewed-by: Michael Knyszek Reviewed-by: Dmitri Shuralyov --- src/internal/trace/v2/order.go | 24 +++++++++++++++---- .../testdata/fuzz/FuzzReader/4d9ddc909984e871 | 2 ++ .../testdata/fuzz/FuzzReader/9d6ee7d3ddf8d566 | 2 ++ 3 files changed, 24 insertions(+), 4 deletions(-) create mode 100644 src/internal/trace/v2/testdata/fuzz/FuzzReader/4d9ddc909984e871 create mode 100644 src/internal/trace/v2/testdata/fuzz/FuzzReader/9d6ee7d3ddf8d566 diff --git a/src/internal/trace/v2/order.go b/src/internal/trace/v2/order.go index 2cc7f26d29..24da41a35e 100644 --- a/src/internal/trace/v2/order.go +++ b/src/internal/trace/v2/order.go @@ -649,7 +649,11 @@ func (o *ordering) advance(ev *baseEvent, evt *evTable, m ThreadID, gen uint64) if !ok { return curCtx, false, fmt.Errorf("invalid string ID %v for %v event", nameID, typ) } - if err := o.gStates[curCtx.G].beginRegion(userRegion{tid, name}); err != nil { + gState, ok := o.gStates[curCtx.G] + if !ok { + return curCtx, false, fmt.Errorf("encountered EvUserRegionBegin without known state for current goroutine %d", curCtx.G) + } + if err := gState.beginRegion(userRegion{tid, name}); err != nil { return curCtx, false, err } return curCtx, true, nil @@ -663,7 +667,11 @@ func (o *ordering) advance(ev *baseEvent, evt *evTable, m ThreadID, gen uint64) if !ok { return curCtx, false, fmt.Errorf("invalid string ID %v for %v event", nameID, typ) } - if err := o.gStates[curCtx.G].endRegion(userRegion{tid, name}); err != nil { + gState, ok := o.gStates[curCtx.G] + if !ok { + return curCtx, false, fmt.Errorf("encountered EvUserRegionEnd without known state for current goroutine %d", curCtx.G) + } + if err := gState.endRegion(userRegion{tid, name}); err != nil { return curCtx, false, err } return curCtx, true, nil @@ -792,7 +800,11 @@ func (o *ordering) advance(ev *baseEvent, evt *evTable, m ThreadID, gen uint64) if typ == go122.EvSTWBegin { desc = stringID(ev.args[0]) } - if err := o.gStates[curCtx.G].beginRange(makeRangeType(typ, desc)); err != nil { + gState, ok := o.gStates[curCtx.G] + if !ok { + return curCtx, false, fmt.Errorf("encountered event of type %d without known state for current goroutine %d", typ, curCtx.G) + } + if err := gState.beginRange(makeRangeType(typ, desc)); err != nil { return curCtx, false, err } return curCtx, true, nil @@ -813,7 +825,11 @@ func (o *ordering) advance(ev *baseEvent, evt *evTable, m ThreadID, gen uint64) if err := validateCtx(curCtx, event.UserGoReqs); err != nil { return curCtx, false, err } - desc, err := o.gStates[curCtx.G].endRange(typ) + gState, ok := o.gStates[curCtx.G] + if !ok { + return curCtx, false, fmt.Errorf("encountered event of type %d without known state for current goroutine %d", typ, curCtx.G) + } + desc, err := gState.endRange(typ) if err != nil { return curCtx, false, err } diff --git a/src/internal/trace/v2/testdata/fuzz/FuzzReader/4d9ddc909984e871 b/src/internal/trace/v2/testdata/fuzz/FuzzReader/4d9ddc909984e871 new file mode 100644 index 0000000000..040b2a4cae --- /dev/null +++ b/src/internal/trace/v2/testdata/fuzz/FuzzReader/4d9ddc909984e871 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go 1.22 trace\x00\x00\x00\x01\x0100\x11\r\xa700\x01\x19000\x02$000000\x01\x0100\x05\b0000\x01\x0110\x11\r\xa700\x01\x19 00\x02\x110 0000") diff --git a/src/internal/trace/v2/testdata/fuzz/FuzzReader/9d6ee7d3ddf8d566 b/src/internal/trace/v2/testdata/fuzz/FuzzReader/9d6ee7d3ddf8d566 new file mode 100644 index 0000000000..5677261155 --- /dev/null +++ b/src/internal/trace/v2/testdata/fuzz/FuzzReader/9d6ee7d3ddf8d566 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go 1.22 trace\x00\x00\x00\x01\x0100\x11\r\xa700\x01\x19000\x02#000000\x01\x0100\x05\b0000\x01\x0110\x11\r\xa700\x01\x19 00\x02\x110 0000") -- 2.48.1