From: Jani Taskinen Date: Mon, 18 May 2009 16:09:51 +0000 (+0000) Subject: - WS + sync with PHP_5_3 (thanks Ilia & Co.) X-Git-Tag: php-5.4.0alpha1~191^2~3622 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=1aee5ff9fc45796b73e94b13fc526ab27d151ad4;p=php - WS + sync with PHP_5_3 (thanks Ilia & Co.) --- diff --git a/ext/session/mod_files.c b/ext/session/mod_files.c index f38f771fd0..7e90147b40 100644 --- a/ext/session/mod_files.c +++ b/ext/session/mod_files.c @@ -1,4 +1,4 @@ -/* +/* +----------------------------------------------------------------------+ | PHP Version 6 | +----------------------------------------------------------------------+ @@ -86,7 +86,7 @@ static int ps_files_valid_key(const char *key) } len = p - key; - + if (len == 0) { ret = 0; } @@ -100,7 +100,7 @@ static char *ps_files_path_create(char *buf, size_t buflen, ps_files *data, cons const char *p; int i; int n; - + key_len = strlen(key); if (key_len <= data->dirdepth || buflen < (strlen(data->basedir) + 2 * data->dirdepth + key_len + 5 + sizeof(FILE_PREFIX))) { @@ -142,18 +142,18 @@ static char *ps_files_path_create(char *buf, size_t buflen, ps_files *data, cons efree(newbuf); } } - + return buf; } #ifndef O_BINARY -#define O_BINARY 0 -#endif +# define O_BINARY 0 +#endif static void ps_files_close(ps_files *data) { if (data->fd != -1) { -#ifdef PHP_WIN32 +#ifdef PHP_WIN32 /* On Win32 locked files that are closed without being explicitly unlocked will be unlocked only when "system resources become available". */ flock(data->fd, LOCK_UN); @@ -199,8 +199,8 @@ static void ps_files_open(ps_files *data, const char *key TSRMLS_DC) return; } if ( - S_ISLNK(sbuf.st_mode) && - php_check_open_basedir(buf TSRMLS_CC) + S_ISLNK(sbuf.st_mode) && + php_check_open_basedir(buf TSRMLS_CC) ) { close(data->fd); return; @@ -218,8 +218,7 @@ static void ps_files_open(ps_files *data, const char *key TSRMLS_DC) } #endif } else { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "open(%s, O_RDWR) failed: %s (%d)", buf, - strerror(errno), errno); + php_error_docref(NULL TSRMLS_CC, E_WARNING, "open(%s, O_RDWR) failed: %s (%d)", buf, strerror(errno), errno); } } } @@ -248,7 +247,7 @@ static int ps_files_cleanup_dir(const char *dirname, int maxlifetime TSRMLS_DC) /* Prepare buffer (dirname never changes) */ memcpy(buf, dirname, dirname_len); buf[dirname_len] = PHP_DIR_SEPARATOR; - + while (php_readdir_r(dir, (struct dirent *) dentry, &entry) == 0 && entry) { /* does the file start with our prefix? */ if (!strncmp(entry->d_name, FILE_PREFIX, sizeof(FILE_PREFIX) - 1)) { @@ -263,7 +262,7 @@ static int ps_files_cleanup_dir(const char *dirname, int maxlifetime TSRMLS_DC) buf[dirname_len + entry_len + 1] = '\0'; /* check whether its last access was more than maxlifet ago */ - if (VCWD_STAT(buf, &sbuf) == 0 && + if (VCWD_STAT(buf, &sbuf) == 0 && #ifdef NETWARE (now - sbuf.st_mtime.tv_sec) > maxlifetime) { #else @@ -300,7 +299,7 @@ PS_OPEN_FUNC(files) return FAILURE; } } - + /* split up input parameter */ last = save_path; p = strchr(save_path, ';'); @@ -320,7 +319,7 @@ PS_OPEN_FUNC(files) return FAILURE; } } - + if (argc > 2) { errno = 0; filemode = strtol(argv[1], NULL, 8); @@ -332,15 +331,15 @@ PS_OPEN_FUNC(files) save_path = argv[argc - 1]; data = ecalloc(1, sizeof(*data)); - + data->fd = -1; data->dirdepth = dirdepth; data->filemode = filemode; data->basedir_len = strlen(save_path); data->basedir = estrndup(save_path, data->basedir_len); - + PS_SET_MOD_DATA(data); - + return SUCCESS; } @@ -401,7 +400,7 @@ PS_READ_FUNC(files) efree(*val); return FAILURE; } - + return SUCCESS; } @@ -415,11 +414,8 @@ PS_WRITE_FUNC(files) return FAILURE; } - /* - * truncate file, if the amount of new data is smaller than - * the existing data set. - */ - + /* Truncate file if the amount of new data is smaller than the existing data set. */ + if (vallen < (int)data->st_size) { ftruncate(data->fd, 0); } @@ -454,11 +450,10 @@ PS_DESTROY_FUNC(files) if (data->fd != -1) { ps_files_close(data); - + if (VCWD_UNLINK(buf) == -1) { /* This is a little safety check for instances when we are dealing with a regenerated session - * that was not yet written to disk - */ + * that was not yet written to disk. */ if (!VCWD_ACCESS(buf, F_OK)) { return FAILURE; } @@ -468,14 +463,14 @@ PS_DESTROY_FUNC(files) return SUCCESS; } -PS_GC_FUNC(files) +PS_GC_FUNC(files) { PS_FILES_DATA; - + /* we don't perform any cleanup, if dirdepth is larger than 0. we return SUCCESS, since all cleanup should be handled by an external entity (i.e. find -ctime x | xargs rm) */ - + if (data->dirdepth == 0) { *nrdels = ps_files_cleanup_dir(data->basedir, maxlifetime TSRMLS_CC); } diff --git a/ext/session/mod_mm.c b/ext/session/mod_mm.c index a9915af223..797ed72390 100644 --- a/ext/session/mod_mm.c +++ b/ext/session/mod_mm.c @@ -1,4 +1,4 @@ -/* +/* +----------------------------------------------------------------------+ | PHP Version 6 | +----------------------------------------------------------------------+ @@ -42,9 +42,7 @@ /* For php_uint32 */ #include "ext/standard/basic_functions.h" -/* - * this list holds all data associated with one session - */ +/* This list holds all data associated with one session. */ typedef struct ps_sd { struct ps_sd *next; @@ -67,21 +65,21 @@ typedef struct { static ps_mm *ps_mm_instance = NULL; #if 0 -#define ps_mm_debug(a) printf a +# define ps_mm_debug(a) printf a #else -#define ps_mm_debug(a) +# define ps_mm_debug(a) #endif static inline php_uint32 ps_sd_hash(const char *data, int len) { php_uint32 h; const char *e = data + len; - + for (h = 2166136261U; data < e; ) { h *= 16777619; h ^= *data++; } - + return h; } @@ -91,10 +89,10 @@ static void hash_split(ps_mm *data) ps_sd **nhash; ps_sd **ohash, **ehash; ps_sd *ps, *next; - + nmax = ((data->hash_max + 1) << 1) - 1; nhash = mm_calloc(data->mm, nmax + 1, sizeof(*data->hash)); - + if (!nhash) { /* no further memory to expand hash table */ return; @@ -119,9 +117,9 @@ static ps_sd *ps_sd_new(ps_mm *data, const char *key) php_uint32 hv, slot; ps_sd *sd; int keylen; - + keylen = strlen(key); - + sd = mm_malloc(data->mm, sizeof(ps_sd) + keylen); if (!sd) { TSRMLS_FETCH(); @@ -132,24 +130,25 @@ static ps_sd *ps_sd_new(ps_mm *data, const char *key) hv = ps_sd_hash(key, keylen); slot = hv & data->hash_max; - + sd->ctime = 0; sd->hv = hv; sd->data = NULL; sd->alloclen = sd->datalen = 0; - + memcpy(sd->key, key, keylen + 1); - + sd->next = data->hash[slot]; data->hash[slot] = sd; data->hash_cnt++; - + if (!sd->next) { - if (data->hash_cnt >= data->hash_max) + if (data->hash_cnt >= data->hash_max) { hash_split(data); + } } - + ps_mm_debug(("inserting %s(%p) into slot %d\n", key, sd, slot)); return sd; @@ -170,7 +169,7 @@ static void ps_sd_destroy(ps_mm *data, ps_sd *sd) for (prev = data->hash[slot]; prev->next != sd; prev = prev->next); prev->next = sd->next; } - + data->hash_cnt--; if (sd->data) { @@ -187,7 +186,7 @@ static ps_sd *ps_sd_lookup(ps_mm *data, const char *key, int rw) hv = ps_sd_hash(key, strlen(key)); slot = hv & data->hash_max; - + for (prev = NULL, ret = data->hash[slot]; ret; prev = ret, ret = ret->next) { if (ret->hv == hv && !strcmp(ret->key, key)) { break; @@ -196,7 +195,6 @@ static ps_sd *ps_sd_lookup(ps_mm *data, const char *key, int rw) if (ret && rw && ret != data->hash[slot]) { /* Move the entry to the top of the linked list */ - if (prev) { prev->next = ret->next; } @@ -206,7 +204,7 @@ static ps_sd *ps_sd_lookup(ps_mm *data, const char *key, int rw) } ps_mm_debug(("lookup(%s): ret=%p,hv=%u,slot=%d\n", key, ret, hv, slot)); - + return ret; } @@ -243,7 +241,9 @@ static void ps_mm_destroy(ps_mm *data) /* This function is called during each module shutdown, but we must not release the shared memory pool, when an Apache child dies! */ - if (data->owner != getpid()) return; + if (data->owner != getpid()) { + return; + } for (h = 0; h < data->hash_max + 1; h++) { for (sd = data->hash[h]; sd; sd = next) { @@ -251,7 +251,7 @@ static void ps_mm_destroy(ps_mm *data) ps_sd_destroy(data, sd); } } - + mm_free(data->mm, data->hash); mm_destroy(data->mm); free(data); @@ -261,41 +261,44 @@ PHP_MINIT_FUNCTION(ps_mm) { int save_path_len = strlen(PS(save_path)); int mod_name_len = strlen(sapi_module.name); + int euid_len; char *ps_mm_path, euid[30]; int ret; ps_mm_instance = calloc(sizeof(*ps_mm_instance), 1); - if (!ps_mm_instance) { + if (!ps_mm_instance) { return FAILURE; } - if (!snprintf(euid, sizeof(euid), "%d", geteuid())) { + if (!(euid_len = slprintf(euid, sizeof(euid), "%d", geteuid()))) { return FAILURE; } - - /* Directory + '/' + File + Module Name + Effective UID + \0 */ - ps_mm_path = emalloc(save_path_len+1+sizeof(PS_MM_FILE)+mod_name_len+strlen(euid)+1); - - memcpy(ps_mm_path, PS(save_path), save_path_len + 1); - if (save_path_len > 0 && ps_mm_path[save_path_len - 1] != DEFAULT_SLASH) { + + /* Directory + '/' + File + Module Name + Effective UID + \0 */ + ps_mm_path = emalloc(save_path_len + 1 + (sizeof(PS_MM_FILE) - 1) + mod_name_len + euid_len + 1); + + memcpy(ps_mm_path, PS(save_path), save_path_len); + if (PS(save_path)[save_path_len - 1] != DEFAULT_SLASH) { ps_mm_path[save_path_len] = DEFAULT_SLASH; - ps_mm_path[save_path_len+1] = '\0'; + save_path_len++; } + memcpy(ps_mm_path + save_path_len, PS_MM_FILE, sizeof(PS_MM_FILE) - 1); + save_path_len += sizeof(PS_MM_FILE) - 1; + memcpy(ps_mm_path + save_path_len, sapi_module.name, mod_name_len); + save_path_len += mod_name_len; + memcpy(ps_mm_path + save_path_len, euid, euid_len); + ps_mm_path[save_path_len + euid_len] = '\0'; - strcat(ps_mm_path, PS_MM_FILE); - strcat(ps_mm_path, sapi_module.name); - strcat(ps_mm_path, euid); - ret = ps_mm_initialize(ps_mm_instance, ps_mm_path); - + efree(ps_mm_path); - + if (ret != SUCCESS) { free(ps_mm_instance); ps_mm_instance = NULL; return FAILURE; } - + php_session_register_module(&ps_mod_mm); return SUCCESS; } @@ -312,13 +315,12 @@ PHP_MSHUTDOWN_FUNCTION(ps_mm) PS_OPEN_FUNC(mm) { ps_mm_debug(("open: ps_mm_instance=%p\n", ps_mm_instance)); - + if (!ps_mm_instance) { return FAILURE; } - PS_SET_MOD_DATA(ps_mm_instance); - + return SUCCESS; } @@ -336,7 +338,7 @@ PS_READ_FUNC(mm) int ret = FAILURE; mm_lock(data->mm, MM_LOCK_RD); - + sd = ps_sd_lookup(data, key, 0); if (sd) { *vallen = sd->datalen; @@ -347,7 +349,7 @@ PS_READ_FUNC(mm) } mm_unlock(data->mm); - + return ret; } @@ -386,7 +388,7 @@ PS_WRITE_FUNC(mm) } mm_unlock(data->mm); - + return sd ? SUCCESS : FAILURE; } @@ -394,29 +396,29 @@ PS_DESTROY_FUNC(mm) { PS_MM_DATA; ps_sd *sd; - + mm_lock(data->mm, MM_LOCK_RW); - + sd = ps_sd_lookup(data, key, 0); if (sd) { ps_sd_destroy(data, sd); } mm_unlock(data->mm); - + return SUCCESS; } -PS_GC_FUNC(mm) +PS_GC_FUNC(mm) { PS_MM_DATA; time_t limit; ps_sd **ohash, **ehash; ps_sd *sd, *next; - + *nrdels = 0; ps_mm_debug(("gc\n")); - + time(&limit); limit -= maxlifetime; @@ -436,7 +438,7 @@ PS_GC_FUNC(mm) } mm_unlock(data->mm); - + return SUCCESS; } diff --git a/ext/session/mod_user.c b/ext/session/mod_user.c index d6643e813b..39e7c04506 100644 --- a/ext/session/mod_user.c +++ b/ext/session/mod_user.c @@ -1,4 +1,4 @@ -/* +/* +----------------------------------------------------------------------+ | PHP Version 6 | +----------------------------------------------------------------------+ @@ -26,34 +26,31 @@ ps_module ps_mod_user = { PS_MOD(user) }; -#define SESS_ZVAL_LONG(val, a) \ -{ \ - MAKE_STD_ZVAL(a); \ - ZVAL_LONG(a, val); \ +#define SESS_ZVAL_LONG(val, a) \ +{ \ + MAKE_STD_ZVAL(a); \ + ZVAL_LONG(a, val); \ } - -#define SESS_ZVAL_STRINGN(vl, ln, a) \ -{ \ - MAKE_STD_ZVAL(a); \ - ZVAL_UTF8_STRINGL(a, vl, ln, ZSTR_DUPLICATE); \ +#define SESS_ZVAL_STRING(vl, a) \ +{ \ + char *__vl = vl; \ + SESS_ZVAL_STRINGN(__vl, strlen(__vl), a); \ } -#define SESS_ZVAL_STRING(vl, a) \ -{ \ - char *__vl = vl; \ - SESS_ZVAL_STRINGN(__vl, strlen(__vl), a); \ +#define SESS_ZVAL_STRINGN(vl, ln, a) \ +{ \ + MAKE_STD_ZVAL(a); \ + ZVAL_UTF8_STRINGL(a, vl, ln, ZSTR_DUPLICATE); \ } - static zval *ps_call_handler(zval *func, int argc, zval **argv TSRMLS_DC) { int i; zval *retval = NULL; - + MAKE_STD_ZVAL(retval); - if (call_user_function(EG(function_table), NULL, func, retval, - argc, argv TSRMLS_CC) == FAILURE) { + if (call_user_function(EG(function_table), NULL, func, retval, argc, argv TSRMLS_CC) == FAILURE) { zval_ptr_dtor(&retval); retval = NULL; } @@ -66,7 +63,7 @@ static zval *ps_call_handler(zval *func, int argc, zval **argv TSRMLS_DC) } #define STDVARS1 \ - zval *retval; \ + zval *retval; \ int ret = FAILURE #define STDVARS \ @@ -76,12 +73,12 @@ static zval *ps_call_handler(zval *func, int argc, zval **argv TSRMLS_DC) #define PSF(a) PS(mod_user_names).name.ps_##a -#define FINISH \ +#define FINISH \ if (retval) { \ convert_to_long(retval); \ - ret = Z_LVAL_P(retval); \ + ret = Z_LVAL_P(retval); \ zval_ptr_dtor(&retval); \ - } \ + } \ return ret PS_OPEN_FUNC(user) @@ -89,21 +86,20 @@ PS_OPEN_FUNC(user) zval *args[2]; static char dummy = 0; STDVARS1; - + SESS_ZVAL_STRING((char*)save_path, args[0]); SESS_ZVAL_STRING((char*)session_name, args[1]); - + retval = ps_call_handler(PSF(open), 2, args TSRMLS_CC); if (retval) { /* This is necessary to fool the session module. Yes, it's safe to * use a static. Neither mod_user nor the session module itself will * ever touch this pointer. It could be set to 0xDEADBEEF for all the * difference it makes, but for the sake of paranoia it's set to some - * valid value. - */ + * valid value. */ PS_SET_MOD_DATA(&dummy); } - + FINISH; } @@ -126,7 +122,7 @@ PS_READ_FUNC(user) SESS_ZVAL_STRING((char*)key, args[0]); retval = ps_call_handler(PSF(read), 1, args TSRMLS_CC); - + if (retval) { if (Z_TYPE_P(retval) == IS_STRING) { *val = estrndup(Z_STRVAL_P(retval), Z_STRLEN_P(retval)); @@ -148,7 +144,6 @@ PS_READ_FUNC(user) ret = SUCCESS; } } - zval_ptr_dtor(&retval); } @@ -159,7 +154,7 @@ PS_WRITE_FUNC(user) { zval *args[2]; STDVARS; - + SESS_ZVAL_STRING((char*)key, args[0]); SESS_ZVAL_STRINGN((char*)val, vallen, args[1]); diff --git a/ext/session/php_session.h b/ext/session/php_session.h index 239c5ac6d9..a9c2e4c445 100644 --- a/ext/session/php_session.h +++ b/ext/session/php_session.h @@ -245,32 +245,37 @@ PHPAPI const ps_serializer *_php_find_ps_serializer(char *name TSRMLS_DC); /* (Possibly) needed for BC (e.g. by external modules using the session registry) */ #define PS_ENCODE_LOOP(code) do { \ - HashTable *_ht = Z_ARRVAL_P(PS(http_session_vars)); \ + HashTable *_ht = Z_ARRVAL_P(PS(http_session_vars)); \ + int key_type; \ \ - for (zend_hash_internal_pointer_reset(_ht); \ - zend_hash_get_current_key_ex(_ht, &key, &key_length, &num_key, 0, NULL) == HASH_KEY_IS_STRING; \ - zend_hash_move_forward(_ht)) { \ - key_length--; \ - if (php_get_session_var(key.s, key_length, &struc TSRMLS_CC) == SUCCESS) { \ + for (zend_hash_internal_pointer_reset(_ht); \ + (key_type = zend_hash_get_current_key_ex(_ht, &key, &key_length, &num_key, 0, NULL)) != HASH_KEY_NON_EXISTANT; \ + zend_hash_move_forward(_ht)) { \ + if (key_type == HASH_KEY_IS_LONG) { \ + php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Skipping numeric key %ld", num_key); \ + continue; \ + } \ + key_length--; \ + if (php_get_session_var(key, key_length, &struc TSRMLS_CC) == SUCCESS) { \ code; \ } \ } \ } while(0) -#define PS_UENCODE_LOOP(code) do { \ - int key_type; \ - HashTable *_ht = Z_ARRVAL_P(PS(http_session_vars)); \ - HashPosition _pos; \ +#define PS_UENCODE_LOOP(code) do { \ + HashTable *_ht = Z_ARRVAL_P(PS(http_session_vars)); \ + HashPosition _pos; \ + int key_type; \ \ - for (zend_hash_internal_pointer_reset_ex(_ht, &_pos); \ + for (zend_hash_internal_pointer_reset_ex(_ht, &_pos); \ (key_type = zend_hash_get_current_key_ex(_ht, &key, &key_length, &num_key, 0, &_pos)) != HASH_KEY_NON_EXISTANT; \ - zend_hash_move_forward_ex(_ht, &_pos)) { \ + zend_hash_move_forward_ex(_ht, &_pos)) { \ if (key_type != HASH_KEY_IS_STRING && key_type != HASH_KEY_IS_UNICODE) { break; } \ - key_length--; \ - struc = NULL; \ + key_length--; \ + struc = NULL; \ zend_hash_get_current_data_ex(_ht, (void**)&struc, &_pos); \ -\ - code; \ + \ + code; \ } \ } while(0) diff --git a/ext/session/session.c b/ext/session/session.c index d5e467ae43..cefe6342fa 100644 --- a/ext/session/session.c +++ b/ext/session/session.c @@ -137,8 +137,7 @@ PHPAPI void php_add_session_var(char *name, size_t namelen TSRMLS_DC) /* {{{ */ zval **sym_track = NULL; IF_SESSION_VARS() { - zend_rt_hash_find(Z_ARRVAL_P(PS(http_session_vars)), name, namelen + 1, - (void *) &sym_track); + zend_rt_hash_find(Z_ARRVAL_P(PS(http_session_vars)), name, namelen + 1, (void *) &sym_track); } else { return; } @@ -165,8 +164,7 @@ PHPAPI int php_get_session_var(char *name, size_t namelen, zval ***state_var TSR int ret = FAILURE; IF_SESSION_VARS() { - ret = zend_rt_hash_find(Z_ARRVAL_P(PS(http_session_vars)), name, - namelen+1, (void **) state_var); + ret = zend_rt_hash_find(Z_ARRVAL_P(PS(http_session_vars)), name, namelen + 1, (void **) state_var); } return ret; } @@ -203,7 +201,7 @@ static char *php_session_encode(int *newlen TSRMLS_DC) /* {{{ */ ret = NULL; } } else { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot encode non-existent session"); + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot encode non-existent session"); } return ret; } @@ -294,17 +292,15 @@ PHPAPI char *php_session_create_id(PS_CREATE_SID_ARGS) /* {{{ */ gettimeofday(&tv, NULL); - if (zend_ascii_hash_find(&EG(symbol_table), "_SERVER", - sizeof("_SERVER"), (void **) &array) == SUCCESS && + if (zend_ascii_hash_find(&EG(symbol_table), "_SERVER", sizeof("_SERVER"), (void **) &array) == SUCCESS && Z_TYPE_PP(array) == IS_ARRAY && - zend_ascii_hash_find(Z_ARRVAL_PP(array), "REMOTE_ADDR", - sizeof("REMOTE_ADDR"), (void **) &token) == SUCCESS) { + zend_ascii_hash_find(Z_ARRVAL_PP(array), "REMOTE_ADDR", sizeof("REMOTE_ADDR"), (void **) &token) == SUCCESS + ) { remote_addr = Z_STRVAL_PP(token); } /* maximum 15+19+19+10 bytes */ - spprintf(&buf, 0, "%.15s%ld%ld%0.8F", remote_addr ? remote_addr : "", - tv.tv_sec, (long int)tv.tv_usec, php_combined_lcg(TSRMLS_C) * 10); + spprintf(&buf, 0, "%.15s%ld%ld%0.8F", remote_addr ? remote_addr : "", tv.tv_sec, (long int)tv.tv_usec, php_combined_lcg(TSRMLS_C) * 10); switch (PS(hash_func)) { case PS_HASH_FUNC_MD5: @@ -443,8 +439,7 @@ new_session: /* Question: if you create a SID here, should you also try to read data? * I'm not sure, but while not doing so will remove one session operation * it could prove usefull for those sites which wish to have "default" - * session information - */ + * session information. */ php_session_track_init(TSRMLS_C); PS(invalid_session_id) = 0; if (PS(mod)->s_read(&PS(mod_data), PS(id), &val, &vallen TSRMLS_CC) == SUCCESS) { @@ -689,15 +684,11 @@ PHP_INI_BEGIN() STD_PHP_INI_ENTRY("session.hash_bits_per_character", "4", PHP_INI_ALL, OnUpdateLong, hash_bits_per_character, php_ps_globals, ps_globals) /* Upload progress */ - STD_PHP_INI_BOOLEAN("session.upload_progress.enabled", - "1", ZEND_INI_PERDIR, OnUpdateBool, rfc1867_enabled, php_ps_globals, ps_globals) - STD_PHP_INI_ENTRY("session.upload_progress.prefix", - "upload_progress_", ZEND_INI_PERDIR, OnUpdateUTF8String, rfc1867_prefix, php_ps_globals, ps_globals) - STD_PHP_INI_ENTRY("session.upload_progress.name", - "PHP_SESSION_UPLOAD_PROGRESS", ZEND_INI_PERDIR, OnUpdateUTF8String, rfc1867_name, php_ps_globals, ps_globals) - STD_PHP_INI_ENTRY("session.upload_progress.freq", "1%", ZEND_INI_PERDIR, OnUpdateRfc1867Freq, rfc1867_freq, php_ps_globals, ps_globals) - STD_PHP_INI_ENTRY("session.upload_progress.min_freq", - "0", ZEND_INI_PERDIR, OnUpdateReal, rfc1867_min_freq,php_ps_globals, ps_globals) + STD_PHP_INI_BOOLEAN("session.upload_progress.enabled", "1", ZEND_INI_PERDIR, OnUpdateBool, rfc1867_enabled, php_ps_globals, ps_globals) + STD_PHP_INI_ENTRY("session.upload_progress.prefix", "upload_progress_", ZEND_INI_PERDIR, OnUpdateUTF8String, rfc1867_prefix, php_ps_globals, ps_globals) + STD_PHP_INI_ENTRY("session.upload_progress.name", "PHP_SESSION_UPLOAD_PROGRESS", ZEND_INI_PERDIR, OnUpdateUTF8String, rfc1867_name, php_ps_globals, ps_globals) + STD_PHP_INI_ENTRY("session.upload_progress.freq", "1%", ZEND_INI_PERDIR, OnUpdateRfc1867Freq, rfc1867_freq, php_ps_globals, ps_globals) + STD_PHP_INI_ENTRY("session.upload_progress.min_freq", "0", ZEND_INI_PERDIR, OnUpdateReal, rfc1867_min_freq,php_ps_globals, ps_globals) /* Commented out until future discussion */ /* PHP_INI_ENTRY("session.encode_sources", "globals,track", PHP_INI_ALL, NULL) */ @@ -920,10 +911,7 @@ static ps_serializer ps_serializers[MAX_SERIALIZERS + 1] = { PS_SERIALIZER_ENTRY(php_binary) }; -PHPAPI int php_session_register_serializer( - const char *name, - int (*encode)(PS_SERIALIZER_ENCODE_ARGS), - int (*decode)(PS_SERIALIZER_DECODE_ARGS)) /* {{{ */ +PHPAPI int php_session_register_serializer(const char *name, int (*encode)(PS_SERIALIZER_ENCODE_ARGS), int (*decode)(PS_SERIALIZER_DECODE_ARGS)) /* {{{ */ { int ret = -1; int i; @@ -1008,9 +996,9 @@ static inline void strcpy_gmt(char *ubuf, time_t *when) /* {{{ */ } n = slprintf(buf, sizeof(buf), "%s, %02d %s %d %02d:%02d:%02d GMT", /* SAFE */ - week_days[tm.tm_wday], tm.tm_mday, - month_names[tm.tm_mon], tm.tm_year + 1900, - tm.tm_hour, tm.tm_min, + week_days[tm.tm_wday], tm.tm_mday, + month_names[tm.tm_mon], tm.tm_year + 1900, + tm.tm_hour, tm.tm_min, tm.tm_sec); memcpy(ubuf, buf, n); ubuf[n] = '\0'; @@ -1106,8 +1094,7 @@ static int php_session_cache_limiter(TSRMLS_D) /* {{{ */ int output_start_lineno = php_output_get_start_lineno(TSRMLS_C); if (output_start_filename) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot send session cache limiter - headers already sent (output started at %s:%d)", - output_start_filename, output_start_lineno); + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot send session cache limiter - headers already sent (output started at %s:%d)", output_start_filename, output_start_lineno); } else { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot send session cache limiter - headers already sent"); } @@ -1147,8 +1134,7 @@ static void php_session_send_cookie(TSRMLS_D) /* {{{ */ int output_start_lineno = php_output_get_start_lineno(TSRMLS_C); if (output_start_filename) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot send session cookie - headers already sent by (output started at %s:%d)", - output_start_filename, output_start_lineno); + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot send session cookie - headers already sent by (output started at %s:%d)", output_start_filename, output_start_lineno); } else { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot send session cookie - headers already sent"); } @@ -1318,17 +1304,14 @@ PHPAPI void php_session_start(TSRMLS_D) /* {{{ */ lensess = strlen(PS(session_name)); - /* - * Cookies are preferred, because initially - * cookie and get variables will be available. - */ + /* Cookies are preferred, because initially + * cookie and get variables will be available. */ if (!PS(id)) { - if (PS(use_cookies) && zend_ascii_hash_find(&EG(symbol_table), "_COOKIE", - sizeof("_COOKIE"), (void **) &data) == SUCCESS && + if (PS(use_cookies) && zend_ascii_hash_find(&EG(symbol_table), "_COOKIE", sizeof("_COOKIE"), (void **) &data) == SUCCESS && Z_TYPE_PP(data) == IS_ARRAY && - zend_ascii_hash_find(Z_ARRVAL_PP(data), PS(session_name), - lensess + 1, (void **) &ppid) == SUCCESS) { + zend_ascii_hash_find(Z_ARRVAL_PP(data), PS(session_name), lensess + 1, (void **) &ppid) == SUCCESS + ) { PPID2SID; PS(apply_trans_sid) = 0; PS(send_cookie) = 0; @@ -1336,36 +1319,34 @@ PHPAPI void php_session_start(TSRMLS_D) /* {{{ */ } if (!PS(use_only_cookies) && !PS(id) && - zend_ascii_hash_find(&EG(symbol_table), "_GET", - sizeof("_GET"), (void **) &data) == SUCCESS && + zend_ascii_hash_find(&EG(symbol_table), "_GET", sizeof("_GET"), (void **) &data) == SUCCESS && Z_TYPE_PP(data) == IS_ARRAY && - zend_rt_hash_find(Z_ARRVAL_PP(data), PS(session_name), - lensess + 1, (void **) &ppid) == SUCCESS) { + zend_rt_hash_find(Z_ARRVAL_PP(data), PS(session_name), lensess + 1, (void **) &ppid) == SUCCESS + ) { PPID2SID; PS(send_cookie) = 0; } if (!PS(use_only_cookies) && !PS(id) && - zend_ascii_hash_find(&EG(symbol_table), "_POST", - sizeof("_POST"), (void **) &data) == SUCCESS && + zend_ascii_hash_find(&EG(symbol_table), "_POST", sizeof("_POST"), (void **) &data) == SUCCESS && Z_TYPE_PP(data) == IS_ARRAY && - zend_rt_hash_find(Z_ARRVAL_PP(data), PS(session_name), - lensess + 1, (void **) &ppid) == SUCCESS) { + zend_rt_hash_find(Z_ARRVAL_PP(data), PS(session_name), lensess + 1, (void **) &ppid) == SUCCESS + ) { PPID2SID; PS(send_cookie) = 0; } } - /* check the REQUEST_URI symbol for a string of the form - '=' to allow URLs of the form - http://yoursite/=/script.php */ + /* Check the REQUEST_URI symbol for a string of the form + * '=' to allow URLs of the form + * http://yoursite/=/script.php */ if (!PS(use_only_cookies) && !PS(id) && PG(http_globals)[TRACK_VARS_SERVER] && - zend_ascii_hash_find(Z_ARRVAL_P(PG(http_globals)[TRACK_VARS_SERVER]), "REQUEST_URI", - sizeof("REQUEST_URI"), (void **) &data) == SUCCESS && + zend_ascii_hash_find(Z_ARRVAL_P(PG(http_globals)[TRACK_VARS_SERVER]), "REQUEST_URI", sizeof("REQUEST_URI"), (void **) &data) == SUCCESS && Z_TYPE_PP(data) == IS_STRING && (p = strstr(Z_STRVAL_PP(data), PS(session_name))) && - p[lensess] == '=') { + p[lensess] == '=' + ) { char *q; p += lensess + 1; @@ -1375,17 +1356,17 @@ PHPAPI void php_session_start(TSRMLS_D) /* {{{ */ } } - /* check whether the current request was referred to by - an external site which invalidates the previously found id */ + /* Check whether the current request was referred to by + * an external site which invalidates the previously found id. */ if (PS(id) && PS(extern_referer_chk)[0] != '\0' && PG(http_globals)[TRACK_VARS_SERVER] && - zend_hash_find(Z_ARRVAL_P(PG(http_globals)[TRACK_VARS_SERVER]), "HTTP_REFERER", - sizeof("HTTP_REFERER"), (void **) &data) == SUCCESS && + zend_hash_find(Z_ARRVAL_P(PG(http_globals)[TRACK_VARS_SERVER]), "HTTP_REFERER", sizeof("HTTP_REFERER"), (void **) &data) == SUCCESS && Z_TYPE_PP(data) == IS_STRING && Z_STRLEN_PP(data) != 0 && - strstr(Z_STRVAL_PP(data), PS(extern_referer_chk)) == NULL) { + strstr(Z_STRVAL_PP(data), PS(extern_referer_chk)) == NULL + ) { efree(PS(id)); PS(id) = NULL; PS(send_cookie) = 1; @@ -1452,18 +1433,19 @@ PHPAPI void session_adapt_url(const char *url, size_t urllen, char **new, size_t Set session cookie parameters */ static PHP_FUNCTION(session_set_cookie_params) { - /* lifetime is really a numeric, but the alter_ini_entry method wants a string */ - char *lifetime, *path = NULL, *domain = NULL; - int lifetime_len, path_len, domain_len, argc = ZEND_NUM_ARGS(); + zval **lifetime = NULL; + char *path = NULL, *domain = NULL; + int path_len, domain_len, argc = ZEND_NUM_ARGS(); zend_bool secure = 0, httponly = 0; if (!PS(use_cookies) || - zend_parse_parameters(argc TSRMLS_CC, "s|ssbb", &lifetime, &lifetime_len, &path, &path_len, - &domain, &domain_len, &secure, &httponly) == FAILURE) { + zend_parse_parameters(argc TSRMLS_CC, "Z|ssbb", &lifetime, &path, &path_len, &domain, &domain_len, &secure, &httponly) == FAILURE) { return; } - zend_alter_ini_entry("session.cookie_lifetime", sizeof("session.cookie_lifetime"), lifetime, lifetime_len, PHP_INI_USER, PHP_INI_STAGE_RUNTIME); + convert_to_string_ex(lifetime); + + zend_alter_ini_entry("session.cookie_lifetime", sizeof("session.cookie_lifetime"), Z_STRVAL_PP(lifetime), Z_STRLEN_PP(lifetime), PHP_INI_USER, PHP_INI_STAGE_RUNTIME); if (path) { zend_alter_ini_entry("session.cookie_path", sizeof("session.cookie_path"), path, path_len, PHP_INI_USER, PHP_INI_STAGE_RUNTIME); @@ -1482,7 +1464,7 @@ static PHP_FUNCTION(session_set_cookie_params) /* }}} */ /* {{{ proto array session_get_cookie_params(void) U - Return the session cookie parameters */ + Return the session cookie parameters */ static PHP_FUNCTION(session_get_cookie_params) { if (zend_parse_parameters_none() == FAILURE) { @@ -1730,18 +1712,18 @@ static PHP_FUNCTION(session_cache_limiter) Return the current cache expire. If new_cache_expire is given, the current cache_expire is replaced with new_cache_expire */ static PHP_FUNCTION(session_cache_expire) { - /* Expires is really a numeric, but the alter_ini_entry method wants a string */ - char *expires = NULL; - int expires_len; + zval **expires = NULL; + int argc = ZEND_NUM_ARGS(); - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s&", &expires, &expires_len, UG(utf8_conv)) == FAILURE) { + if (zend_parse_parameters(argc TSRMLS_CC, "|Z", &expires) == FAILURE) { return; } RETVAL_LONG(PS(cache_expire)); - if (expires) { - zend_alter_ini_entry("session.cache_expire", sizeof("session.cache_expire"), expires, expires_len, ZEND_INI_USER, ZEND_INI_STAGE_RUNTIME); + if (argc == 1) { + convert_to_string_ex(expires); + zend_alter_ini_entry("session.cache_expire", sizeof("session.cache_expire"), Z_STRVAL_PP(expires), Z_STRLEN_PP(expires), ZEND_INI_USER, ZEND_INI_STAGE_RUNTIME); } } /* }}} */ @@ -1934,7 +1916,7 @@ static const zend_function_entry session_functions[] = { PHP_FE(session_get_cookie_params, arginfo_session_void) PHP_FE(session_write_close, arginfo_session_void) PHP_FALIAS(session_commit, session_write_close, arginfo_session_void) - {NULL, NULL, NULL} + {NULL, NULL, NULL} }; /* }}} */ @@ -2115,9 +2097,9 @@ static inline void php_session_rfc1867_early_find_sid(php_session_rfc1867_progre if (PS(use_cookies)) { sapi_module.treat_data(PARSE_COOKIE, NULL, NULL TSRMLS_CC); - if (PG(http_globals)[TRACK_VARS_COOKIE] - && zend_u_hash_find(Z_ARRVAL_P(PG(http_globals)[TRACK_VARS_COOKIE]), Z_TYPE(progress->sname), Z_UNIVAL(progress->sname), Z_UNILEN(progress->sname)+1, (void **)&ppid) == SUCCESS) { - + if (PG(http_globals)[TRACK_VARS_COOKIE] && + zend_u_hash_find(Z_ARRVAL_P(PG(http_globals)[TRACK_VARS_COOKIE]), Z_TYPE(progress->sname), Z_UNIVAL(progress->sname), Z_UNILEN(progress->sname)+1, (void **)&ppid) == SUCCESS + ) { zval_dtor(&progress->sid); ZVAL_ZVAL(&progress->sid, *ppid, 1, 0); convert_to_string(&progress->sid); @@ -2129,9 +2111,9 @@ static inline void php_session_rfc1867_early_find_sid(php_session_rfc1867_progre return; } sapi_module.treat_data(PARSE_GET, NULL, NULL TSRMLS_CC); - if (PG(http_globals)[TRACK_VARS_GET] - && zend_u_hash_find(Z_ARRVAL_P(PG(http_globals)[TRACK_VARS_GET]), Z_TYPE(progress->sname), Z_UNIVAL(progress->sname), Z_UNILEN(progress->sname)+1, (void **)&ppid) == SUCCESS) { - + if (PG(http_globals)[TRACK_VARS_GET] && + zend_u_hash_find(Z_ARRVAL_P(PG(http_globals)[TRACK_VARS_GET]), Z_TYPE(progress->sname), Z_UNIVAL(progress->sname), Z_UNILEN(progress->sname)+1, (void **)&ppid) == SUCCESS + ) { zval_dtor(&progress->sid); ZVAL_ZVAL(&progress->sid, *ppid, 1, 0); convert_to_string(&progress->sid); @@ -2218,7 +2200,7 @@ static int php_session_rfc1867_callback(unsigned int event, void *event_data, vo multipart_event_formdata *data = (multipart_event_formdata *) event_data; size_t name_len, value_len; zstr str; - + /* orig callback may have modified *data->newlength */ if (data->newlength) { value_len = *data->newlength; @@ -2253,15 +2235,14 @@ static int php_session_rfc1867_callback(unsigned int event, void *event_data, vo case MULTIPART_EVENT_FILE_START: { multipart_event_file_start *data = (multipart_event_file_start *) event_data; - /* Do nothing when $_POST[session.upload_progress.name] is not set + /* Do nothing when $_POST[session.upload_progress.name] is not set * or when no session id was sent */ if (!Z_TYPE(progress->sid) || !Z_TYPE(progress->key)) { break; } - + /* First FILE_START event, initializing */ if (!progress->data) { - php_rinit_session(0 TSRMLS_CC); PS(id) = estrndup(Z_STRVAL(progress->sid), Z_STRLEN(progress->sid)); PS(apply_trans_sid) = progress->apply_trans_sid; @@ -2307,7 +2288,7 @@ static int php_session_rfc1867_callback(unsigned int event, void *event_data, vo add_ascii_assoc_zval_ex(progress->current_file, "bytes_processed", sizeof("bytes_processed"), progress->current_file_bytes_processed); add_next_index_zval(progress->files, progress->current_file); - + Z_LVAL_P(progress->post_bytes_processed) = data->post_bytes_processed; php_session_rfc1867_update(progress, 0 TSRMLS_CC); @@ -2319,7 +2300,7 @@ static int php_session_rfc1867_callback(unsigned int event, void *event_data, vo if (!Z_TYPE(progress->sid) || !Z_TYPE(progress->key)) { break; } - + Z_LVAL_P(progress->current_file_bytes_processed) = data->offset + data->length; Z_LVAL_P(progress->post_bytes_processed) = data->post_bytes_processed; @@ -2332,7 +2313,7 @@ static int php_session_rfc1867_callback(unsigned int event, void *event_data, vo if (!Z_TYPE(progress->sid) || !Z_TYPE(progress->key)) { break; } - + if (data->temp_filename.v) { add_ascii_assoc_text_ex(progress->current_file, "tmp_name", sizeof("tmp_name"), data->temp_filename, 1); }