Browse Source

fix concurrent access crash for handler creator

Shelikhoo 4 years ago
parent
commit
e2d526cd8b
1 changed files with 10 additions and 0 deletions
  1. 10 0
      app/log/log_creator.go

+ 10 - 0
app/log/log_creator.go

@@ -3,6 +3,8 @@
 package log
 
 import (
+	"sync"
+
 	"github.com/v2fly/v2ray-core/v4/common"
 	"github.com/v2fly/v2ray-core/v4/common/log"
 )
@@ -15,16 +17,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)