Skip to content

Commit 1ae5435

Browse files
authored
Prevent (caught) panic on login (#11590) (#11597)
Backport #11590 Unfortunately when the virtual session is released it requires that the real session does not exist. This worked fine when sessions were only saved at the end of request/response cycle however, now sessions are saved proactively this does not hold. The result is a caught panic in the logs during every log-in. This panic has no significant side-effects but should not occur. This PR marks the virtual session as released when released and updates it if the same session is released again. Signed-off-by: Andrew Thornton <[email protected]>
1 parent ca61046 commit 1ae5435

File tree

1 file changed

+14
-6
lines changed

1 file changed

+14
-6
lines changed

modules/session/virtual.go

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -107,10 +107,11 @@ func init() {
107107

108108
// VirtualStore represents a virtual session store implementation.
109109
type VirtualStore struct {
110-
p *VirtualSessionProvider
111-
sid string
112-
lock sync.RWMutex
113-
data map[interface{}]interface{}
110+
p *VirtualSessionProvider
111+
sid string
112+
lock sync.RWMutex
113+
data map[interface{}]interface{}
114+
released bool
114115
}
115116

116117
// NewVirtualStore creates and returns a virtual session store.
@@ -164,20 +165,27 @@ func (s *VirtualStore) Release() error {
164165
// Now ensure that we don't exist!
165166
realProvider := s.p.provider
166167

167-
if realProvider.Exist(s.sid) {
168+
if !s.released && realProvider.Exist(s.sid) {
168169
// This is an error!
169170
return fmt.Errorf("new sid '%s' already exists", s.sid)
170171
}
171172
realStore, err := realProvider.Read(s.sid)
172173
if err != nil {
173174
return err
174175
}
176+
if err := realStore.Flush(); err != nil {
177+
return err
178+
}
175179
for key, value := range s.data {
176180
if err := realStore.Set(key, value); err != nil {
177181
return err
178182
}
179183
}
180-
return realStore.Release()
184+
err = realStore.Release()
185+
if err == nil {
186+
s.released = true
187+
}
188+
return err
181189
}
182190
return nil
183191
}

0 commit comments

Comments
 (0)