Summary
The shared promapi.DefaultRoundTripper transport is mutated directly in createAPIConfigWithToken (pkg/toolset/tools/prometheus_client.go) without cloning first. This causes TLS settings to leak across concurrent requests and different toolsets, creating race conditions.
Details
In createAPIConfigWithToken, the code casts promapi.DefaultRoundTripper to *http.Transport and then sets TLSClientConfig on it directly:
defaultRt, ok := promapi.DefaultRoundTripper.(*http.Transport)
// ...
defaultRt.TLSClientConfig = &tls.Config{ ... } // mutates the global shared transport
Fix
Clone the transport before modifying its TLSClientConfig:
defaultRt, ok := promapi.DefaultRoundTripper.(*http.Transport)
if !ok {
return promapi.Config{}, fmt.Errorf(...)
}
+rt := defaultRt.Clone()
if insecure {
- defaultRt.TLSClientConfig = &tls.Config{...}
+ rt.TLSClientConfig = &tls.Config{...}
} else {
- defaultRt.TLSClientConfig = &tls.Config{...}
+ rt.TLSClientConfig = &tls.Config{...}
}
if token != {
apiConfig.RoundTripper = promcfg.NewAuthorizationCredentialsRoundTripper(
- "Bearer", promcfg.NewInlineSecret(token), defaultRt)
+ "Bearer", promcfg.NewInlineSecret(token), rt)
} else {
- apiConfig.RoundTripper = defaultRt
+ apiConfig.RoundTripper = rt
}
References
/cc @andreasgerstmayr
Summary
The shared
promapi.DefaultRoundTrippertransport is mutated directly increateAPIConfigWithToken(pkg/toolset/tools/prometheus_client.go) without cloning first. This causes TLS settings to leak across concurrent requests and different toolsets, creating race conditions.Details
In
createAPIConfigWithToken, the code castspromapi.DefaultRoundTripperto*http.Transportand then setsTLSClientConfigon it directly:Fix
Clone the transport before modifying its
TLSClientConfig:defaultRt, ok := promapi.DefaultRoundTripper.(*http.Transport) if !ok { return promapi.Config{}, fmt.Errorf(...) } +rt := defaultRt.Clone() if insecure { - defaultRt.TLSClientConfig = &tls.Config{...} + rt.TLSClientConfig = &tls.Config{...} } else { - defaultRt.TLSClientConfig = &tls.Config{...} + rt.TLSClientConfig = &tls.Config{...} } if token != { apiConfig.RoundTripper = promcfg.NewAuthorizationCredentialsRoundTripper( - "Bearer", promcfg.NewInlineSecret(token), defaultRt) + "Bearer", promcfg.NewInlineSecret(token), rt) } else { - apiConfig.RoundTripper = defaultRt + apiConfig.RoundTripper = rt }References
/cc @andreasgerstmayr