Skip to content

Commit 0dcb04a

Browse files
Fix context race condition (#344)
`ctx` was being overwritten while it was being used in a different goroutine.
1 parent 11b3bd2 commit 0dcb04a

1 file changed

Lines changed: 12 additions & 9 deletions

File tree

internal/signaling/handler.go

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -161,8 +161,11 @@ func Handler(ctx context.Context, store stores.Store, cloudflare *cloudflare.Cre
161161
util.ErrorAndDisconnect(ctx, conn, err)
162162
}
163163

164+
// Use a local variable for the request-scoped context to avoid
165+
// a data race with the ping goroutine that also reads ctx.
166+
reqCtx := ctx
164167
if base.RequestID != "" {
165-
ctx = util.WithRequestID(ctx, base.RequestID)
168+
reqCtx = util.WithRequestID(reqCtx, base.RequestID)
166169
}
167170

168171
if peer.closedPacketReceived {
@@ -174,24 +177,24 @@ func Handler(ctx context.Context, store stores.Store, cloudflare *cloudflare.Cre
174177

175178
switch base.Type {
176179
case "credentials":
177-
credentials, err := cloudflare.GetCredentials(ctx)
180+
credentials, err := cloudflare.GetCredentials(reqCtx)
178181
if err != nil {
179-
util.ReplyError(ctx, conn, err)
182+
util.ReplyError(reqCtx, conn, err)
180183
} else {
181184
packet := CredentialsPacket{
182185
Type: "credentials",
183186
Credentials: *credentials,
184187
RequestID: base.RequestID,
185188
}
186-
if err := peer.Send(ctx, packet); err != nil {
187-
util.ErrorAndDisconnect(ctx, conn, err)
189+
if err := peer.Send(reqCtx, packet); err != nil {
190+
util.ErrorAndDisconnect(reqCtx, conn, err)
188191
}
189192
}
190193

191194
case "event":
192195
params := metrics.EventParams{}
193196
if err := json.Unmarshal(raw, &params); err != nil {
194-
util.ErrorAndDisconnect(ctx, conn, err)
197+
util.ErrorAndDisconnect(reqCtx, conn, err)
195198
}
196199

197200
// Add country and region to event data of the avg-latency-at-10s event.
@@ -207,17 +210,17 @@ func Handler(ctx context.Context, store stores.Store, cloudflare *cloudflare.Cre
207210
}
208211
}
209212

210-
go metrics.RecordEvent(ctx, params)
213+
go metrics.RecordEvent(reqCtx, params)
211214

212215
case "ping", "pong":
213216
// ignore, ping/pong is just for the tcp keepalive.
214217

215218
default:
216-
if err := peer.HandlePacket(ctx, base.Type, raw); err != nil {
219+
if err := peer.HandlePacket(reqCtx, base.Type, raw); err != nil {
217220
if err == ErrUnknownPacketType {
218221
logger.Warn("unknown packet type received", zap.String("type", base.Type), zap.String("peer", peer.ID), zap.String("game", peer.Game), zap.String("origin", r.Header.Get("Origin")))
219222
} else {
220-
util.ErrorAndDisconnect(ctx, conn, err)
223+
util.ErrorAndDisconnect(reqCtx, conn, err)
221224
}
222225
}
223226
}

0 commit comments

Comments
 (0)