File tree Expand file tree Collapse file tree 2 files changed +21
-6
lines changed Expand file tree Collapse file tree 2 files changed +21
-6
lines changed Original file line number Diff line number Diff line change @@ -42,6 +42,7 @@ func acquireSession() *Session {
42
42
}
43
43
44
44
func releaseSession (s * Session ) {
45
+ s .mu .Lock ()
45
46
s .id = ""
46
47
s .exp = 0
47
48
s .ctx = nil
@@ -52,6 +53,7 @@ func releaseSession(s *Session) {
52
53
if s .byteBuffer != nil {
53
54
s .byteBuffer .Reset ()
54
55
}
56
+ s .mu .Unlock ()
55
57
sessionPool .Put (s )
56
58
}
57
59
@@ -106,8 +108,8 @@ func (s *Session) Destroy() error {
106
108
// Reset local data
107
109
s .data .Reset ()
108
110
109
- s .mu .Lock ()
110
- defer s .mu .Unlock ()
111
+ s .mu .RLock ()
112
+ defer s .mu .RUnlock ()
111
113
112
114
// Use external Storage if exist
113
115
if err := s .config .Storage .Delete (s .id ); err != nil {
@@ -141,16 +143,17 @@ func (s *Session) Reset() error {
141
143
if s .data != nil {
142
144
s .data .Reset ()
143
145
}
146
+
147
+ s .mu .Lock ()
148
+ defer s .mu .Unlock ()
149
+
144
150
// Reset byte buffer
145
151
if s .byteBuffer != nil {
146
152
s .byteBuffer .Reset ()
147
153
}
148
154
// Reset expiration
149
155
s .exp = 0
150
156
151
- s .mu .Lock ()
152
- defer s .mu .Unlock ()
153
-
154
157
// Delete old id from storage
155
158
if err := s .config .Storage .Delete (s .id ); err != nil {
156
159
return err
@@ -172,14 +175,18 @@ func (s *Session) refresh() {
172
175
}
173
176
174
177
// Save will update the storage and client cookie
178
+ //
179
+ // sess.Save() will save the session data to the storage and update the
180
+ // client cookie, and it will release the session after saving.
181
+ //
182
+ // It's not safe to use the session after calling Save().
175
183
func (s * Session ) Save () error {
176
184
// Better safe than sorry
177
185
if s .data == nil {
178
186
return nil
179
187
}
180
188
181
189
s .mu .Lock ()
182
- defer s .mu .Unlock ()
183
190
184
191
// Check if session has your own expiration, otherwise use default value
185
192
if s .exp <= 0 {
@@ -205,6 +212,8 @@ func (s *Session) Save() error {
205
212
return err
206
213
}
207
214
215
+ s .mu .Unlock ()
216
+
208
217
// Release session
209
218
// TODO: It's not safe to use the Session after calling Save()
210
219
releaseSession (s )
Original file line number Diff line number Diff line change @@ -77,13 +77,19 @@ func (s *Store) Get(c fiber.Ctx) (*Session, error) {
77
77
78
78
// Create session object
79
79
sess := acquireSession ()
80
+
81
+ sess .mu .Lock ()
82
+ defer sess .mu .Unlock ()
83
+
80
84
sess .ctx = c
81
85
sess .config = s
82
86
sess .id = id
83
87
sess .fresh = fresh
84
88
85
89
// Decode session data if found
86
90
if rawData != nil {
91
+ sess .data .Lock ()
92
+ defer sess .data .Unlock ()
87
93
if err := sess .decodeSessionData (rawData ); err != nil {
88
94
return nil , fmt .Errorf ("failed to decode session data: %w" , err )
89
95
}
You can’t perform that action at this time.
0 commit comments