Skip to content

Commit 82b0e8b

Browse files
Yasuo Ohgakismalyshev
Yasuo Ohgaki
authored andcommitted
Strict session. Detect session id collision
1 parent 25e8fcc commit 82b0e8b

File tree

2 files changed

+28
-2
lines changed

2 files changed

+28
-2
lines changed

ext/session/mod_files.c

+14-1
Original file line numberDiff line numberDiff line change
@@ -459,9 +459,22 @@ PS_GC_FUNC(files)
459459
PS_CREATE_SID_FUNC(files)
460460
{
461461
char *sid;
462+
int maxfail = 3;
462463
PS_FILES_DATA;
463464

464-
sid = php_session_create_id((void **)&data, newlen TSRMLS_CC);
465+
do {
466+
sid = php_session_create_id((void **)&data, newlen TSRMLS_CC);
467+
/* Check collision */
468+
if (ps_files_key_exists(data, sid TSRMLS_CC) == SUCCESS) {
469+
if (sid) {
470+
efree(sid);
471+
sid = NULL;
472+
}
473+
if (!(maxfail--)) {
474+
return NULL;
475+
}
476+
}
477+
} while(!sid);
465478

466479
return sid;
467480
}

ext/session/mod_mm.c

+14-1
Original file line numberDiff line numberDiff line change
@@ -479,9 +479,22 @@ PS_GC_FUNC(mm)
479479
PS_CREATE_SID_FUNC(mm)
480480
{
481481
char *sid;
482+
int maxfail = 3;
482483
PS_MM_DATA;
483484

484-
sid = php_session_create_id((void **)&data, newlen TSRMLS_CC);
485+
do {
486+
sid = php_session_create_id((void **)&data, newlen TSRMLS_CC);
487+
/* Check collision */
488+
if (ps_mm_key_exists(data, sid TSRMLS_CC) == SUCCESS) {
489+
if (sid) {
490+
efree(sid);
491+
sid = NULL;
492+
}
493+
if (!(maxfail--)) {
494+
return NULL;
495+
}
496+
}
497+
} while(!sid);
485498

486499
return sid;
487500
}

0 commit comments

Comments
 (0)