Skip to content

Commit ac3f0a2

Browse files
Zirakdougwilson
authored andcommitted
Fix internal method wrapping error on failed reloads
closes #715
1 parent 909d9e0 commit ac3f0a2

File tree

3 files changed

+59
-4
lines changed

3 files changed

+59
-4
lines changed

HISTORY.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
unreleased
2+
==========
3+
4+
* Fix internal method wrapping error on failed reloads
5+
16
1.17.0 / 2019-10-10
27
===================
38

index.js

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -376,17 +376,24 @@ function session(options) {
376376
wrapmethods(req.session)
377377
}
378378

379+
function rewrapmethods (sess, callback) {
380+
return function () {
381+
if (req.session !== sess) {
382+
wrapmethods(req.session)
383+
}
384+
385+
callback.apply(this, arguments)
386+
}
387+
}
388+
379389
// wrap session methods
380390
function wrapmethods(sess) {
381391
var _reload = sess.reload
382392
var _save = sess.save;
383393

384394
function reload(callback) {
385395
debug('reloading %s', this.id)
386-
_reload.call(this, function () {
387-
wrapmethods(req.session)
388-
callback.apply(this, arguments)
389-
})
396+
_reload.call(this, rewrapmethods(this, callback))
390397
}
391398

392399
function save() {

test/session.js

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1677,6 +1677,49 @@ describe('session()', function(){
16771677
.expect(500, 'failed to load session', done)
16781678
})
16791679
})
1680+
1681+
it('should not override an overriden `reload` in case of errors', function (done) {
1682+
var store = new session.MemoryStore()
1683+
var server = createServer({ store: store, resave: false }, function (req, res) {
1684+
if (req.url === '/') {
1685+
req.session.active = true
1686+
res.end('session created')
1687+
return
1688+
}
1689+
1690+
store.clear(function (err) {
1691+
if (err) return done(err)
1692+
1693+
// reload way too many times on top of each other,
1694+
// attempting to overflow the call stack
1695+
var iters = 20
1696+
reload()
1697+
function reload () {
1698+
if (!--iters) {
1699+
res.end('ok')
1700+
return
1701+
}
1702+
1703+
try {
1704+
req.session.reload(reload)
1705+
} catch (e) {
1706+
res.statusCode = 500
1707+
res.end(e.message)
1708+
}
1709+
}
1710+
})
1711+
})
1712+
1713+
request(server)
1714+
.get('/')
1715+
.expect(200, 'session created', function (err, res) {
1716+
if (err) return done(err)
1717+
request(server)
1718+
.get('/foo')
1719+
.set('Cookie', cookie(res))
1720+
.expect(200, 'ok', done)
1721+
})
1722+
})
16801723
})
16811724

16821725
describe('.save()', function () {

0 commit comments

Comments
 (0)