diff options
author | Yasuo Ohgaki <yohgaki@php.net> | 2013-06-25 20:09:10 +0900 |
---|---|---|
committer | Stanislav Malyshev <stas@php.net> | 2013-08-04 16:36:53 -0700 |
commit | 82b0e8be99065b61b622df21bbc7494d2fbca3cd (patch) | |
tree | 55c05e7121d5819e8c213daa4385adead4d055d0 | |
parent | 25e8fcc88fa20dc9d4c47184471003f436927cde (diff) | |
download | php-git-82b0e8be99065b61b622df21bbc7494d2fbca3cd.tar.gz |
Strict session. Detect session id collision
-rw-r--r-- | ext/session/mod_files.c | 15 | ||||
-rw-r--r-- | ext/session/mod_mm.c | 15 |
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; } |