summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYasuo Ohgaki <yohgaki@php.net>2013-06-25 20:09:10 +0900
committerStanislav Malyshev <stas@php.net>2013-08-04 16:36:53 -0700
commit82b0e8be99065b61b622df21bbc7494d2fbca3cd (patch)
tree55c05e7121d5819e8c213daa4385adead4d055d0
parent25e8fcc88fa20dc9d4c47184471003f436927cde (diff)
downloadphp-git-82b0e8be99065b61b622df21bbc7494d2fbca3cd.tar.gz
Strict session. Detect session id collision
-rw-r--r--ext/session/mod_files.c15
-rw-r--r--ext/session/mod_mm.c15
2 files changed, 28 insertions, 2 deletions
diff --git a/ext/session/mod_files.c b/ext/session/mod_files.c
index e9dc25a4b8..6beee097b2 100644
--- a/ext/session/mod_files.c
+++ b/ext/session/mod_files.c
@@ -459,9 +459,22 @@ PS_GC_FUNC(files)
PS_CREATE_SID_FUNC(files)
{
char *sid;
+ int maxfail = 3;
PS_FILES_DATA;
- sid = php_session_create_id((void **)&data, newlen TSRMLS_CC);
+ do {
+ sid = php_session_create_id((void **)&data, newlen TSRMLS_CC);
+ /* Check collision */
+ if (ps_files_key_exists(data, sid TSRMLS_CC) == SUCCESS) {
+ if (sid) {
+ efree(sid);
+ sid = NULL;
+ }
+ if (!(maxfail--)) {
+ return NULL;
+ }
+ }
+ } while(!sid);
return sid;
}
diff --git a/ext/session/mod_mm.c b/ext/session/mod_mm.c
index 7ca90833a6..69c0da7bdb 100644
--- a/ext/session/mod_mm.c
+++ b/ext/session/mod_mm.c
@@ -479,9 +479,22 @@ PS_GC_FUNC(mm)
PS_CREATE_SID_FUNC(mm)
{
char *sid;
+ int maxfail = 3;
PS_MM_DATA;
- sid = php_session_create_id((void **)&data, newlen TSRMLS_CC);
+ do {
+ sid = php_session_create_id((void **)&data, newlen TSRMLS_CC);
+ /* Check collision */
+ if (ps_mm_key_exists(data, sid TSRMLS_CC) == SUCCESS) {
+ if (sid) {
+ efree(sid);
+ sid = NULL;
+ }
+ if (!(maxfail--)) {
+ return NULL;
+ }
+ }
+ } while(!sid);
return sid;
}