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 <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Michael Knyszek <mknyszek@google.com>
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
This commit is contained in:
Dominik Honnef 2024-01-12 20:46:14 +01:00
parent e58e813950
commit 7abeefd2b1
3 changed files with 24 additions and 4 deletions

View File

@ -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
}

View File

@ -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")

View File

@ -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")