oauth2-proxy / mockoidc

A Mock OIDC Server for Unit & Integration Tests
MIT License
58 stars 38 forks source link

Add locks around session store map #44

Open brad-defined opened 1 year ago

brad-defined commented 1 year ago

I encountered a data race when running parallelized tests with this library. The stack demonstrated a race between NewSession() performing a write operation on a map and GetSessionByID() performing a racing read operation on the same map.

This PR inserts a mutex around map access to solve this data race.

==================
WARNING: DATA RACE
Write at 0x00c00032aea0 by goroutine 22758:
  runtime.mapassign_faststr()
      /opt/hostedtoolcache/go/1.20.3/x64/src/runtime/map_faststr.go:203 +0x0
  github.com/oauth2-proxy/mockoidc.(*SessionStore).NewSession()
      /home/runner/go/pkg/mod/github.com/oauth2-proxy/mockoidc@v0.0.0-20220308204021-b9169deeb282/session.go:58 +0x332
  github.com/oauth2-proxy/mockoidc.(*MockOIDC).Authorize()
      /home/runner/go/pkg/mod/github.com/oauth2-proxy/mockoidc@v0.0.0-20220308204021-b9169deeb282/handlers.go:105 +0x63a
  github.com/oauth2-proxy/mockoidc.(*MockOIDC).Authorize-fm()
      <autogenerated>:1 +0x57
  net/http.HandlerFunc.ServeHTTP()
      /opt/hostedtoolcache/go/1.20.3/x64/src/net/http/server.go:2122 +0x4d
  github.com/oauth2-proxy/mockoidc.(*MockOIDC).forceError.func1()
      /home/runner/go/pkg/mod/github.com/oauth2-proxy/mockoidc@v0.0.0-20220308204021-b9169deeb282/mockoidc.go:285 +0x13c
  net/http.HandlerFunc.ServeHTTP()
      /opt/hostedtoolcache/go/1.20.3/x64/src/net/http/server.go:2122 +0x4d
  net/http.(*ServeMux).ServeHTTP()
      /opt/hostedtoolcache/go/1.20.3/x64/src/net/http/server.go:2500 +0xc5
  net/http.serverHandler.ServeHTTP()
      /opt/hostedtoolcache/go/1.20.3/x64/src/net/http/server.go:2936 +0x682
  net/http.(*conn).serve()
      /opt/hostedtoolcache/go/1.20.3/x64/src/net/http/server.go:1995 +0xbd4
  net/http.(*Server).Serve.func3()
      /opt/hostedtoolcache/go/1.20.3/x64/src/net/http/server.go:3089 +0x58

Previous read at 0x00c00032aea0 by goroutine 22762:
  runtime.mapaccess2_faststr()
      /opt/hostedtoolcache/go/1.20.3/x64/src/runtime/map_faststr.go:108 +0x0
  github.com/oauth2-proxy/mockoidc.(*SessionStore).GetSessionByID()
      /home/runner/go/pkg/mod/github.com/oauth2-proxy/mockoidc@v0.0.0-20220308204021-b9169deeb282/session.go:65 +0x1f0
  github.com/oauth2-proxy/mockoidc.(*MockOIDC).validateCodeGrant()
      /home/runner/go/pkg/mod/github.com/oauth2-proxy/mockoidc@v0.0.0-20220308204021-b9169deeb282/handlers.go:230 +0x19f
  github.com/oauth2-proxy/mockoidc.(*MockOIDC).Token()
      /home/runner/go/pkg/mod/github.com/oauth2-proxy/mockoidc@v0.0.0-20220308204021-b9169deeb282/handlers.go:163 +0x285
  github.com/oauth2-proxy/mockoidc.(*MockOIDC).Token-fm()
      <autogenerated>:1 +0x57
  net/http.HandlerFunc.ServeHTTP()
      /opt/hostedtoolcache/go/1.20.3/x64/src/net/http/server.go:2122 +0x4d
  github.com/oauth2-proxy/mockoidc.(*MockOIDC).forceError.func1()
      /home/runner/go/pkg/mod/github.com/oauth2-proxy/mockoidc@v0.0.0-20220308204021-b9169deeb282/mockoidc.go:285 +0x13c
  net/http.HandlerFunc.ServeHTTP()
      /opt/hostedtoolcache/go/1.20.3/x64/src/net/http/server.go:2122 +0x4d
  net/http.(*ServeMux).ServeHTTP()
      /opt/hostedtoolcache/go/1.20.3/x64/src/net/http/server.go:2500 +0xc5
  net/http.serverHandler.ServeHTTP()
      /opt/hostedtoolcache/go/1.20.3/x64/src/net/http/server.go:2936 +0x682
  net/http.(*conn).serve()
      /opt/hostedtoolcache/go/1.20.3/x64/src/net/http/server.go:1995 +0xbd4
  net/http.(*Server).Serve.func3()
      /opt/hostedtoolcache/go/1.20.3/x64/src/net/http/server.go:3089 +0x58

Goroutine 22758 (running) created at:
  net/http.(*Server).Serve()
      /opt/hostedtoolcache/go/1.20.3/x64/src/net/http/server.go:3089 +0x817
  github.com/oauth2-proxy/mockoidc.(*MockOIDC).Start.func1()
      /home/runner/go/pkg/mod/github.com/oauth2-proxy/mockoidc@v0.0.0-20220308204021-b9169deeb282/mockoidc.go:129 +0x67

Goroutine 22762 (running) created at:
  net/http.(*Server).Serve()
      /opt/hostedtoolcache/go/1.20.3/x64/src/net/http/server.go:3089 +0x817
  github.com/oauth2-proxy/mockoidc.(*MockOIDC).Start.func1()
      /home/runner/go/pkg/mod/github.com/oauth2-proxy/mockoidc@v0.0.0-20220308204021-b9169deeb282/mockoidc.go:129 +0x67
==================