@@ -616,24 +616,26 @@ func (s *Shield) WithScanners(names ...string) *Shield {
616616 return s
617617 }
618618
619- s .mu .Lock ()
620- defer s .mu .Unlock ()
619+ s .mu .RLock ()
620+ baseCfg := s .baseCfg
621+ registry := cloneScannerRegistry (s .scannerRegistry )
622+ s .mu .RUnlock ()
621623
622624 selected := make ([]Scanner , 0 , len (names ))
623625 for _ , name := range names {
624626 key := strings .ToLower (strings .TrimSpace (name ))
625627 if key == "" {
626628 continue
627629 }
628- scanner , ok := s . scannerRegistry [key ]
630+ scanner , ok := registry [key ]
629631 if ! ok || scanner == nil {
630632 continue
631633 }
632634 selected = append (selected , scanner )
633635 }
634636
635- baseExtras := append ([]Scanner (nil ), s . baseCfg .ExtraScanners ... )
636- cfg := s . baseCfg
637+ baseExtras := append ([]Scanner (nil ), baseCfg .ExtraScanners ... )
638+ cfg := baseCfg
637639 cfg .ExtraScanners = mergeScannersByName (baseExtras , selected )
638640
639641 resolvedCfg , err := engine .ResolveConfig (toEngineCfg (cfg ))
@@ -644,8 +646,11 @@ func (s *Shield) WithScanners(names ...string) *Shield {
644646 return s
645647 }
646648
647- s .engine = engine .New (resolvedCfg )
648- return s
649+ return & Shield {
650+ engine : engine .New (resolvedCfg ),
651+ baseCfg : cfg ,
652+ scannerRegistry : registry ,
653+ }
649654}
650655
651656// --- Functions ---
@@ -687,7 +692,11 @@ func Helpers() ScanHelpers { return ScanHelpers{} }
687692func (h ScanHelpers ) ContainsAny (text string , phrases []string ) bool {
688693 lower := strings .ToLower (text )
689694 for _ , phrase := range phrases {
690- if strings .Contains (lower , strings .ToLower (strings .TrimSpace (phrase ))) {
695+ trimmed := strings .ToLower (strings .TrimSpace (phrase ))
696+ if trimmed == "" {
697+ continue
698+ }
699+ if strings .Contains (lower , trimmed ) {
691700 return true
692701 }
693702 }
@@ -808,6 +817,17 @@ func snapshotGlobalScannerRegistry() map[string]Scanner {
808817 return out
809818}
810819
820+ func cloneScannerRegistry (in map [string ]Scanner ) map [string ]Scanner {
821+ if len (in ) == 0 {
822+ return map [string ]Scanner {}
823+ }
824+ out := make (map [string ]Scanner , len (in ))
825+ for k , v := range in {
826+ out [k ] = v
827+ }
828+ return out
829+ }
830+
811831func mergeScannersByName (base []Scanner , extras []Scanner ) []Scanner {
812832 out := make ([]Scanner , 0 , len (base )+ len (extras ))
813833 seen := make (map [string ]struct {}, len (base )+ len (extras ))
@@ -911,12 +931,12 @@ func (a *engineScannerAdapter) Scan(ctx engine.ExternalScanContext) engine.Exter
911931 }
912932
913933 publicResult := a .scanner .Scan (publicCtx )
914- metadata := make ( map [string ]string , len ( publicResult . Metadata ))
915- for k , v := range publicResult .Metadata {
916- metadata [ k ] = v
917- }
918- if len ( metadata ) == 0 {
919- metadata = nil
934+ var metadata map [string ]string
935+ if len ( publicResult .Metadata ) > 0 {
936+ metadata = make ( map [ string ] string , len ( publicResult . Metadata ))
937+ for k , v := range publicResult . Metadata {
938+ metadata [ k ] = v
939+ }
920940 }
921941
922942 return engine.ExternalScanResult {
0 commit comments