Browse Source

Fix: Apply mutex when visiting Attributes as well (#3921)

https://github.com/XTLS/Xray-core/pull/3921#issuecomment-2445689462
风扇滑翔翼 1 năm trước cách đây
mục cha
commit
9f8bb47633
2 tập tin đã thay đổi với 17 bổ sung1 xóa
  1. 1 1
      common/protocol/http/sniff.go
  2. 16 0
      common/session/session.go

+ 1 - 1
common/protocol/http/sniff.go

@@ -63,7 +63,7 @@ func SniffHTTP(b []byte, c context.Context) (*SniffHeader, error) {
 	ShouldSniffAttr := true
 	// If content.Attributes have information, that means it comes from HTTP inbound PlainHTTP mode.
 	// It will set attributes, so skip it.
-	if content == nil || len(content.Attributes) != 0 {
+	if content == nil || content.AttributeLen() != 0 {
 		ShouldSniffAttr = false
 	}
 	if err := beginWithHTTPMethod(b); err != nil {

+ 16 - 0
common/session/session.go

@@ -128,8 +128,24 @@ func (c *Content) SetAttribute(name string, value string) {
 
 // Attribute retrieves additional string attributes from content.
 func (c *Content) Attribute(name string) string {
+	c.mu.Lock()
+	c.isLocked = true
+	defer func() {
+		c.isLocked = false
+		c.mu.Unlock()
+	}()
 	if c.Attributes == nil {
 		return ""
 	}
 	return c.Attributes[name]
 }
+
+func (c *Content) AttributeLen() int {
+	c.mu.Lock()
+	c.isLocked = true
+	defer func() {
+		c.isLocked = false
+		c.mu.Unlock()
+	}()
+	return len(c.Attributes)
+}