diff --git a/common/session/session.go b/common/session/session.go index c926a883..deb01f8c 100644 --- a/common/session/session.go +++ b/common/session/session.go @@ -4,6 +4,7 @@ package session // import "github.com/xtls/xray-core/common/session" import ( "context" "math/rand" + "sync" c "github.com/xtls/xray-core/common/ctx" "github.com/xtls/xray-core/common/errors" @@ -65,7 +66,7 @@ type Outbound struct { Tag string // Name of the outbound proxy that handles the connection. Name string - // Conn is actually internet.Connection. May be nil. It is currently nil for outbound with proxySettings + // Conn is actually internet.Connection. May be nil. It is currently nil for outbound with proxySettings Conn net.Conn // CanSpliceCopy is a property for this connection // 1 = can, 2 = after processing protocol info should be able to, 3 = cannot @@ -91,6 +92,10 @@ type Content struct { Attributes map[string]string SkipDNSResolve bool + + mu sync.Mutex + + isLocked bool } // Sockopt is the settings for socket connection. @@ -99,8 +104,22 @@ type Sockopt struct { Mark int32 } +// Some how when using mux, there will be a same ctx between different requests +// This will cause problem as it's designed for single request, like concurrent map writes +// Add a Mutex as a temp solution + // SetAttribute attaches additional string attributes to content. func (c *Content) SetAttribute(name string, value string) { + if c.isLocked { + errors.LogError(context.Background(), "Multiple goroutines are tring to access one routing content, tring to write ", name, ":", value) + } + c.mu.Lock() + c.isLocked = true + defer func() { + c.isLocked = false + c.mu.Unlock() + }() + if c.Attributes == nil { c.Attributes = make(map[string]string) }