Преглед изворни кода

Retain lock when invoking LogRawFieldsWithTimestamp

- Block any concurrent writes to variables referenced
  by logFields.

- We observed one panic,
  "reflect: call of reflect.Value.IsNil on zero Value",
  when calling json.Marshal on logFields within
  LogRawFieldsWithTimestamp/logTunnel, which may be due
  to concurrent map access.
Rod Hynes пре 4 година
родитељ
комит
10e951c6ef
1 измењених фајлова са 4 додато и 5 уклоњено
  1. 4 5
      psiphon/server/tunnelServer.go

+ 4 - 5
psiphon/server/tunnelServer.go

@@ -2645,12 +2645,11 @@ func (sshClient *sshClient) logTunnel(additionalMetrics []LogFields) {
 		}
 		}
 	}
 	}
 
 
-	sshClient.Unlock()
-
-	// Note: unlock before use is only safe as long as referenced sshClient data,
-	// such as slices in handshakeState, is read-only after initially set.
-
+	// Retain lock when invoking LogRawFieldsWithTimestamp to block any
+	// concurrent writes to variables referenced by logFields.
 	log.LogRawFieldsWithTimestamp(logFields)
 	log.LogRawFieldsWithTimestamp(logFields)
+
+	sshClient.Unlock()
 }
 }
 
 
 var blocklistHitsStatParams = []requestParamSpec{
 var blocklistHitsStatParams = []requestParamSpec{