Hi all, I took out session module patch against latest CVS HEAD for your convenience.
Please let me know if you find problems in this patch. -- Yasuo Ohgaki
Index: mod_files.c =================================================================== RCS file: /repository/php4/ext/session/mod_files.c,v retrieving revision 1.68 diff -u -r1.68 mod_files.c --- mod_files.c 28 Feb 2002 08:26:39 -0000 1.68 +++ mod_files.c 1 Mar 2002 03:09:29 -0000 @@ -123,10 +123,9 @@ } } -static void ps_files_open(ps_files *data, const char *key) +static int ps_files_open(ps_files *data, const char *key TSRMLS_DC) { char buf[MAXPATHLEN]; - TSRMLS_FETCH(); if (data->fd < 0 || !data->lastkey || strcmp(key, data->lastkey)) { if (data->lastkey) { @@ -138,7 +137,7 @@ if (!ps_files_valid_key(key) || !ps_files_path_create(buf, sizeof(buf), data, key)) - return; + return FAILURE; data->lastkey = estrdup(key); @@ -153,13 +152,16 @@ if (data->fd != -1) flock(data->fd, LOCK_EX); - if (data->fd == -1) + if (data->fd == -1) { php_error(E_WARNING, "open(%s, O_RDWR) failed: %s (%d)", buf, strerror(errno), errno); + return FAILURE; + } } + return SUCCESS; } -static int ps_files_cleanup_dir(const char *dirname, int maxlifetime) +static int ps_files_cleanup_dir(const char *dirname, int maxlifetime TSRMLS_DC) { DIR *dir; char dentry[sizeof(struct dirent) + MAXPATHLEN]; @@ -169,7 +171,6 @@ time_t now; int nrdels = 0; size_t dirname_len; - TSRMLS_FETCH(); dir = opendir(dirname); if (!dir) { @@ -229,7 +230,7 @@ } data->basedir_len = strlen(save_path); data->basedir = estrndup(save_path, data->basedir_len); - + return SUCCESS; } @@ -254,10 +255,8 @@ struct stat sbuf; PS_FILES_DATA; - ps_files_open(data, key); - if (data->fd < 0) + if (ps_files_open(data, key TSRMLS_CC) == FAILURE) return FAILURE; - if (fstat(data->fd, &sbuf)) return FAILURE; @@ -283,8 +282,7 @@ long n; PS_FILES_DATA; - ps_files_open(data, key); - if (data->fd < 0) + if (ps_files_open(data, key TSRMLS_CC) == FAILURE) return FAILURE; /* @@ -314,7 +312,6 @@ { char buf[MAXPATHLEN]; PS_FILES_DATA; - TSRMLS_FETCH(); if (!ps_files_path_create(buf, sizeof(buf), data, key)) return FAILURE; @@ -337,7 +334,7 @@ an external entity (i.e. find -ctime x | xargs rm) */ if (data->dirdepth == 0) - *nrdels = ps_files_cleanup_dir(data->basedir, maxlifetime); + *nrdels = ps_files_cleanup_dir(data->basedir, maxlifetime TSRMLS_CC); return SUCCESS; } Index: mod_mm.c =================================================================== RCS file: /repository/php4/ext/session/mod_mm.c,v retrieving revision 1.32 diff -u -r1.32 mod_mm.c --- mod_mm.c 28 Feb 2002 08:26:40 -0000 1.32 +++ mod_mm.c 1 Mar 2002 03:09:30 -0000 @@ -319,7 +319,6 @@ { PS_MM_DATA; ps_sd *sd; - int ret = FAILURE; mm_lock(data->mm, MM_LOCK_RD); @@ -329,12 +328,14 @@ *val = emalloc(sd->datalen + 1); memcpy(*val, sd->data, sd->datalen); (*val)[sd->datalen] = '\0'; - ret = SUCCESS; } - + else { + *val = estrdup(""); + } + mm_unlock(data->mm); - return ret; + return SUCCESS; } PS_WRITE_FUNC(mm) Index: mod_user.c =================================================================== RCS file: /repository/php4/ext/session/mod_user.c,v retrieving revision 1.21 diff -u -r1.21 mod_user.c --- mod_user.c 28 Feb 2002 08:26:40 -0000 1.21 +++ mod_user.c 1 Mar 2002 03:09:30 -0000 @@ -51,11 +51,10 @@ } -static zval *ps_call_handler(zval *func, int argc, zval **argv) +static zval *ps_call_handler(zval *func, int argc, zval **argv TSRMLS_DC) { int i; zval *retval = NULL; - TSRMLS_FETCH(); MAKE_STD_ZVAL(retval); if (call_user_function(EG(function_table), NULL, func, retval, @@ -96,7 +95,7 @@ SESS_ZVAL_STRING(save_path, args[0]); SESS_ZVAL_STRING(session_name, args[1]); - retval = ps_call_handler(PSF(open), 2, args); + retval = ps_call_handler(PSF(open), 2, args TSRMLS_CC); FINISH; } @@ -106,7 +105,7 @@ int i; STDVARS; - retval = ps_call_handler(PSF(close), 0, NULL); + retval = ps_call_handler(PSF(close), 0, NULL TSRMLS_CC); for (i = 0; i < 6; i++) zval_ptr_dtor(&mdata->names[i]); @@ -124,7 +123,7 @@ SESS_ZVAL_STRING(key, args[0]); - retval = ps_call_handler(PSF(read), 1, args); + retval = ps_call_handler(PSF(read), 1, args TSRMLS_CC); if (retval) { if (Z_TYPE_P(retval) == IS_STRING) { @@ -146,7 +145,7 @@ SESS_ZVAL_STRING(key, args[0]); SESS_ZVAL_STRINGN(val, vallen, args[1]); - retval = ps_call_handler(PSF(write), 2, args); + retval = ps_call_handler(PSF(write), 2, args TSRMLS_CC); FINISH; } @@ -158,7 +157,7 @@ SESS_ZVAL_STRING(key, args[0]); - retval = ps_call_handler(PSF(destroy), 1, args); + retval = ps_call_handler(PSF(destroy), 1, args TSRMLS_CC); FINISH; } @@ -170,7 +169,7 @@ SESS_ZVAL_LONG(maxlifetime, args[0]); - retval = ps_call_handler(PSF(gc), 1, args); + retval = ps_call_handler(PSF(gc), 1, args TSRMLS_CC); FINISH; } Index: php_session.h =================================================================== RCS file: /repository/php4/ext/session/php_session.h,v retrieving revision 1.70 diff -u -r1.70 php_session.h --- php_session.h 28 Feb 2002 08:26:40 -0000 1.70 +++ php_session.h 1 Mar 2002 03:09:30 -0000 @@ -21,12 +21,12 @@ #include "ext/standard/php_var.h" -#define PS_OPEN_ARGS void **mod_data, const char *save_path, const char *session_name -#define PS_CLOSE_ARGS void **mod_data -#define PS_READ_ARGS void **mod_data, const char *key, char **val, int *vallen -#define PS_WRITE_ARGS void **mod_data, const char *key, const char *val, const int vallen -#define PS_DESTROY_ARGS void **mod_data, const char *key -#define PS_GC_ARGS void **mod_data, int maxlifetime, int *nrdels +#define PS_OPEN_ARGS void **mod_data, const char *save_path, const char *session_name +TSRMLS_DC +#define PS_CLOSE_ARGS void **mod_data TSRMLS_DC +#define PS_READ_ARGS void **mod_data, const char *key, char **val, int *vallen +TSRMLS_DC +#define PS_WRITE_ARGS void **mod_data, const char *key, const char *val, const int +vallen TSRMLS_DC +#define PS_DESTROY_ARGS void **mod_data, const char *key TSRMLS_DC +#define PS_GC_ARGS void **mod_data, int maxlifetime, int *nrdels TSRMLS_DC typedef struct ps_module_struct { const char *name; @@ -61,11 +61,16 @@ #x, ps_open_##x, ps_close_##x, ps_read_##x, ps_write_##x, \ ps_delete_##x, ps_gc_##x -typedef enum { - php_session_disabled, - php_session_none, - php_session_active -} php_session_status; +/* typedef enum { */ +/* php_session_disabled, */ +/* php_session_none, */ +/* php_session_active */ +/* } php_session_status; */ + +#define PS_DISABLED 1 +#define PS_NONE 2 +#define PS_ACTIVE 4 +#define PS_ERROR 8 typedef struct _php_ps_globals { char *save_path; @@ -79,10 +84,11 @@ char *cookie_path; char *cookie_domain; zend_bool cookie_secure; + long rinit_mod; ps_module *mod; void *mod_data; HashTable vars; - php_session_status session_status; + long session_status; long gc_probability; long gc_maxlifetime; int module_number; @@ -121,6 +127,7 @@ PHP_FUNCTION(session_write_close); #ifdef ZTS + #define PS(v) TSRMG(ps_globals_id, php_ps_globals *, v) #else #define PS(v) (ps_globals.v) Index: session.c =================================================================== RCS file: /repository/php4/ext/session/session.c,v retrieving revision 1.277 diff -u -r1.277 session.c --- session.c 1 Mar 2002 03:05:48 -0000 1.277 +++ session.c 1 Mar 2002 03:09:31 -0000 @@ -83,7 +83,7 @@ static void php_session_output_handler(char *output, uint output_len, char **handled_output, uint *handled_output_len, int mode TSRMLS_DC) { - if ((PS(session_status) == php_session_active)) { + if ((PS(session_status) & PS_ACTIVE)) { *handled_output = url_adapt_ext_ex(output, output_len, PS(session_name), PS(id), handled_output_len, (zend_bool) (mode&PHP_OUTPUT_HANDLER_END ? 1 : 0) TSRMLS_CC); } else { *handled_output = NULL; @@ -300,10 +300,7 @@ if (zend_hash_find(Z_ARRVAL_P(PS(http_session_vars)), name, namelen+1, (void **) state_var)==SUCCESS) { return SUCCESS; } - } else if (!PG(register_globals)) { - /* register_globals is disabled, but we don't have http_session_vars */ - return HASH_KEY_NON_EXISTANT; - } + } return zend_hash_find(&EG(symbol_table), name, namelen+1, (void **) state_var); } @@ -476,19 +473,27 @@ { char *ret = NULL; - if (PS(serializer)->encode(&ret, newlen TSRMLS_CC) == FAILURE) + if (PS(serializer)->encode(&ret, newlen TSRMLS_CC) == FAILURE) { + PS(session_status) = PS_ERROR; ret = NULL; - + } + return ret; } -static void php_session_decode(const char *val, int vallen TSRMLS_DC) +static int php_session_decode(const char *val, int vallen TSRMLS_DC) { - php_session_track_init(TSRMLS_C); - if (PS(serializer)->decode(val, vallen TSRMLS_CC) == FAILURE) { - php_session_destroy(TSRMLS_C); - php_error(E_WARNING, "Failed to decode session object. Session has been destroyed."); + if (PS(session_status) & PS_ACTIVE) { + php_session_track_init(TSRMLS_C); + if (PS(serializer)->decode(val, vallen TSRMLS_CC) == FAILURE) { + PS(session_status) = PS_ERROR; + php_session_destroy(TSRMLS_C); + php_error(E_WARNING, "Failed to decode session object. Session +has been destroyed."); + return FAILURE; + } + return SUCCESS; } + return FAILURE; } static char hexconvtab[] = "0123456789abcdef"; @@ -547,14 +552,18 @@ char *val; int vallen; - if (PS(mod)->open(&PS(mod_data), PS(save_path), PS(session_name)) == FAILURE) { - php_error(E_ERROR, "Failed to initialize session module"); + if (PS(mod)->open(&PS(mod_data), PS(save_path), PS(session_name) TSRMLS_CC) == +FAILURE) { + PS(session_status) = PS_ERROR; + php_error(E_WARNING, "Failed to initialize session module"); return; } - if (PS(mod)->read(&PS(mod_data), PS(id), &val, &vallen) == SUCCESS) { - php_session_decode(val, vallen TSRMLS_CC); - efree(val); + if (PS(mod)->read(&PS(mod_data), PS(id), &val, &vallen TSRMLS_CC) == FAILURE) { + PS(session_status) = PS_ERROR; + php_error(E_WARNING, "Failed to read session data"); + return; } + php_session_decode(val, vallen TSRMLS_CC); + efree(val); } @@ -568,38 +577,37 @@ ulong num_key; HashPosition pos; - if (!PG(register_globals) && !PS(http_session_vars)) { + if (PS(session_status) & (PS_DISABLED|PS_NONE|PS_ERROR)) { return; } - if (PS(http_session_vars)) { - for (zend_hash_internal_pointer_reset_ex(Z_ARRVAL_P(PS(http_session_vars)), &pos); - zend_hash_get_current_key_ex(Z_ARRVAL_P(PS(http_session_vars)), &variable, &variable_len, &num_key, 0, &pos) == HASH_KEY_IS_STRING; - zend_hash_move_forward_ex(Z_ARRVAL_P(PS(http_session_vars)),&pos)) { - PS_ADD_VARL(variable,variable_len-1); - } + for (zend_hash_internal_pointer_reset_ex(Z_ARRVAL_P(PS(http_session_vars)), +&pos); + zend_hash_get_current_key_ex(Z_ARRVAL_P(PS(http_session_vars)), +&variable, &variable_len, &num_key, 0, &pos) == HASH_KEY_IS_STRING; + zend_hash_move_forward_ex(Z_ARRVAL_P(PS(http_session_vars)),&pos)) { + PS_ADD_VARL(variable,variable_len-1); } if (PS(mod_data)) { val = php_session_encode(&vallen TSRMLS_CC); if (val) { - ret = PS(mod)->write(&PS(mod_data), PS(id), val, vallen); + ret = PS(mod)->write(&PS(mod_data), PS(id), val, vallen +TSRMLS_CC); efree(val); } else { - ret = PS(mod)->write(&PS(mod_data), PS(id), "", 0); + ret = PS(mod)->write(&PS(mod_data), PS(id), "", 0 TSRMLS_CC); } } - if (ret == FAILURE) + if (ret == FAILURE) { + PS(session_status) = PS_ERROR; php_error(E_WARNING, "Failed to write session data (%s). Please " - "verify that the current setting of session.save_path " - "is correct (%s)", - PS(mod)->name, - PS(save_path)); - + "verify that the current setting of +session.save_path " + "is correct (%s)", + PS(mod)->name, + PS(save_path)); + } if (PS(mod_data)) - PS(mod)->close(&PS(mod_data)); + PS(mod)->close(&PS(mod_data) TSRMLS_CC); } static char *month_names[] = { @@ -743,6 +751,7 @@ smart_str ncookie = {0}; char *date_fmt = NULL; + if (SG(headers_sent)) { char *output_start_filename = php_get_output_start_filename(TSRMLS_C); int output_start_lineno = php_get_output_start_lineno(TSRMLS_C); @@ -833,10 +842,11 @@ int module_number = PS(module_number); int nrand; int lensess; + smart_str var = {0}; PS(apply_trans_sid) = PS(use_trans_sid); - if (PS(session_status) != php_session_none) + if (PS(session_status) & (PS_ACTIVE|PS_ERROR)) return; lensess = strlen(PS(session_name)); @@ -926,33 +936,26 @@ php_session_send_cookie(TSRMLS_C); } - - if (PS(apply_trans_sid)) { - smart_str var = {0}; - - smart_str_appends(&var, PS(session_name)); - smart_str_appendc(&var, '='); - smart_str_appends(&var, PS(id)); - smart_str_0(&var); - REGISTER_STRING_CONSTANT("SID", var.c, 0); - } else { - REGISTER_STRING_CONSTANT("SID", empty_string, 0); - } - - PS(session_status) = php_session_active; + smart_str_appends(&var, PS(session_name)); + smart_str_appendc(&var, '='); + smart_str_appends(&var, PS(id)); + smart_str_0(&var); + REGISTER_STRING_CONSTANT("SID", var.c, 0); if (PS(apply_trans_sid)) { php_session_start_output_handler(4096 TSRMLS_CC); } + PS(session_status) = PS_ACTIVE; + php_session_cache_limiter(TSRMLS_C); php_session_initialize(TSRMLS_C); - if (PS(mod_data) && PS(gc_probability) > 0) { + if ((PS(session_status) & PS_ACTIVE) && PS(gc_probability) > 0) { int nrdels = -1; - + nrand = (int) (100.0*php_combined_lcg(TSRMLS_C)); if (nrand < PS(gc_probability)) { - PS(mod)->gc(&PS(mod_data), PS(gc_maxlifetime), &nrdels); + PS(mod)->gc(&PS(mod_data), PS(gc_maxlifetime), &nrdels +TSRMLS_CC); #if 0 if (nrdels != -1) php_error(E_NOTICE, "purged %d expired session objects\n", nrdels); @@ -961,18 +964,20 @@ } } + static zend_bool php_session_destroy(TSRMLS_D) { zend_bool retval = SUCCESS; - if (PS(session_status) != php_session_active) { - php_error(E_WARNING, "Trying to destroy uninitialized session"); + if (PS(session_status) & (PS_DISABLED|PS_NONE|PS_ERROR)) { + php_error(E_NOTICE, "Trying to destroy uninitialized session"); return FAILURE; } - if (PS(mod)->destroy(&PS(mod_data), PS(id)) == FAILURE) { + if (PS(mod)->destroy(&PS(mod_data), PS(id) TSRMLS_CC) == FAILURE) { + PS(session_status) = PS_ERROR; retval = FAILURE; - php_error(E_WARNING, "Session object destruction failed"); + php_error(E_NOTICE, "Session object destruction failed"); } php_rshutdown_session_globals(TSRMLS_C); @@ -988,20 +993,24 @@ { zval **lifetime, **path, **domain, **secure; - if (!PS(use_cookies)) - return; if (ZEND_NUM_ARGS() < 1 || ZEND_NUM_ARGS() > 4 || zend_get_parameters_ex(ZEND_NUM_ARGS(), &lifetime, &path, &domain, &secure) == FAILURE) WRONG_PARAM_COUNT; + if (!PS(use_cookies)) { + php_error(E_NOTICE, "%s() cannot set cookie parameter when use_cookies +is off", + get_active_function_name(TSRMLS_C)); + RETURN_FALSE; + } + convert_to_long_ex(lifetime); PS(cookie_lifetime) = Z_LVAL_PP(lifetime); if (ZEND_NUM_ARGS() > 1) { convert_to_string_ex(path); zend_alter_ini_entry("session.cookie_path", sizeof("session.cookie_path"), Z_STRVAL_PP(path), Z_STRLEN_PP(path), PHP_INI_USER, PHP_INI_STAGE_RUNTIME); - + if (ZEND_NUM_ARGS() > 2) { convert_to_string_ex(domain); zend_alter_ini_entry("session.cookie_domain", sizeof("session.cookie_domain"), Z_STRVAL_PP(domain), Z_STRLEN_PP(domain), PHP_INI_USER, PHP_INI_STAGE_RUNTIME); @@ -1011,6 +1020,7 @@ } } } + } /* }}} */ @@ -1023,7 +1033,8 @@ } if (array_init(return_value) == FAILURE) { - php_error(E_ERROR, "Cannot initialize return value from session_get_cookie_parameters"); + php_error(E_ERROR, "%s() cannot initialize return value from +session_get_cookie_parameters", + get_active_function_name(TSRMLS_C)); RETURN_FALSE; } @@ -1040,18 +1051,22 @@ { zval **p_name; int ac = ZEND_NUM_ARGS(); - char *old; - - old = estrdup(PS(session_name)); + char *old = NULL; if (ac < 0 || ac > 1 || zend_get_parameters_ex(ac, &p_name) == FAILURE) WRONG_PARAM_COUNT; if (ac == 1) { + if (PS(session_status) & PS_ACTIVE) { + php_error(E_NOTICE, "%s() cannot set session name once session +is started.", + get_active_function_name(TSRMLS_C)); + RETURN_FALSE; + } convert_to_string_ex(p_name); zend_alter_ini_entry("session.name", sizeof("session.name"), Z_STRVAL_PP(p_name), Z_STRLEN_PP(p_name), PHP_INI_USER, PHP_INI_STAGE_RUNTIME); } - + + old = estrdup(PS(session_name)); RETVAL_STRING(old, 0); } /* }}} */ @@ -1062,9 +1077,7 @@ { zval **p_name; int ac = ZEND_NUM_ARGS(); - char *old; - - old = safe_estrdup(PS(mod)->name); + char *old = NULL; if (ac < 0 || ac > 1 || zend_get_parameters_ex(ac, &p_name) == FAILURE) WRONG_PARAM_COUNT; @@ -1072,26 +1085,34 @@ if (ac == 1) { ps_module *tempmod; + if (PS(session_status) & (PS_ACTIVE|PS_ERROR)) { + php_error(E_NOTICE, "%s() cannot set session module name once +session is started. " + "Current session save handler (%s)", + get_active_function_name(TSRMLS_C), + (PS(mod)->name ? PS(mod)->name : "none")); + RETURN_FALSE; + } + convert_to_string_ex(p_name); tempmod = _php_find_ps_module(Z_STRVAL_PP(p_name) TSRMLS_CC); - if (tempmod) { - if (PS(mod_data)) - PS(mod)->close(&PS(mod_data)); - PS(mod) = tempmod; - PS(mod_data) = NULL; - } else { - efree(old); - php_error(E_ERROR, "Cannot find named PHP session module (%s)", - Z_STRVAL_PP(p_name)); + if (!tempmod) { + php_error(E_NOTICE, "Cannot find named PHP session module +(%s)", + Z_STRVAL_PP(p_name)); RETURN_FALSE; } + if (PS(mod_data)) + PS(mod)->close(&PS(mod_data) TSRMLS_CC); + PS(mod) = tempmod; + PS(mod_data) = NULL; + PS(rinit_mod) = 1; } + old = safe_estrdup(PS(mod)->name); RETVAL_STRING(old, 0); } /* }}} */ -/* {{{ proto void session_set_save_handler(string open, string close, string read, string write, string destroy, string gc) +/* {{{ proto bool session_set_save_handler(string open, string close, string read, +string write, string destroy, string gc) Sets user-level functions */ PHP_FUNCTION(session_set_save_handler) { @@ -1102,8 +1123,13 @@ if (ZEND_NUM_ARGS() != 6 || zend_get_parameters_array_ex(6, args) == FAILURE) WRONG_PARAM_COUNT; - if (PS(session_status) != php_session_none) + if (PS(session_status) & PS_ACTIVE) { + php_error(E_NOTICE, "%s() cannot set session save handler functions +once session is started. " + "Current session save handler (%s)", + get_active_function_name(TSRMLS_C), + (PS(mod)->name ? PS(mod)->name : "none")); RETURN_FALSE; + } zend_alter_ini_entry("session.save_handler", sizeof("session.save_handler"), "user", sizeof("user")-1, PHP_INI_USER, PHP_INI_STAGE_RUNTIME); @@ -1126,18 +1152,22 @@ { zval **p_name; int ac = ZEND_NUM_ARGS(); - char *old; - - old = estrdup(PS(save_path)); + char *old = NULL; if (ac < 0 || ac > 1 || zend_get_parameters_ex(ac, &p_name) == FAILURE) WRONG_PARAM_COUNT; - + if (ac == 1) { + if (PS(session_status) & PS_ACTIVE) { + php_error(E_NOTICE, "%s() cannot change session save path +once session is started.", + get_active_function_name(TSRMLS_C)); + RETURN_FALSE; + } convert_to_string_ex(p_name); zend_alter_ini_entry("session.save_path", sizeof("session.save_path"), Z_STRVAL_PP(p_name), Z_STRLEN_PP(p_name), PHP_INI_USER, PHP_INI_STAGE_RUNTIME); } - + + old = estrdup(PS(save_path)); RETVAL_STRING(old, 0); } /* }}} */ @@ -1150,18 +1180,21 @@ int ac = ZEND_NUM_ARGS(); char *old = empty_string; - if (PS(id)) - old = estrdup(PS(id)); - if (ac < 0 || ac > 1 || zend_get_parameters_ex(ac, &p_name) == FAILURE) WRONG_PARAM_COUNT; - + if (ac == 1) { - convert_to_string_ex(p_name); if (PS(id)) efree(PS(id)); + if (PS(session_status) & PS_ACTIVE) { + php_error(E_NOTICE, "%s() cannot set session id once session +is started.", + get_active_function_name(TSRMLS_C)); + RETURN_FALSE; + } + convert_to_string_ex(p_name); PS(id) = estrndup(Z_STRVAL_PP(p_name), Z_STRLEN_PP(p_name)); } - + + old = safe_estrdup(PS(id)); RETVAL_STRING(old, 0); } /* }}} */ @@ -1172,18 +1205,23 @@ { zval **p_cache_limiter; int ac = ZEND_NUM_ARGS(); - char *old; - - old = estrdup(PS(cache_limiter)); + char *old = NULL; if (ac < 0 || ac > 1 || zend_get_parameters_ex(ac, &p_cache_limiter) == FAILURE) WRONG_PARAM_COUNT; if (ac == 1) { + if (PS(session_status) & (PS_ACTIVE|PS_ERROR)) { + php_error(E_NOTICE, "%s() cannot set session module name once +session is started.", + get_active_function_name(TSRMLS_C)); + RETURN_FALSE; + } + convert_to_string_ex(p_cache_limiter); zend_alter_ini_entry("session.cache_limiter", sizeof("session.cache_limiter"), Z_STRVAL_PP(p_cache_limiter), Z_STRLEN_PP(p_cache_limiter), PHP_INI_USER, PHP_INI_STAGE_RUNTIME); } - + + old = estrdup(PS(cache_limiter)); RETVAL_STRING(old, 0); } /* }}} */ @@ -1194,9 +1232,7 @@ { zval **p_cache_expire; int ac = ZEND_NUM_ARGS(); - long old; - - old = PS(cache_expire); + long old = PS(cache_expire); if (ac < 0 || ac > 1 || zend_get_parameters_ex(ac, &p_cache_expire) == FAILURE) WRONG_PARAM_COUNT; @@ -1241,6 +1277,11 @@ int argc = ZEND_NUM_ARGS(); int i; + if (!PG(register_globals)) { + php_error(E_NOTICE, "Use %s() only for globals. Use $_SESSION, +instead.", + get_active_function_name(TSRMLS_C)); + } + if (argc <= 0) RETURN_FALSE else @@ -1251,7 +1292,7 @@ WRONG_PARAM_COUNT; } - if (PS(session_status) == php_session_none) + if (PS(session_status) & PS_NONE) php_session_start(TSRMLS_C); for (i = 0; i < argc; i++) { @@ -1273,9 +1314,20 @@ zval **p_name; int ac = ZEND_NUM_ARGS(); + if (!PG(register_globals)) { + php_error(E_NOTICE, "Use %s() only for globals. Use $_SESSION, +instead.", + get_active_function_name(TSRMLS_C)); + } + if (ac != 1 || zend_get_parameters_ex(ac, &p_name) == FAILURE) WRONG_PARAM_COUNT; - + + if (!(PS(session_status) & PS_ACTIVE)) { + php_error(E_NOTICE, "%s() cannot be used unless session is started.", + get_active_function_name(TSRMLS_C)); + RETURN_FALSE; + } + convert_to_string_ex(p_name); PS_DEL_VARL(Z_STRVAL_PP(p_name), Z_STRLEN_PP(p_name)); @@ -1292,9 +1344,20 @@ zval *p_var; int ac = ZEND_NUM_ARGS(); + if (!PG(register_globals)) { + php_error(E_NOTICE, "Use %s() only for globals. Use $_SESSION, +instead.", + get_active_function_name(TSRMLS_C)); + } + if (ac != 1 || zend_get_parameters_ex(ac, &p_name) == FAILURE) WRONG_PARAM_COUNT; + if (!(PS(session_status) & PS_ACTIVE)) { + php_error(E_NOTICE, "%s() cannot be used unless session is started.", + get_active_function_name(TSRMLS_C)); + RETURN_FALSE; + } + convert_to_string_ex(p_name); if (zend_hash_find(&PS(vars), Z_STRVAL_PP(p_name), @@ -1326,13 +1389,15 @@ PHP_FUNCTION(session_decode) { zval **str; + int ret; if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &str) == FAILURE) WRONG_PARAM_COUNT; convert_to_string_ex(str); - php_session_decode(Z_STRVAL_PP(str), Z_STRLEN_PP(str) TSRMLS_CC); + ret = php_session_decode(Z_STRVAL_PP(str), Z_STRLEN_PP(str) TSRMLS_CC); + RETURN_BOOL(ret); } /* }}} */ @@ -1340,7 +1405,11 @@ Begin session - reinitializes freezed variables, registers browsers etc */ PHP_FUNCTION(session_start) { - /* skipping check for non-zero args for performance reasons here ?*/ + if (ZEND_NUM_ARGS() != 0) { + WRONG_PARAM_COUNT; + } + + /* Session start may fail. Better to return status */ php_session_start(TSRMLS_C); RETURN_TRUE; } @@ -1363,7 +1432,7 @@ /* }}} */ -/* {{{ proto void session_unset(void) +/* {{{ proto bool session_unset(void) Unset all registered variables */ PHP_FUNCTION(session_unset) { @@ -1371,7 +1440,11 @@ char *variable; ulong num_key; - if (PS(session_status) == php_session_none) + if (ZEND_NUM_ARGS() != 0) { + WRONG_PARAM_COUNT; + } + + if (PS(session_status) & PS_NONE) RETURN_FALSE; if (PG(register_globals)) { @@ -1386,13 +1459,14 @@ /* Clean $HTTP_SESSION_VARS. */ zend_hash_clean(Z_ARRVAL_P(PS(http_session_vars))); + RETURN_TRUE; } /* }}} */ PHPAPI void session_adapt_url(const char *url, size_t urllen, char **new, size_t *newlen TSRMLS_DC) { - if (PS(apply_trans_sid) && (PS(session_status) == php_session_active)) { + if (PS(apply_trans_sid) && (PS(session_status) & PS_ACTIVE)) { *new = url_adapt_single_url(url, urllen, PS(session_name), PS(id), newlen TSRMLS_CC); } } @@ -1402,7 +1476,7 @@ { zend_hash_init(&PS(vars), 0, NULL, NULL, 0); PS(id) = NULL; - PS(session_status) = php_session_none; + PS(session_status) = PS_NONE; PS(mod_data) = NULL; PS(output_handler_registered) = 0; } @@ -1410,10 +1484,10 @@ static void php_rshutdown_session_globals(TSRMLS_D) { if (PS(mod_data)) { - PS(mod)->close(&PS(mod_data)); + PS(mod)->close(&PS(mod_data) TSRMLS_CC); } if (PS(id)) { - efree(PS(id)); + efree(PS(id) TSRMLS_CC); } zend_hash_destroy(&PS(vars)); } @@ -1423,8 +1497,9 @@ { php_rinit_session_globals(TSRMLS_C); - if (PS(mod) == NULL) { + if (PS(mod) == NULL || PS(rinit_mod)) { char *value; + PS(rinit_mod) = 0; value = zend_ini_string("session.save_handler", sizeof("session.save_handler"), 0); if (value) { @@ -1433,7 +1508,7 @@ if (!PS(mod)) { /* current status is unusable */ - PS(session_status) = php_session_disabled; + PS(session_status) = PS_DISABLED; return SUCCESS; } } @@ -1447,9 +1522,9 @@ static void php_session_flush(TSRMLS_D) { - if(PS(session_status)==php_session_active) { + if(PS(session_status) & PS_ACTIVE) { php_session_save_current_state(TSRMLS_C); - PS(session_status)=php_session_none; + PS(session_status) = PS_DISABLED; } } @@ -1465,8 +1540,10 @@ if (PS(output_handler_registered)) { php_session_end_output_handler(TSRMLS_C); } - php_session_flush(TSRMLS_C); + if (PS(session_status) & PS_ACTIVE) + php_session_flush(TSRMLS_C); php_rshutdown_session_globals(TSRMLS_C); + PS(session_status) = PS_DISABLED; return SUCCESS; } /* }}} */
-- PHP Development Mailing List <http://www.php.net/> To unsubscribe, visit: http://www.php.net/unsub.php