Browse Source

fix concurrent access crash for handler creator (#772)

Co-authored-by: Shelikhoo <[email protected]>
yuhan6665 4 năm trước cách đây
mục cha
commit
76a3f24169
1 tập tin đã thay đổi với 10 bổ sung0 xóa
  1. 10 0
      app/log/log_creator.go

+ 10 - 0
app/log/log_creator.go

@@ -1,6 +1,8 @@
 package log
 
 import (
+	"sync"
+	
 	"github.com/xtls/xray-core/common"
 	"github.com/xtls/xray-core/common/log"
 )
@@ -13,16 +15,24 @@ type HandlerCreator func(LogType, HandlerCreatorOptions) (log.Handler, error)
 
 var handlerCreatorMap = make(map[LogType]HandlerCreator)
 
+var handlerCreatorMapLock = &sync.RWMutex{}
+
 func RegisterHandlerCreator(logType LogType, f HandlerCreator) error {
 	if f == nil {
 		return newError("nil HandlerCreator")
 	}
 
+	handlerCreatorMapLock.Lock()
+	defer handlerCreatorMapLock.Unlock()
+
 	handlerCreatorMap[logType] = f
 	return nil
 }
 
 func createHandler(logType LogType, options HandlerCreatorOptions) (log.Handler, error) {
+	handlerCreatorMapLock.RLock()
+	defer handlerCreatorMapLock.RUnlock()
+
 	creator, found := handlerCreatorMap[logType]
 	if !found {
 		return nil, newError("unable to create log handler for ", logType)